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.

EPWM phase lag



Hi,

 I am using TMS320F28335. I want to generate two pair of PWM's.

I configured EPWM1 and EPWM2 in cmplementary mode.

I want to generate a duty cycle in such way that complementary of EPWM1A is EPWM2A.

code is given below

Initialization:

 // Period = 15000 TBCLK counts
 EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD;

 // Set Phase register to zero
 EPwm1Regs.TBPHS.half.TBPHS = 0;

 // Clock ratio to SYSCLKOUT
 EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;      
 EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

 // Symmetrical mode
 EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;

 // Master module
 EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;
 EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;

 // Sync down-stream module
 EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
 EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
 EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
 EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // load on CTR=Zero
 EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // load on CTR=Zero

 // set actions for EPWM1A
 // Set output to high when TBCTR = CMPA while TBCTR incrementing
 EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;
 // Set output to high when TBCTR = CMPA while TBCTR incrementing
 EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;

 // enable Dead-band module
 EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;

 // Active Hi complementary
 EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;

 // FED = 150 TBCLKs
 EPwm1Regs.DBFED = 300;

 // RED = 150 TBCLKs
 EPwm1Regs.DBRED = 300; 


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   
 // EPWM Module 2 config

 // Period = 15000 TBCLK counts
 EPwm2Regs.TBPRD = EPWM1_TIMER_TBPRD;

 // Set Phase register to zero
 EPwm2Regs.TBPHS.half.TBPHS = 0;

 // Clock ratio to SYSCLKOUT
 EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;      
 EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;

 // Symmetrical mode
 EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;

 // Slave module
 EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;
 EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW;

 // sync flow-through
 EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
 EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
 EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
 EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // load on CTR=Zero
 EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // load on CTR=Zero

 // set actions for EPWM2A

 // Set output to high when TBCTR = CMPA while TBCTR incrementing
 EPwm2Regs.AQCTLA.bit.CAU = AQ_SET; 
 // Set output to Low when TBCTR = CMPA while TBCTR decrementing
 EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR;

 // enable Dead-band module 
 EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
 
 // Active Hi complementary
 EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;

 // FED = 150 TBCLKs
 EPwm2Regs.DBFED = 300;
 // RED = 150 TBCLKs
 EPwm2Regs.DBRED = 300; 

 while(1)
   {
  DutyCycle2 = EPWM1_MAX_CMPA - DutyCycle;
  
  EPwm1Regs.CMPA.half.CMPA = DutyCycle;      // Set compare A value
  
  EPwm2Regs.CMPA.half.CMPA = DutyCycle2;  // Set compare A value
 }

Now I am getting some phase lag between EPWM1A and EPWM2B.

Could any one help me in this regard.  

Regards,

Bhanu Prakash Villuri 

  • Hello,

    It looks like you are using synchronization between the PWM1 and PWM2 modules.  Synchronization has a 2 cycle delay, which is probably the cause of your phase lag.  To compensate,  try using the following in your code:

    EPwm2Regs.TBPHS.half.TBPHS = 2;    // 2 cycle compensate for synchronization delay
    EPwm2Regs.TBCTL.bit.PHSDIR = 1;    // count UP after synchronization event

    Regards,
    Daniel