TMS320F28379D: Missing Pulse Problem

Part Number: TMS320F28379D


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