深入理解DSP28335的PWM模块:如何用EPWM实现三相电机控制(附代码分析)

张开发
2026/4/21 8:03:21 15 分钟阅读

分享文章

深入理解DSP28335的PWM模块:如何用EPWM实现三相电机控制(附代码分析)
DSP28335 EPWM模块实战三相电机SPWM控制全解析在工业驱动和电力电子领域精确的PWM信号生成是电机控制的核心技术。TI的DSP28335凭借其增强型PWMEPWM模块为三相逆变器控制提供了硬件级的解决方案。本文将带您深入EPWM的寄存器级配置实现带死区的三相SPWM信号生成并分享实际项目中的调试经验。1. EPWM模块架构与三相控制原理DSP28335的每个EPWM模块都是独立且可同步的硬件单元包含时基(TB)、计数比较(CC)、动作限定(AQ)和死区(DB)四个关键子模块。对于三相六开关逆变桥我们需要配置三对EPWM模块通常使用EPWM1/2/3分别控制上下桥臂。三相SPWM的关键参数关系// 基础参数计算公式 PWM频率 SYSCLKOUT / (HSPCLKDIV * CLKDIV * TBPRD) 死区时间(ns) (DBRED或DBFED值) * TBCLK周期 相位差 (TBPHS/TBPRD) * 360°时基模块的同步机制是三相控制的核心。通过将EPWM1设为同步主模块EPWM2/3设为从模块可实现严格的120°相位差SYSCLKOUT | v EPWM1(TBCTR) --SYNCOUT-- EPWM2(TBPHSTBPRD/3) | v EPWM3(TBPHS2*TBPRD/3)实际项目中我们常用载波频率10-20kHz死区时间通常设置为500ns-1μs根据IGBT/MOSFET规格调整。过小的死区会导致桥臂直通过大会增加波形失真。2. 寄存器配置实战从零搭建三相SPWM2.1 时基模块初始化时基模块决定PWM的频率和相位关系。以下是关键寄存器配置示例// EPWM1主模块配置A相 EPwm1Regs.TBCTL.bit.CTRMODE TB_COUNT_UP_DOWN; // 中央对齐模式 EPwm1Regs.TBCTL.bit.PHSEN TB_DISABLE; // 主模块禁用相位加载 EPwm1Regs.TBPRD SYSTEM_CLOCK/(2*PWM_FREQ); // 计算周期值 EPwm1Regs.TBCTL.bit.SYNCOSEL TB_CTR_ZERO; // 在计数器为零时产生同步信号 // EPWM2从模块配置B相 EPwm2Regs.TBCTL.bit.PHSEN TB_ENABLE; // 启用相位加载 EPwm2Regs.TBPHS EPwm1Regs.TBPRD/3; // 120°相位偏移 EPwm2Regs.TBCTL.bit.SYNCOSEL TB_SYNC_IN; // 接收外部同步 // EPWM3从模块配置C相 EPwm3Regs.TBCTL.bit.PHSEN TB_ENABLE; EPwm3Regs.TBPHS 2*EPwm1Regs.TBPRD/3; // 240°相位偏移 EPwm3Regs.TBCTL.bit.SYNCOSEL TB_SYNC_IN;注意所有EPWM模块的CLKDIV和HSPCLKDIV分频系数必须相同否则会导致相位关系错乱。2.2 比较模块与动作限定配置比较模块产生调制波与载波的比较事件动作限定模块定义事件对应的输出行为// 通用CMPA配置以EPWM1为例 EPwm1Regs.CMPCTL.bit.SHDWAMODE CC_SHADOW; // 启用影子寄存器 EPwm1Regs.CMPCTL.bit.LOADAMODE CC_CTR_ZERO; // 在CTR0时加载 EPwm1Regs.CMPA calcSPWMDuty(phaseAngle); // 计算占空比 // 动作限定配置中央对齐模式典型设置 EPwm1Regs.AQCTLA.bit.CAU AQ_CLEAR; // 向上计数到CMPA时清零 EPwm1Regs.AQCTLA.bit.CAD AQ_SET; // 向下计数到CMPA时置位SPWM的调制比通过动态更新CMPA实现。实际工程中通常会构建正弦表通过查表法更新比较值uint16_t sinTable[360]; // 预计算的正弦表 void updateSPWM(float angle) { uint16_t index (uint16_t)angle % 360; EPwm1Regs.CMPA sinTable[index] * modulationIndex; EPwm2Regs.CMPA sinTable[(index120)%360] * modulationIndex; EPwm3Regs.CMPA sinTable[(index240)%360] * modulationIndex; }2.3 死区时间精细调节死区模块的配置直接影响系统可靠性关键参数包括参数寄存器位域典型值说明上升沿延迟DBRED根据器件调整单位TBCLK周期下降沿延迟DBFED根据器件调整单位TBCLK周期极性选择DBCTL[POLSEL]DB_ACTV_HIC高边互补模式输入模式DBCTL[IN_MODE]DBA_ALL两路PWM均参与死区生成配置示例EPwm1Regs.DBCTL.bit.OUT_MODE DB_FULL_ENABLE; // 完全使能死区 EPwm1Regs.DBCTL.bit.POLSEL DB_ACTV_HIC; // 高边互补输出 EPwm1Regs.DBRED DEADTIME_NS / TBCLK_NS; // 计算上升沿延迟 EPwm1Regs.DBFED DEADTIME_NS / TBCLK_NS; // 计算下降沿延迟3. 高级技巧与故障排查3.1 影子寄存器的安全使用影子寄存器机制可防止PWM参数更新时的毛刺但使用不当会导致同步问题。推荐的最佳实践统一加载时机所有EPWM模块应设置为相同的加载触发点通常为CTR0批量更新策略EALLOW; EPwm1Regs.CMPA newValue1; // 先写入影子寄存器 EPwm2Regs.CMPA newValue2; EPwm3Regs.CMPA newValue3; EDIS; // 值会在下一个CTR0时同时生效避免频繁更新在中断服务程序中更新而非主循环3.2 同步丢失的应急处理当检测到同步异常通过EPWMx_TBCTR值不同步判断应执行软同步void forceEPWMSync(void) { EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC 0; // 暂停所有时基时钟 EPwm1Regs.TBCTR 0; // 复位主计数器 EPwm2Regs.TBCTR 0; EPwm3Regs.TBCTR 0; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC 1; // 重新同步启动 EDIS; }3.3 示波器调试技巧同步信号监测将EPWM1的SYNCOUT信号引出作为触发源死区验证测量同一桥臂的上下管驱动信号确保死区时间内两信号均为低电平相位关系检查使用XY模式观察两相PWM120°相位差应呈现完美六边形图案4. 性能优化与扩展应用4.1 最小化中断延迟通过合理配置事件触发中断ETSEL可将计算负载均匀分布// 三相交错触发中断 EPwm1Regs.ETSEL.bit.INTSEL ET_CTR_ZERO; // A相在周期开始触发 EPwm2Regs.ETSEL.bit.INTSEL ET_CTR_PRD; // B相在周期中点触发 EPwm3Regs.ETSEL.bit.INTSEL ET_CTR_ZERO; // C相同A相4.2 空间矢量调制(SVPWM)实现在SPWM基础上通过修改比较值计算方式可实现更高效的SVPWMvoid updateSVPWM(float Ualpha, float Ubeta) { // 扇区判断与作用时间计算 // ...省略矢量变换代码... // 设置比较值七段式实现 EPwm1Regs.CMPA T1 T2/2; EPwm2Regs.CMPA T2/2; EPwm3Regs.CMPA 0; }4.3 与ADC模块的联动利用EPWM的SOC触发ADC采样实现电流环控制// 配置EPWM1在计数中点触发ADC EPwm1Regs.ETSEL.bit.SOCASEL ET_CTR_PRD; EPwm1Regs.ETPS.bit.SOCAPRD ET_1ST;在电机控制实践中这套配置方案已成功应用于多款无刷电机驱动器载波频率15kHz下CPU负载低于30%。一个容易忽视的细节是GPIO引脚复用配置——务必确认EPWMxA/B输出已映射到正确的物理引脚GpioCtrlRegs.GPAMUX1.bit.GPIO0 1; // EPWM1A GpioCtrlRegs.GPAMUX1.bit.GPIO1 1; // EPWM1B

更多文章