ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

基于DSP28335的数字电源设计:从buck变换器到闭环控制实践

2026/9/13 12:23:08 拓冰建站 浏览量
基于DSP28335的数字电源设计:从buck变换器到闭环控制实践 简介一套基于DSP28335的数字电源设计资源面向电力电子、嵌入式控制方向的工程师与参赛学生重点解决Buck Boost变换器结合PID闭环控制的实现与调试问题。压缩包共108个文件大小369KB以C语言源码、头文件、ASM启动文件为主同时包含CCS工程配置、链接命令、编译输出等便于直接导入开发环境分析运行。内容覆盖DSP2833x外设驱动、EPwm模块配置、ADC采样和PID控制算法PID_Control相关代码可帮助理解比例、积分、微分环节如何生成PWM占空比并结合系统特性进行参数整定。对于准备类似国赛A题数字电源任务的学习者这套工程提供了从底层初始化到控制策略落地的完整参考。已有725人浏览学习适合希望深入数字电源设计并进行实战验证的读者。1. 基于 DSP28335 的数字电源先弄清它比模拟电源强在哪把一个 24V 输入、12V 输出的 buck 样机上的模拟误差放大器拆掉换成 DSP28335 的 ePWM 输出直接驱动栅极驱动芯片这就是基于 DSP28335 的数字电源最典型的形态。数字电源的本质是把电压电流反馈补偿从 RC 网络搬进处理器ADC 采样、软件算 PID、PWM 更新占空比三者构成采样-计算-更新的实时闭环。相比模拟方案环路参数能在线改还能叠加软启动、逐周期限流和故障锁存。选 DSP28335 而不是普通 MCU关键在 150MHz FPU、PWM 硬件触发 ADC、以及 HRPWM 微边沿定位这三样。适合电源模块、车载 DC-DC 方向的硬件与嵌入式工程师新手建议先跑通 buck再扩展四开关 buck-boost。2. 控制环选型逻辑为什么是 DSP28335 而不是普通 MCU2.1 数字控制环的基本构成采样-计算-更新一个周期必须跑完数字电源的环路围绕三个动作循环ADC 采样输出电压和电感电流处理器按控制算法计算新的占空比PWM 模块在周期边界装载新值。这三个动作必须在同一个开关周期内完成才能保住相位裕度。以 100kHz 开关频率为例一个周期只有 10µs留给算法计算的时间通常只有 2~4µs。如果一次 PID 计算要跑 10µs环路带宽就无从谈起这也是选型时先看主频和是否有硬件乘法器/浮点单元的原因。采样时刻同样关键。开关管导通和关断瞬间功率级会出现剧烈的电压电流跳变采样点一旦落在跳变沿上ADC 结果会带大量开关噪声。常见做法是把 ADC 触发同步到 PWM 计数器的零点或峰值也就是电感电流纹波的谷点或平均点附近。这样采到的值更接近真实平均值PID 的微分项也不会被噪声放大到失控。这一节想说明的是数字电源的难点不在算法本身而在时序。DSP28335 这类实时控制处理器把 PWM 和 ADC 的同步做成了硬件行为而不是靠软件查询或定时器对齐这是它与通用 MCU 拉开差距的第一道分水岭。2.2 TMS320F28335 的关键资源对比150MHz FPU、12 位 ADC、ePWM 与 HRPWMTMS320F28335 是 C2000 系列里的经典型号32 位 C28x 内核主频 150MHz带浮点运算单元。对数字电源来说浮点 PID 意味着不需要做定点定标代码可读性和调试效率都高很多。下面把 F28335 和常见 ARM MCU 做一个直接对比对比项TMS320F28335普通 ARM MCU对数字电源的影响主频与运算150MHzC28x FPU72~480MHzCortex-M 系列浮点 PID 直接跑中断延迟固定事件管理器6 组 ePWM寄存器级同步定时器/PWM 外设多路交错并联时同步成本低占空比分辨率16 位计数器HRPWM 约 150ps多为 16 位无微边沿定位高频或大降压比时步进更细ADC 触发ePWM 事件直接触发 SOC多靠定时器或软件触发采样点与开关周期硬件对齐死区与 Trip Zone片上死区寄存器、TZ 硬件封锁部分有保护路径较浅互补输出和硬件保护电路简单基于 STM32 的四开关 buck-boost 双向升降压数字电源方案我也接触过一些它们的强项是状态机切换、通信协议和库函数的完备程度。但细看控制代码会发现环路计算要么被压得很保守要么采样时刻靠 DMA 和中断嵌套来凑相位抖动比 C2000 大。不是说做不了而是同样的性能指标在 DSP28335 上时序更容易算清楚调试周期短这在实际项目里往往是决定性的。2.3 数字化代价量化误差、零阶保持滞后与占空比更新时机数字化第一个代价是量化。12 位 ADC 在 3.3V 量程上每一步约 0.8mV12V 输出经 4:1 分压后量化误差折算回输出端约 3~4mV。这个量级对常见的电源纹波指标10~50mV是可接受的但如果直接把原始采样值送进 PID量化噪声会被微分项放大表现为占空比高频抖动。第二个代价是零阶保持器效应。PWM 在一个周期内保持占空比不变相当于控制环路里多了一段平均约半个开关周期的纯滞后信号。100kHz 开关频率对应约 5µs 等效滞后环路穿越频率一般只能做到开关频率的 1/10 到 1/20也就是 5~10kHz。设计之前先用这个经验值估算动态响应能不能达标比先画板再调环路靠谱得多。第三个是占空比更新时机。ePWM 的影子寄存器支持在计数器归零或计数到周期值时装载新值推荐配置为周期起点装载。这样新占空比从下一周期开始生效不会出现同一周期内脉冲宽度不一致的乱状。后面第 4 章的代码里TBCTL 的配置就是按这个思路写的。3. DSP28335 数字电源硬件侧落地buck 功率级、采样调理与保护3.1 以 buck 为例的功率级参数计算电感、电容与 MOSFET 选型先定规格再算器件。以 24V 输入、12V 输出、4A 满载、100kHz 开关频率为例稳态占空比约 0.5。电感按电流纹波设计纹波取满载电流的 20%即 ΔI_L 0.8AL (Vin - Vout) × D / (ΔI_L × fsw)代入计算L (24-12) × 0.5 / (0.8 × 100000) 75µH取标称 68µH 或 82µH 均可。电感取小动态响应快但纹波大取大则相反这个取舍要看负载对瞬态的要求。输出电容由纹波电压决定C ΔI_L / (8 × fsw × ΔVout)设纹波电压 30mVC 0.8 / (8 × 100000 × 0.03) ≈ 33µF。实际还要叠加电容 ESR 的影响工程上并两个 22µF 陶瓷电容留出裕量。MOSFET 的耐压按输入电压的 1.5~2 倍选24V 输入选 60V 档电流按满载电流的 2 倍峰值选4A 满载用 10A 以上的管子。Rds(on) 和栅极电荷 Qg 的取舍在 100kHz 下要留意Qg 过大会让驱动电路发热明显。3.2 电压采样与电感电流采样电路分压、滤波与 ADC 接口输出电压通过电阻分压降到 ADC 量程内。分压网络有两个约束静态电流取 0.3~1mA远小于负载电流分压比保证最高输出电压折算后不超过 3.3V。12V 输出可以用 30kΩ 和 10kΩ 分压得到约 3V静态电流 0.3mAADC 量程利用率约 90%。分压后加一个 RC 低通1kΩ 配 1nF 是常用起点时间常数 1µs对开关频率以上的高频分量有衰减对环路中频段影响不大。这里提示一句运放输出和 ADC 引脚之间串一个 100Ω 左右的电阻配合 ADC 内部的采样电容能明显减少采样抖动这颗电阻也提供了一定程度的过压保护。电流采样两个方向低边采样电阻成本低采样电阻放 MOSFET 源极和地之间用差分运放放大后送 ADC。以 10mΩ 采样电阻、满载 4A 计算压降 40mV放大 50 倍到 2V量程利用合理。要做峰值限流或者电流内环则用电流互感器或霍尔传感器采真实电感电流波形更完整代价是电路复杂度上升。注意采样电路的地线处理决定环路成败。模拟地 AGND 与数字地 DGND 之间用磁珠或 0Ω 电阻单点相连运放地和 ADC 参考地尽量靠近 DSP 的模拟电源引脚换一块板子就变调的环路参数八成是地回路出了问题。3.3 保护回路与 TZ trip 硬件互锁过流保护不能只靠 DSP 中断。比较器硬件关断的速度是纳秒到微秒级中断软件响应是微秒到十几微秒级这个差距在短路故障时是致命的。常见做法是电流采样信号进滞回比较器比较器输出同时接栅极驱动芯片的使能脚和 DSP 的 TZ1 引脚实现双保险。DSP28335 的 ePWM 模块带有 Trip Zone 功能TZ 引脚被拉低时 PWM 输出在下个时钟沿被强制到安全电平完全不需要软件参与。配置代码很短// TZ1 配置外部过流信号拉低 TZ1 时PWM 立即输出安全电平 EPwm1Regs.TZSEL.bit.OSH1 1; // 使能 TZ1one-shot 模式锁存后需软件清除 EPwm1Regs.TZCTL.bit.TZA 1; // TZ 事件时 ePWM1A 强制输出低电平 EPwm1Regs.TZCTL.bit.TZB 1; // ePWM1B 同样强制低电平 EPwm1Regs.TZEINT.bit.OST 1; // 使能 one-shot 事件中断进入故障记录OSH1 选的是一次性锁存模式触发后输出保持低电平直到软件确认故障并写 TZCLR 寄存器的 OST 位清除。这样能防止故障抖动导致 PWM 反复重新启动。GPIO 的 TZ 输入默认是异步检测外部比较器输出的窄毛刺也能被捕获。实际项目里我一般把 TZ1 接过流、TZ2 接过温中断里只做故障记录和状态上报不承担保护任务职责分离之后调试故障逻辑会轻松很多。4. DSP28335 软件闭环ePWM 死区、ADC 同步触发与增量式 PID 实现4.1 初始化 ePWM100kHz 开关频率、互补输出与死区以 ePWM1 为例TBCLK 直接取系统时钟 150MHz向上计数模式TBPRD 设为 1499 得到 100kHz初始占空比 50% 对应 CMPA 为 750。互补输出由死区模块生成上升沿和下降沿延迟各 15 个 TBCLK即 100ns 死区时间。// ePWM1 初始化100kHz 开关频率A/B 互补输出带死区 void InitEPwm1(void) { EALLOW; // 时基TBCLK 系统时钟 150MHz EPwm1Regs.TBCTL.bit.CLKDIV 0; // 系统时钟不分频 EPwm1Regs.TBCTL.bit.HSPCLKDIV 0; // 高速预分频也不分频 EPwm1Regs.TBCTL.bit.CTRMODE 0; // 向上计数模式 // 频率与占空比fsw TBCLK / (TBPRD1) EPwm1Regs.TBPRD 1499; // 150MHz / 1500 100kHz EPwm1Regs.CMPA.bit.CMPA 750; // 初始 50%之后由 PID 改写 // 动作限定计数到 0 置高向上计数匹配 CMPA 时拉低 EPwm1Regs.AQCTLA.bit.ZRO 2; // ZRO 事件输出置 1 EPwm1Regs.AQCTLA.bit.CAU 1; // CMPA 匹配输出清 0 // 死区A 直接输出B 取反形成互补带死区 EPwm1Regs.DBCTL.bit.IN_MODE 0; // 死区输入来自动作限定器后的 A 信号 EPwm1Regs.DBCTL.bit.OUT_MODE 3; // ePWM1A/B 都经过死区模块 EPwm1Regs.DBCTL.bit.POLSEL 2; // B 通道反相得到互补波形 EPwm1Regs.DBFED 15; // 下降沿延迟 100ns EPwm1Regs.DBRED 15; // 上升沿延迟 100ns // ADC 触发计数器归零开关周期起点时触发 SEQ1 EPwm1Regs.ETSEL.bit.SOCAEN 1; // 使能 SOCA 输出 EPwm1Regs.ETSEL.bit.SOCASEL 1; // TBCTR 0 时触发 EPwm1Regs.ETPS.bit.SOCAPRD 1; // 每个周期触发一次 EDIS; }CLKDIV 和 HSPCLKDIV 都置 0TBCLK 就等于系统时钟这时 TBPRD 直接决定开关频率。150MHz 除以 1500 得到 100kHz这是向上计数模式的算法别和增减计数模式混淆后者频率公式是 TBCLK / (2 × TBPRD)。死区数值必须以 TBCLK 周期为单位换算100ns 对应 15 个周期如果换成 200kHz 开关频率这个值要重新算。GPIO0 和 GPIO1 默认映射到 ePWM1A/B不需要单独配置引脚复用之前改过的话恢复默认即可。4.2 配置 ADCePWM 触发、双通道同步采样与中断使能F28335 的 ADC 是 12 位逐次逼近型最高转换速度约 12.5MSPS带两个采样保持器。配置为双采样保持模式后两个通道可以同一时刻采样这对需要同时抓输出电压和电感电流的双环控制很有价值。// ADC 初始化ePWM1 的 SOCA 触发 SEQ1双通道同步转换 void InitAdc(void) { EALLOW; AdcRegs.ADCTRL1.bit.ACQ_PS 7; // 采样窗口 8 个 ADC 时钟 AdcRegs.ADCTRL1.bit.SEQ_CASC 0; // 双排序器模式SEQ1 独立工作 AdcRegs.ADCTRL3.bit.ADCCLKPS 6; // ADC 时钟 150MHz / 12 12.5MHz AdcRegs.ADCTRL3.bit.SMODE_SEL 1; // 双采样保持两路同一时刻采样 AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 1; // SEQ1 启动信号来自 ePWM1 SOCA AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 1; // SEQ1 转换结束产生 ADCINT1 // 转换序列CONV00 对应 A0输出电压CONV01 对应 A1电感电流 AdcRegs.ADCCHSELSEQ1.bit.CONV00 0; AdcRegs.ADCCHSELSEQ1.bit.CONV01 1; AdcRegs.ADCTRL2.bit.RST_SEQ1 1; // 复位排序器从 CONV00 重新开始 EDIS; }EPWM_SOCA_SEQ1 这一位把 ADC 转换和 PWM 计数器绑在一起采样不再由软件触发中断里读到的结果天然处于载波的固定相位。ACQ_PS 7 对应 8 个 ADC 时钟的采样窗口输入源阻抗高时把这个值调大可改善精度但会拖慢整条转换序列。双通道连续转换时第二个通道比第一个通道晚数个 ADC 时钟对 100kHz 的电流环可以忽略真要精确要用双采样保持模式也就是 SMODE_SEL 1 那一位的作用。主程序里还要开中断ADCINT1 对应 PIE 组 1 的 INTx6需要设置 PieCtrlRegs.PIEIER1.bit.INTx6 1再置位 IER | M_INT1 并开全局中断 EINT。忘了这一步序列转换完成永远进不了 ISR环路自然跑不起来。4.3 数字 PID 中断服务程序增量式写法与占空比更新控制算法放在 ADC 中断里执行。用增量式 PID 而不是位置式原因是输出的是占空比增量限幅只需要钳位绝对占空比积分饱和处理直观很多。// 电压单环 PID增量式每个开关周期100kHz执行一次 #define KP 0.12f #define KI 0.02f #define KD 0.03f #define V_REF 12.0f // 目标输出电压 #define MAX_DUTY 1450 // 占空比上限保留最小脉宽 #define MIN_DUTY 50 // 占空比下限 static float err1 0.0f, err2 0.0f; static float duty_f 750.0f; __interrupt void AdcSeq1Isr(void) { // 读取输出电压ADCRESULT0 左对齐右移 4 位还原 12 位数据 float v_meas (AdcRegs.ADCRESULT0 4) * 3.3f / 4096.0f; v_meas v_meas * (30.0f / 10.0f); // 折算回分压前的实际电压 float err V_REF - v_meas; // 增量式 PIDdelta 是占空比的增量 float delta KP * (err - err1) KI * err KD * (err - 2.0f * err1 err2); err2 err1; err1 err; duty_f delta; if (duty_f MAX_DUTY) duty_f MAX_DUTY; if (duty_f MIN_DUTY) duty_f MIN_DUTY; EPwm1Regs.CMPA.bit.CMPA (Uint16)duty_f; // 更新占空比 AdcRegs.ADCTRL2.bit.RST_SEQ1 1; // 复位序列为下周期做准备 PieCtrlRegs.PIEACK.all PIEACK_GROUP1; // 应答 PIE 组 1 中断 }F28335 的 ADC 结果寄存器是左对齐的12 位有效数据在高位所以先右移 4 位再换算电压。Kd 项对误差的一阶差分求值采样噪声大时这一项会持续输出抖动实际调参往往把 Kd 压得很小甚至置零优先靠 Kp 和 Ki 撑性能。限幅只限了占空比绝对值严格的意义上还要在累加 delta 之前做方向判断防止积分继续往饱和区推这一点在下面验证章节会给方案。PID 参数调大后的效果调过头的表现Kp响应变快带宽提高振铃、持续振荡Ki静差消除变快超调变大低频抖动Kd阻尼变强超调减小量化噪声被放大占空比毛糙5. 用阶跃响应和临界比例法验证 DSP28335 数字电源环路顺手做软启动5.1 两个直接落地的环路验证方法先把 Kd 置零Kp 从 0.02 开始逐步加大每改一次用软件给 V_REF 加一个阶跃比如用定时器每隔 200ms 把 V_REF 从 12V 切到 13V示波器接输出端观察波形。系统出现等幅振荡时的 Kp 就是临界增益 Ku这时的振荡周期 Tu 对应穿越频率的倒数按 Ziegler-Nichols 整定表就能推出 Kp 和 Ki 的初值比盲调快得多。看波形时抓住两个特征恢复时间长说明带宽不够阶跃后有一到两拍明显振铃说明相位裕度不足。如果出现持续振荡先别急着降 Kp检查采样点是不是落在了开关跳变沿上把 SOCASEL 从计数器归零触发改成计数器峰值触发再试往往更见效。5.2 软启动与抗积分饱和一次性处理掉上电瞬间输出电压为零误差接近 12V普通 PID 会立刻把占空比推到上限输出必然过冲。常见做法是给 V_REF 加斜坡中断里每个周期给 V_REF 增加 5mV大约 24ms 从零升到 12V同时把占空比上限从 MIN_DUTY 开始每周递增双限幅下启动过程基本无过冲。抗积分饱和则在累加 delta 前判断方向占空比已经到上限且 delta 为正时这一拍不累加。验证时看示波器上电波形输出电压应单调上升无 overshoot满载跳变时恢复时间应小于 1ms且不超过两拍振荡。这两个动作做完剩下的就是按实测波形回头修整 RC 采样滤波和 PID 参数这两个旋钮整套基于 DSP28335 的数字电源闭环就稳定了。本文还有配套的精品资源点击获取