interrupt void UserISR(void) { if(syncAdjEna == 1) { EALLOW; EPwm1Regs.TBCTL.bit.PRDLD = 0; //Enable shadow EPwm1Regs.TBCTL2.bit.PRDLDSYNC = 0; //TBCTR = 0:shadow->active EPwm1Regs.TBPRD = 4166*2; EDIS; GpioDataRegs.GPBTOGGLE.bit.GPIO38 = 1; cnt = 15; syncAdjEna = 0; } if(cnt > 1) { if(cnt == 14) { EALLOW; EPwm1Regs.TBCTL.bit.PRDLD = 0; //Enable shadow EPwm1Regs.TBCTL2.bit.PRDLDSYNC = 0; EPwm1Regs.TBPRD = 4166; EDIS; GpioDataRegs.GPBTOGGLE.bit.GPIO38 = 1; } else if(cnt == 13) { GpioDataRegs.GPBTOGGLE.bit.GPIO38 = 1; } else if(cnt == 12) { GpioDataRegs.GPBTOGGLE.bit.GPIO38 = 1; } cnt--; if(cnt == 2) cnt = 0; } PieCtrlRegs.PIEACK.all |= PIEACK_GROUP11; }
目标:UserISR中断中增大EPWM1 TBPRD值(4166*2),下一次进UserISR中断再恢复为原值(4166)
配置基础:EPWM1计数器采用向上向下计数方式,TR=0和TR=PRD时触发EPWM1SOCA,SOCA触发ADC中断,ADCAINT1触发CLA中断,每两次CLA中断触发一次UserISR中断(频率24K,一个周期41.65us)并且翻转IO电平(以此电平作为过零点信号,波形为蓝色所示),UserISR中断里改变TBPRD前翻转另一个IO电平(波形为绿色所示), 配置为:
EPwm1Regs.TBCTL.bit.PRDLD = 0; //Enable shadow EPwm1Regs.TBCTL2.bit.PRDLDSYNC = 0; //TBCTR = 0:shadow->active
根据配置,效果应该是蓝色波形其中一个周期变长(时间为41.65*2us),但实际效果为其中两个周期变长(时间为62us,即为41.65us的1.5倍,看起来似乎TBPRD从影子寄存器加载时机并不是设置的零点,而是顶点,这是为什么?),如下图所示:
EPwm1Regs.TBCTL.bit.PRDLD设置为1,立即加载模式,波形是正常的:
请问为什么配置为过零点再从影子寄存器里加载TBPRD值效果不正确?应该如何配置?
您好,
shadow设置没什么问题,但您在中断里面使能,是外部还有代码禁止shadow吗?
由于只是代码片段,在进入中断时,CNT == 0且syncAdjEna == 0的情况好像没有做处理。