DSP28335移相PWM模块在DAB变换器中的实战配置

张开发
2026/5/4 18:13:36 15 分钟阅读
DSP28335移相PWM模块在DAB变换器中的实战配置
1. 初识DSP28335移相PWM与DAB变换器第一次接触DSP28335的移相PWM功能时我正为一个新能源项目开发双有源桥(DAB)DC-DC变换器。这种拓扑结构在电动汽车充电桩、储能系统里特别常见核心需求就是要实现高频隔离和功率双向流动。当时最大的挑战就是如何让多个PWM通道产生精确的相位差——这正是移相PWM的用武之地。DSP28335的EPWM模块有个很巧妙的设计它允许以某个模块比如EPWM1为基准其他模块通过相位寄存器与之保持固定偏移。这就好比乐队指挥EPWM1打拍子其他乐手EPWM2/3按照乐谱要求延迟或提前若干拍进入。在DAB中这种相位差直接决定了原副边H桥的开关时序影响着软开关效果和功率传输方向。2. 硬件连接与基础配置2.1 硬件拓扑对接实际项目中我通常这样规划硬件资源EPWM1A/B驱动原边H桥的上/下管EPWM3A/B驱动副边H桥的上/下管两个H桥之间通过高频变压器耦合特别注意死区时间的设置我吃过亏——有次没配置死区导致直通炸管。后来都养成习惯在DBCTL寄存器里先配置好死区时间EPwm3Regs.DBCTL.bit.OUT_MODE DB_FULL_ENABLE; EPwm3Regs.DBRED EPWM_DeadBandTime; // 上升沿延迟 EPwm3Regs.DBFED EPWM_DeadBandTime; // 下降沿延迟2.2 时钟与计数模式计数模式选择很有讲究。DAB需要对称的PWM波形所以必须用上下计数模式TB_COUNT_UPDOWN。时钟分频根据开关频率来定比如我的150kHz系统这样配置EPwm3Regs.TBCTL.bit.CTRMODE TB_COUNT_UPDOWN; EPwm3Regs.TBCTL.bit.HSPCLKDIV TB_DIV2; // 高速时钟预分频 EPwm3Regs.TBCTL.bit.CLKDIV TB_DIV1; // 时钟分频 EPwm3Regs.TBPRD SYSTEM_FREQ / (2*SWITCHING_FREQ); // 周期值计算3. 移相功能核心配置3.1 相位使能与同步移相功能的灵魂在于三个寄存器PHSEN就像总开关必须设为TB_ENABLEPHSDIR决定相位移动方向超前或滞后TBPHS具体相位偏移量这是我的典型配置EPwm3Regs.TBCTL.bit.PHSEN TB_ENABLE; // 开启移相功能 EPwm3Regs.TBCTL.bit.PHSDIR TB_UP; // 相位滞后方向 EPwm3Regs.TBPHS.half.TBPHS phase_shift_value; // 具体偏移值3.2 相位值计算技巧相位偏移量不是随便填的要根据开关周期换算。比如需要90度移相// 90度对应1/4周期 uint16_t phase_shift_value EPwm3Regs.TBPRD / 4;实测中发现当采用上下计数模式时实际相位差是设定值的两倍。这个坑我踩过后来用示波器抓波形才恍然大悟——因为计数器先上后下完整周期其实是两倍计数。4. 完整配置流程与调试4.1 配置步骤清单基础参数初始化设置TBPRD确定开关频率配置计数模式为TB_COUNT_UPDOWN设置时钟分频移相功能激活使能PHSEN设置PHSDIR方向写入TBPHS偏移值死区与输出配置配置DBCTL死区参数设置AQCTLA/B动作限定同步触发执行SWFSYNC软件同步用示波器验证相位差4.2 调试常见问题有一次调试验证时发现副边PWM完全没有输出。查了三小时才发现是同步信号没配置EPwm3Regs.TBCTL.bit.SYNCOSEL TB_CTR_ZERO; // 同步源选择 EPwm3Regs.TBCTL.bit.SWFSYNC 1; // 强制同步还有个容易忽略的点是影子寄存器加载时机。我现在的标准做法是EPwm3Regs.TBCTL.bit.PRDLD TB_SHADOW; // 周期使用影子寄存器 EPwm3Regs.CMPCTL.bit.SHDWAMODE CC_SHADOW; // CMPA影子模式5. 实战中的进阶技巧5.1 动态调整相位差DAB运行时经常需要动态调节相位差来改变功率流向。直接修改TBPHS会带来抖动我的解决方案是EPwm3Regs.TBPHS.half.TBPHS new_phase; // 先写入新值 EPwm3Regs.TBCTL.bit.SWFSYNC 1; // 再触发同步配合PI控制器使用效果很好实测相位调整响应时间在5个开关周期内。5.2 多模块协同工作当需要控制多个DAB模块时建议所有模块共用EPWM1作为基准为每个从模块设置不同的TBPHS值使用SYNCIN同步所有模块例如给EPWM3和EPWM5配置90度间隔// EPWM3配置 EPwm3Regs.TBPHS.half.TBPHS EPwm1Regs.TBPRD/4; // EPWM5配置 EPwm5Regs.TBPHS.half.TBPHS EPwm1Regs.TBPRD/2;6. 代码架构建议经过多个项目迭代我总结出这样的代码结构void EPWM_Init() { // 基础时钟和计数模式配置 ConfigTimeBase(); // 移相功能专项配置 ConfigPhaseShift(); // 死区和输出极性设置 ConfigDeadBand(); // 动作限定器配置 ConfigActionQualifier(); } void ConfigPhaseShift() { // 详细寄存器配置见前文 ... }把不同功能拆分成独立函数后期维护时会轻松很多。特别是当需要支持多种移相角度时只需修改ConfigPhaseShift()函数即可。

更多文章