void InitEPwm2Driver(void) { EALLOW; EPwm2Regs.TBPRD = C_MOTOR_PWM_PRD; EPwm2Regs.TBPHS.all = 0; EPwm2Regs.TBCTR = 0; // Setup TBCLK EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE; EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW; EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; EPwm2Regs.TBCTL.bit.SWFSYNC = 0; EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1; EPwm2Regs.TBCTL.bit.PHSDIR = 1; EPwm2Regs.TBCTL.bit.FREE_SOFT = 3; EPwm2Regs.CMPA.half.CMPA = 1125 //EPwm2Regs.CMPA.half.CMPAHR = 0; EPwm2Regs.CMPB = 1; //EPwm2Regs.CMPA.half.CMPAHR = 0; EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; EPwm2Regs.AQCTLA.bit.CAU = AQ_SET; EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR; EPwm2Regs.AQCTLB.bit.CBU = AQ_CLEAR; EPwm2Regs.AQCTLB.bit.CBD = AQ_SET; EDIS; }
PWM模块配置如上,其中B路PWM在其正常工作的时候,将CMPB值更新为0,停止PWMB的输出。
经过验证,如果更新CMPB值的时刻,正好为时基计数器为0的时刻,此时会出现PWM2B被异常拉高一个周期。
如上图所示,紫色波形为出现问题的EPWM2B输出波形,绿色波形为EPWM3B的波形,其配置与EPWM2B相同,且占空比更为位置也相同,理论上这两者波形应该一致。
左侧紫色和绿色的小尖峰是出问题前一时刻,正常的PWM输出的波形,占空比为3.2%,在后一个PWM周期,软件给PWM2B 和3B的CMPB同时给到0,输出0占空比,从而不输出波形,但是此时2B输出出现问题,波形被异常拉高一整个周期,绿色的仍为正常波形。
后续经验证了十几次,发现紫色的EPWM2B波形出问题的时刻,总是在时基计数器数到0时刻,给CMPB写0停止输出这个时间节点。
因为配置的是比较值影子寄存器在CTR=0时刻进行装载,不知道和应用层刚好在CTR=0时刻把CMPB写为0是否有关。