厦门市网站建设_网站建设公司_响应式网站_seo优化
2025/12/26 10:01:49 网站建设 项目流程

12路脉冲移相,dsp28335程序

最近在折腾三相逆变器项目,用DSP28335搞12路移相脉冲输出,踩了不少坑。这玩意儿在电机控制和电源系统里用得贼多,特别是需要精确时序控制的场合。老司机都知道,TI的C2000系列玩PWM是真香,但要把12路相位安排得明明白白还真得动点脑子。

先说配置思路,DSP28335的ePWM模块有6个独立单元,每个单元能出两路互补信号。要搞12路移相,得让每个模块的计数器错开相位。这里有个骚操作——把360度相位均分给6个模块,每个模块负责两路信号,相位差直接体现在TBCTR计数器的初始值上。

上硬货看代码:

void InitEPwm() { // 基础时钟配置 EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 增减计数模式 EPwm1Regs.TBPRD = 1500; // 周期值,对应10kHz EPwm1Regs.TBPHS.half.TBPHS = 0; // 主模块相位基准 // 从模块相位偏移配置 for(int i=2; i<=6; i++){ EPwm_REG_REGS(i)->TBPHS.half.TBPHS = (i-1)*250; // 每个模块偏移30度 EPwm_REG_REGS(i)->TBCTL.bit.PHSEN = TB_ENABLE; // 启用相位加载 } // 动作限定器配置 EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // 计数等于CMPA时置高 EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; // 计数等于周期值时置低 EPwm1Regs.CMPA.half.CMPA = 750; // 50%占空比 }

这里有几个关键点:TBPHS寄存器控制相位偏移量,计算时得注意(周期值/360)*相位角度。比如10kHz对应周期值1500(假设系统时钟150MHz),30度偏移就是1500/12=125,实际取了250是因为用的增减计数模式,得算半周期。

移相的精髓在同步链配置,得用EPWM1作为主时钟,其他模块通过SYNCO信号同步:

EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE; // 主模块不同步 EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // 从模块同步输入 EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // 先暂停所有ePWM时钟 SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; // 统一启动 EDIS;

这个操作骚在统一启动时钟,避免各模块启动时间不一致导致相位乱跳。实测中发现,如果不做这个同步,前几个周期的波形会抽风。

中断处理也不能马虎,特别是要做动态相位调整时:

interrupt void epwm1_isr(void) { static int phase_offset = 0; phase_offset = (phase_offset + 5) % 360; // 每次中断相位+5度 // 实时更新相位 EPwm2Regs.TBPHS.half.TBPHS = (phase_offset * EPwm1Regs.TBPRD)/360; EPwm1Regs.ETCLR.bit.INT = 1; // 清中断 PieCtrlRegs.PIEACK.all = PIEACK_GROUP3; }

这里有个坑:直接改TBPHS可能会在计数器运行时产生毛刺,稳妥的做法是在计数器为0时更新。所以中断触发时机要选在CTR=0的时候,配合TBCTL的PHSDIR位控制加载时机。

最后说个实用技巧,用CCS的Graph工具观察相位差巨方便:

// 在观察窗口添加: EPwm1Regs.CMPA.all, EPwm2Regs.CMPA.all, ...

设置成并行显示,直接看波形相位关系。比用示波器抓方便,特别是调相位微调时,能实时看到数值变化。

这波操作下来,12路脉冲跟军训列队似的整整齐齐,相位差控制在±1ns以内没问题。关键是活用ePWM的同步机制,别头铁硬算相位值。下次搞36路移相?简单,加个多级同步链就完事了,不过那就是另一个故事了...

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询