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 delayEPwm2Regs.TBCTL.bit.PHSDIR = 1; // count UP after synchronization event
Regards,Daniel