Part Number: TMS320F28377S
Hi all,
I am using the 28377S to implement the modulator/average current mode loop for a 4 phase interleaved converter. Everything is working okay except for when I drive extremely low duty cycles. As I continue to lower the duty cycle, eventually the EPWMxA waveforms are always low and a narrow pulse on the EPWMxB waveform appears. Eventually the pulse on EPWM1xB goes away, and then the other EPWMxB pulses go away which I would expect, but once the other pulses disappear at 0 duty cycle the pulse on EPWM1B returns. I found this to be very strange. If anyone can point me in the right direction as to how to fix it that would be useful. I've attached my configuration code for the EPWM modules below.
Best regards,
Lance Hummel
void Init_EPWM(void)
{
//
// Setup TBCLK
//
//NOTE: The EPWM module for this processor has a built in hardware limitation on clock frequency of 60MHz to 100MHz for full functionality.
//To handle this, an integer /2 of the main CPU clock is enabled by default in the register ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up-down
EPwm1Regs.TBPRD = EPWM_COUNT_PERIOD; // Set timer period
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loading
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;// Used as sync signal for phase locked PWMs
EPwm1Regs.TBPHS.bit.TBPHS = 0x0000; // Phase is 0
EPwm1Regs.TBCTR = 0x0000; // Clear counter
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
//
// Setup shadow register load on ZERO
//
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
//
// Set Compare values
//
EPwm1Regs.CMPA.bit.CMPA = 0; // Set compare A value
EPwm1Regs.CMPB.bit.CMPB = EPWM_INTERRUPT_COUNT; // Set Compare B value
//
// Set actions
//
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // Set PWM1A on Zero
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET; // Clear PWM1A on event A,
// up count
//EPwm1Regs.AQCTLB.bit.CAU = AQ_SET; // Set PWM1B on Zero
//EPwm1Regs.AQCTLB.bit.CAD = AQ_CLEAR; // Clear PWM1B on event B,
// up count
//
// Setup Deadband (assumes non-inverted gate drive signals and EPWMxA as the source for both delays)
//
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL;
EPwm1Regs.DBRED.bit.DBRED = 0x00A; //100MHz EPWMCLK => 10ns per count, assume 100ns dead band to start
EPwm1Regs.DBFED.bit.DBFED = 0x00A; //100MHz EPWMCLK => 10ns per count, assume 100ns dead band to start
//
// Interrupt where we will change the Compare Values
//
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTRD_CMPB; // Select INT on CMPB down count
EPwm1Regs.ETSEL.bit.INTEN = 1; // Enable INT
EPwm1Regs.ETPS.bit.INTPRD = ET_1ST; // Generate INT on 1st event
//
// Configure ADC SOCA signal
//
EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_PRD;
EPwm1Regs.ETSEL.bit.SOCAEN = 1;
EPwm1Regs.ETPS.bit.SOCAPRD = ET_1ST;
//
//Configure High-Resolution PWM Registers
//
EALLOW;
EPwm1Regs.HRCNFG.all = 0x0;
EPwm1Regs.HRCNFG.bit.EDGMODE = HR_BEP;
EPwm1Regs.HRCNFG.bit.CTLMODE = HR_CMP;
EPwm1Regs.HRCNFG.bit.HRLOAD = HR_CTR_ZERO;
//EPwm1Regs.HRCNFG.bit.EDGMODEB = HR_BEP;
//EPwm1Regs.HRCNFG.bit.CTLMODEB = HR_CMP;
//EPwm1Regs.HRCNFG.bit.HRLOADB = HR_CTR_ZERO_PRD;
EPwm1Regs.HRCNFG.bit.AUTOCONV = 0;
EPwm1Regs.HRPCTL.bit.TBPHSHRLOADE = 1;
EPwm1Regs.HRPCTL.bit.HRPE = 1;
EDIS;
//
// Configure Trip-Zone Module Registers
//
/*EALLOW;
EPwm1Regs.TZSEL.bit.OSHT1 = TZ_ENABLE;
EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
EPwm1Regs.TZCTL.bit.TZB = TZ_FORCE_LO;
EDIS;*/
//
// Setup TBCLK
//
//NOTE: The EPWM module for this processor has a built in hardware limitation on clock frequency of 60MHz to 100MHz for full functionality.
//To handle this, an integer /2 of the main CPU clock is enabled by default in the register ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up-down
EPwm2Regs.TBPRD = EPWM_COUNT_PERIOD; // Set timer period
EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE; // Enable phase loading
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;// Pass on sync signal from master
EPwm2Regs.TBPHS.bit.TBPHS = EPWM_PHASE_OFFSET_1; // Phase is 90 degrees
EPwm2Regs.TBCTR = 0x0000; // Clear counter
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;
//
// 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;
//
// Set Compare values
//
EPwm2Regs.CMPA.bit.CMPA = 0; // Set compare A value
EPwm2Regs.CMPB.bit.CMPB = EPWM_INTERRUPT_COUNT; // Set Compare B value
//
// Set actions
//
EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR; // Set PWM1A on Zero
EPwm2Regs.AQCTLA.bit.CAD = AQ_SET; // Clear PWM1A on event A,
// up count
//EPwm2Regs.AQCTLB.bit.CAU = AQ_SET; // Set PWM1B on Zero
//EPwm2Regs.AQCTLB.bit.CAD = AQ_CLEAR; // Clear PWM1B on event B,
// up count
//
// Setup Deadband (assumes non-inverted gate drive signals and EPWMxA as the source for both delays)
//
EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
EPwm2Regs.DBCTL.bit.IN_MODE = DBA_ALL;
EPwm2Regs.DBRED.bit.DBRED = 0x00A; //100MHz EPWMCLK => 10ns per count, assume 100ns dead band to start
EPwm2Regs.DBFED.bit.DBFED = 0x00A; //100MHz EPWMCLK => 10ns per count, assume 100ns dead band to start
//
// Interrupt where we will change the Compare Values
//
EPwm2Regs.ETSEL.bit.INTSEL = ET_CTRD_CMPB; // Select INT on CMPB down count
EPwm2Regs.ETSEL.bit.INTEN = 1; // Enable INT
EPwm2Regs.ETPS.bit.INTPRD = ET_1ST; // Generate INT on 1st event
//
// Configure ADC SOCA signal
//
EPwm2Regs.ETSEL.bit.SOCASEL = ET_CTR_PRD;
EPwm2Regs.ETSEL.bit.SOCAEN = 1;
EPwm2Regs.ETPS.bit.SOCAPRD = ET_1ST;
//
//Configure High-Resolution PWM Registers
//
EALLOW;
EPwm2Regs.HRCNFG.all = 0x0;
EPwm2Regs.HRCNFG.bit.EDGMODE = HR_BEP;
EPwm2Regs.HRCNFG.bit.CTLMODE = HR_CMP;
EPwm2Regs.HRCNFG.bit.HRLOAD = HR_CTR_ZERO;
//EPwm2Regs.HRCNFG.bit.EDGMODEB = HR_BEP;
//EPwm2Regs.HRCNFG.bit.CTLMODEB = HR_CMP;
// EPwm2Regs.HRCNFG.bit.HRLOADB = HR_CTR_ZERO_PRD;
EPwm2Regs.HRCNFG.bit.AUTOCONV = 0;
EPwm2Regs.HRPCTL.bit.TBPHSHRLOADE = 1;
EPwm2Regs.HRPCTL.bit.HRPE = 1;
EDIS;
//
// Configure Trip-Zone Module Registers
//
/*EALLOW;
EPwm2Regs.TZSEL.bit.OSHT1 = TZ_ENABLE;
EPwm2Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
EPwm2Regs.TZCTL.bit.TZB = TZ_FORCE_LO;
EDIS;*/
//
// Setup TBCLK
//
//NOTE: The EPWM module for this processor has a built in hardware limitation on clock frequency of 60MHz to 100MHz for full functionality.
//To handle this, an integer /2 of the main CPU clock is enabled by default in the register ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV
EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up-down
EPwm3Regs.TBPRD = EPWM_COUNT_PERIOD; // Set timer period
EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE; // Enable phase loading
EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;// Pass on sync signal from master
EPwm3Regs.TBPHS.bit.TBPHS = EPWM_PHASE_OFFSET_2; // Phase is 180 degrees
EPwm3Regs.TBCTR = 0x0000; // Clear counter
EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1;
//
// Setup shadow register load on ZERO
//
EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm3Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm3Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
//
// Set Compare values
//
EPwm3Regs.CMPA.bit.CMPA = 0; // Set compare A value
EPwm3Regs.CMPB.bit.CMPB = EPWM_INTERRUPT_COUNT; // Set Compare B value
//
// Set actions
//
EPwm3Regs.AQCTLA.bit.CAU = AQ_CLEAR; // Set PWM1A on Zero
EPwm3Regs.AQCTLA.bit.CAD = AQ_SET; // Clear PWM1A on event A,
// up count
//EPwm3Regs.AQCTLB.bit.CAU = AQ_SET; // Set PWM1B on Zero
//EPwm3Regs.AQCTLB.bit.CAD = AQ_CLEAR; // Clear PWM1B on event B,
// up count
//
// Setup Deadband (assumes non-inverted gate drive signals and EPWMxA as the source for both delays)
//
EPwm3Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
EPwm3Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
EPwm3Regs.DBCTL.bit.IN_MODE = DBA_ALL;
EPwm3Regs.DBRED.bit.DBRED = 0x00A; //100MHz EPWMCLK => 10ns per count, assume 100ns dead band to start
EPwm3Regs.DBFED.bit.DBFED = 0x00A; //100MHz EPWMCLK => 10ns per count, assume 100ns dead band to start
//
// Interrupt where we will change the Compare Values
//
EPwm3Regs.ETSEL.bit.INTSEL = ET_CTRD_CMPB; // Select INT on CMPB down count
EPwm3Regs.ETSEL.bit.INTEN = 1; // Enable INT
EPwm3Regs.ETPS.bit.INTPRD = ET_1ST; // Generate INT on 1st event
//
// Configure ADC SOCA signal
//
EPwm3Regs.ETSEL.bit.SOCASEL = ET_CTR_PRD;
EPwm3Regs.ETSEL.bit.SOCAEN = 1;
EPwm3Regs.ETPS.bit.SOCAPRD = ET_1ST;
//
//Configure High-Resolution PWM Registers
//
EALLOW;
EPwm3Regs.HRCNFG.all = 0x0;
EPwm3Regs.HRCNFG.bit.EDGMODE = HR_BEP;
EPwm3Regs.HRCNFG.bit.CTLMODE = HR_CMP;
EPwm3Regs.HRCNFG.bit.HRLOAD = HR_CTR_ZERO;
//EPwm3Regs.HRCNFG.bit.EDGMODEB = HR_BEP;
//EPwm3Regs.HRCNFG.bit.CTLMODEB = HR_CMP;
//EPwm3Regs.HRCNFG.bit.HRLOADB = HR_CTR_ZERO_PRD;
EPwm3Regs.HRCNFG.bit.AUTOCONV = 0;
EPwm3Regs.HRPCTL.bit.TBPHSHRLOADE = 1;
EPwm3Regs.HRPCTL.bit.HRPE = 1;
EDIS;
//
// Configure Trip-Zone Module Registers
//
/*EALLOW;
EPwm3Regs.TZSEL.bit.OSHT1 = TZ_ENABLE;
EPwm3Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
EPwm3Regs.TZCTL.bit.TZB = TZ_FORCE_LO;
EDIS;*/
//
// Setup TBCLK
//
//NOTE: The EPWM module for this processor has a built in hardware limitation on clock frequency of 60MHz to 100MHz for full functionality.
//To handle this, an integer /2 of the main CPU clock is enabled by default in the register ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV
EPwm4Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up-down
EPwm4Regs.TBPRD = EPWM_COUNT_PERIOD; // Set timer period
EPwm4Regs.TBCTL.bit.PHSEN = TB_ENABLE; // Enable phase loading
EPwm4Regs.TBCTL.bit.PHSDIR = TB_UP; // Count down to achieve 270 degree phase shift
EPwm4Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;// Pass on sync signal from master
EPwm4Regs.TBPHS.bit.TBPHS = EPWM_PHASE_OFFSET_3; // Phase is 270 degrees (Note: Reversed count direction i.e. 360-90=270 degrees)
EPwm4Regs.TBCTR = 0x0000; // Clear counter
EPwm4Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
EPwm4Regs.TBCTL.bit.CLKDIV = TB_DIV1;
//
// Setup shadow register load on ZERO
//
EPwm4Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm4Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm4Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm4Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
//
// Set Compare values
//
EPwm4Regs.CMPA.bit.CMPA = 0; // Set compare A value
EPwm4Regs.CMPB.bit.CMPB = EPWM_INTERRUPT_COUNT; // Set Compare B value
//
// Set actions
//
EPwm4Regs.AQCTLA.bit.CAU = AQ_CLEAR; // Set PWM1A on Zero
EPwm4Regs.AQCTLA.bit.CAD = AQ_SET; // Clear PWM1A on event A,
// up count
//EPwm4Regs.AQCTLB.bit.CAU = AQ_SET; // Set PWM1B on Zero
//EPwm4Regs.AQCTLB.bit.CAD = AQ_CLEAR; // Clear PWM1B on event B,
// up count
//
// Setup Deadband (assumes non-inverted gate drive signals and EPWMxA as the source for both delays)
//
EPwm4Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
EPwm4Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
EPwm4Regs.DBCTL.bit.IN_MODE = DBA_ALL;
EPwm4Regs.DBRED.bit.DBRED = 0x00A; //100MHz EPWMCLK => 10ns per count, assume 100ns dead band to start
EPwm4Regs.DBFED.bit.DBFED = 0x00A; //100MHz EPWMCLK => 10ns per count, assume 100ns dead band to start
//
// Interrupt where we will change the Compare Values
//
EPwm4Regs.ETSEL.bit.INTSEL = ET_CTRD_CMPB; // Select INT on CMPB down count
EPwm4Regs.ETSEL.bit.INTEN = 1; // Enable INT
EPwm4Regs.ETPS.bit.INTPRD = ET_1ST; // Generate INT on 1st event
//
// Configure ADC SOCA signal
//
EPwm4Regs.ETSEL.bit.SOCASEL = ET_CTR_PRD;
EPwm4Regs.ETSEL.bit.SOCAEN = 1;
EPwm4Regs.ETPS.bit.SOCAPRD = ET_1ST;
//
//Configure High-Resolution PWM Registers
//
EALLOW;
EPwm4Regs.HRCNFG.all = 0x0;
EPwm4Regs.HRCNFG.bit.EDGMODE = HR_BEP;
EPwm4Regs.HRCNFG.bit.CTLMODE = HR_CMP;
EPwm4Regs.HRCNFG.bit.HRLOAD = HR_CTR_ZERO;
//EPwm4Regs.HRCNFG.bit.EDGMODEB = HR_BEP;
//EPwm4Regs.HRCNFG.bit.CTLMODEB = HR_CMP;
//EPwm4Regs.HRCNFG.bit.HRLOADB = HR_CTR_ZERO_PRD;
EPwm4Regs.HRCNFG.bit.AUTOCONV = 0;
EPwm4Regs.HRPCTL.bit.TBPHSHRLOADE = 1;
EPwm4Regs.HRPCTL.bit.HRPE = 1;
EDIS;
//
// Configure Trip-Zone Module Registers
//
/*EALLOW;
EPwm4Regs.TZSEL.bit.OSHT1 = TZ_ENABLE;
EPwm4Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
EPwm4Regs.TZCTL.bit.TZB = TZ_FORCE_LO;
EDIS;*/
#if CLA_BENCHMARK
//Setup TBCLK Registers
EPwm5Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
EPwm5Regs.TBPRD = 0xFFFF; // Set timer period
EPwm5Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Enable phase loading
EPwm5Regs.TBPHS.bit.TBPHS = 0x0000; // Phase is 0 degrees
EPwm5Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
EPwm5Regs.TBCTL.bit.CLKDIV = TB_DIV1;
#endif
}
