Hi,
I am trrying to build a phse shift control. My control variable changes the TBPHS value. However, I am having a missing pulse problem. The point where I am always missing the pulse.
Here is the code for EPWM2:
void InitEPwm2Example()
{
// Setup TBCLK
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count updown // Time base control register
EPwm2Regs.TBPRD = EPWM_TIMER_TBPRD; // Set timer period // when to pull high/low
EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE; // Disable phase loading
EPwm2Regs.TBPHS.bit.TBPHS = 0; // Phase is 0
EPwm2Regs.TBCTR = 0x0000; // Clear counter // Time base control register
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;
// Pass the sync signal through to standard modules?
// Usually Slaves use TB_SYNC_IN, but TB_CTR_ZERO is okay if it's the last in chain.
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
// Setup shadow register load on ZERO
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.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // deadband output mode //DB_FULL_ENABLE- deadband generator is fully enabled
EPwm2Regs.DBCTL.bit.IN_MODE = DBA_ALL; // EPWMA is master
EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // Active High Complementary
// Set Compare values
EPwm2Regs.CMPA.bit.CMPA = EPWM_MAX_CMPA; // Set compare A value
EPwm2Regs.DBFED.bit.DBFED = 0; //Dead-Band Generator Falling Edge Delay Count Register
EPwm2Regs.DBRED.bit.DBRED = 0; // Dead-Band Generator Rising Edge Delay Count Register
// Set actions
// AQCTLA = Action qualifier control reg for output A
// Action when TBCTR = CMPA on down count
EPwm2Regs.AQCTLA.bit.CAD = AQ_SET; // 2= Set: force EPWMxA output high
// Action when TBCTR = CMPA on up count
EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR; // 1 = Clear: force EPWMxA output low
//for interrupt
EPwm2Regs.CMPB.bit.CMPB= EPWM_MAX_CMPA;
EPwm2Regs.CMPA.bit.CMPA= EPWM_MAX_CMPA;
EPwm2Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // Event trigger selection register
EPwm2Regs.ETSEL.bit.INTEN = 1;
EPwm2Regs.ETPS.bit.INTPRD = ET_1ST; // Event trigger pre-scale register
epwm2_info.EPwmRegHandle = &EPwm2Regs; // Set the pointer to the
// ePWM module
}
My control variable:
d2 = Vin/(n*Vout);
duty2 = d2*EPWM_TIMER_TBPRD;
// Safety Clamp (Optional but recommended)
// TBPHS cannot be larger than TBPRD in Up-Down mode
if(duty2 > EPWM_TIMER_TBPRD)
duty2 = EPWM_TIMER_TBPRD;
if (duty2 < 0)
duty2 = 0;
epwm2_info->EPwmRegHandle->TBPHS.bit.TBPHS= duty2;
The missing pulse problem:



I tried to address the issue by adding T1 event in the action qualifer. It changed the shape of the current, meaning the epwm2 started before epwm1 and changed the duty cycle. If you have any idea what I should be addressing to fix the issue, please let me know.
Thanks