This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
Tool/software: Code Composer Studio
Hi,
I’m implementing a full-bridge resonant converter controlled via variable frequency and constant duty cycle. ePWM4 and ePWM5 operate in complementary mode. ePWM4A and ePWM5A control the high switches. The frequency can vary from 50 kHz to 100kHz.
The controller algorithm runs inside ePWM4 interrupt. There’s also HMI code which is dealt with inside timer1 interrupt every 1ms.
I realized that, depending on how long the code within the timer1 interrupt takes to execute, e.g. 3 us, phase shift start to happen between ePWM4A and ePWM5A, which is not desired.
Could you help me finding out what causes this problem and how could it be avoid?
I'm sending a simplified version of the code showing the ePWMs configurations.
Regards,
Schneider
asm(" EALLOW"); // PCLKCR1.bit.EPWMxENCLK = 1: The ePWMx module is clocked by the system clock SysCtrlRegs.PCLKCR1.bit.EPWM4ENCLK = 1; SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK = 1; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; asm(" EDIS"); EPwm4Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Symmetric EPwm4Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Phase loading disabled EPwm4Regs.TBCTL.bit.PRDLD = TB_SHADOW; // TBPRD register is loaded when TBCTR = 0 EPwm4Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE; // Disable PWM output synchronization signal EPwm4Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // TBCLK = SYSCLKOUT EPwm4Regs.TBCTL.bit.CLKDIV = TB_DIV1; // TBCLK = SYSCLKOUT EPwm4Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // CMPA register is not loaded until LOADAMODE event occurs EPwm4Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; // CMPB register is not loaded until LOADBMODE event occurs EPwm4Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // load on CTR = Zero EPwm4Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // load on CTR = Zero EPwm4Regs.AQCTLA.bit.CAU = AQ_SET; EPwm4Regs.AQCTLA.bit.CAD = AQ_CLEAR; EPwm4Regs.DBCTL.bit.IN_MODE = DBA_ALL; // EPWMxA is the source for both falling-edge and rising-edge delay EPwm4Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // Dead-band is fully enabled for both rising-edge delay on output EPWMxA and falling-edge delay on output EPWMxB EPwm4Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // Active high complementary (AHC). EPWMxB is inverted EPwm4Regs.DBFED = EPwm4Regs.DBRED = RESONANT_DBRED_DBFED; // Load the dead band register EPwm4Regs.ETPS.bit.INTPRD = 1; // Generate an EPWM4_INT interrupt every time one event occurs EPwm4Regs.ETSEL.bit.INTSEL = 2; // Enable event TBCTR = TBPRD EPwm4Regs.TBPRD = RESONANT_MIN_TBPRD; EPwm4Regs.CMPA.half.CMPA = RESONANT_MIN_TBPRD; EPwm4Regs.TBPHS.half.TBPHS = 0x0000; // Set timer phase EPwm4Regs.TBCTR = 0; // clear TB counter // ePWM5: EPwm5Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Symmetric EPwm5Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Phase loading disabled EPwm5Regs.TBCTL.bit.PRDLD = TB_SHADOW; // TBPRD register is loaded when TBCTR = 0 EPwm5Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE; // Disable PWM output synchronization signal EPwm5Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // TBCLK = SYSCLKOUT EPwm5Regs.TBCTL.bit.CLKDIV = TB_DIV1; // TBCLK = SYSCLKOUT EPwm5Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // CMPA register is not loaded until LOADAMODE event occurs EPwm5Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; // CMPB register is not loaded until LOADBMODE event occurs EPwm5Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // load on CTR = ZERO EPwm5Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // load on CTR = ZERO // EPwm5Regs.AQCTLA.bit.CAU = AQ_CLEAR; // Inverted in relation to EPwm4 - Full-bridge inverter implementation // EPwm5Regs.AQCTLA.bit.CAD = AQ_SET; // TODO Using same configuration as ePWM4 for the synchronization test EPwm5Regs.AQCTLA.bit.CAU = AQ_SET; EPwm5Regs.AQCTLA.bit.CAD = AQ_CLEAR; EPwm5Regs.DBCTL.bit.IN_MODE = DBA_ALL; // EPWMxA is the source for both falling-edge and rising-edge delay EPwm5Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // Dead-band is fully enabled for both rising-edge delay on output EPWMxA and falling-edge delay on output EPWMxB EPwm5Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // Active high complementary (AHC). EPWMxB is inverted EPwm5Regs.DBFED = EPwm5Regs.DBRED = RESONANT_DBRED_DBFED; // Load the dead band register EPwm5Regs.TBPRD = RESONANT_MIN_TBPRD; EPwm5Regs.CMPA.half.CMPA = RESONANT_MIN_TBPRD; EPwm5Regs.TBPHS.half.TBPHS = 0x0000; // Set timer phase EPwm5Regs.TBCTR = 0; // clear TB counter asm(" EALLOW"); // Enable EALLOW protected register access SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; // Enable the clocks to the ePWM module after all ePWM modules are configured to ensure synchronization between the ePWM modules. asm(" EDIS"); // Disable EALLOW protected register access __interrupt void INT13_ISR(void) // INT13 or CPU-Timer1 { // Human-Machine-Interface code //... //... } __interrupt void EPWM4_INT_ISR(void) // EPWM-4 { EPwm4Regs.ETCLR.bit.INT = 1; PieCtrlRegs.PIEACK.all = PIEACK_GROUP3; //... //(CONTROLLER ALGORITHM) //... EPwm4Regs.TBPRD = EPwm5Regs.TBPRD = new_period; // PWM Period = ( 2 * TBPRD / F_SYSCLK ) for Up and Down Count mode ( Symmetric ) EPwm4Regs.CMPA.half.CMPA = EPwm5Regs.CMPA.half.CMPA = EPwm4Regs.TBPRD >> 1; // 50% duty cycle }
That did the trick! Now there is a constant ~22 ns delay now, as it should, according to the Tech. Ref. pg. 259, but this is not a problem in the application.
I thought clearing the TBLCKSYNC bit and TBCTR register would be enough if the ePWM modules were loaded with the same period every time.
Thank you, Vasudha!