Hi, we have an issue with software syncronization between 2 ePWM modules. We have initialized ePWM2 and ePWM3 with the following code:
// PWM2B, 1KHz EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW; EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_DOWN; EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE; EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2; EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1; EPwm2Regs.TBPRD = 50000; // Set timer period, TBCLK / 50000 = 1ms --> 1kHz EPwm2Regs.TBPHS.bit.TBPHS = 0x0000; // Phase is 0 EPwm2Regs.TBCTR = 0x0000; // Clear counter EPwm2Regs.CMPB.bit.CMPB = 25000; // duty 50% EPwm2Regs.AQCTLB.bit.PRD = AQ_SET; EPwm2Regs.AQCTLB.bit.CBD = AQ_CLEAR; EPwm2Regs.TBCTL2.bit.PRDLDSYNC = 2; EPwm2Regs.CMPCTL.bit.LOADBSYNC = 2; // PWM3A, 2KHz EPwm3Regs.TBCTL.bit.PRDLD = TB_SHADOW; EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_DOWN; EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE; EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2; EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1; EPwm3Regs.TBPRD = 25000; // Set timer period, TBCLK / 50000 = 1ms --> 1kHz EPwm3Regs.TBPHS.bit.TBPHS = 0x0000; // Phase is 0 EPwm3Regs.TBCTR = 0x0000; // Clear counter EPwm3Regs.CMPA.bit.CMPA = 12500; // duty 50% EPwm3Regs.AQCTLA.bit.PRD = AQ_SET; EPwm3Regs.AQCTLA.bit.CAD = AQ_CLEAR; EPwm3Regs.TBCTL2.bit.PRDLDSYNC = 2; EPwm3Regs.CMPCTL.bit.LOADASYNC = 2;
At some point in our code, we need to update our frequency and duty cycle with software synconization mode. We issue the change of frequency and software syncronization like this:
EPwm2Regs.TBPRD = 25000; // Set timer period ePWM2B EPwm2Regs.CMPB.bit.CMPB = 12500; // duty 50% EPwm3Regs.TBPRD = 12000; // Set timer period ePWM3A EPwm3Regs.CMPA.bit.CMPA = 6000; // duty 50% EPwm2Regs.TBCTL.bit.SWFSYNC = 1; // phase software syncronization
We expect that the PWM signal start from Period Value in each ePWM unit, but only the ePWM2 restart. ePWM3 continue with the same frequency.
Can anyone help us? What's wrong?