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_ENABLE
- PHSDIR:决定相位移动方向(超前或滞后)
- 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()函数即可。