Hi, my name is Iulian Popa.
I´m a student from Univerity of Zaragoza in Spain. Im using one of your development board 'LAUNCHXL-F280049C' and I have some questions and problems when I´m trying to control some PWM signals.
First of all, Im using:
- CodeComposer version 9.3
- C2000Ware version 3.1.0.00
I´m trying to control a Full Bridge with 3 PWM modules (The PWM signals that I have to use are imposed by HW). The EPWM signals are the following:
- ePWM_7 A and B outputs
- ePWM_6 output A
- ePWM_4 output A
My problem starts when I want to sync up the ePWM outputs and set the ePWM_7 as "Master" and Phase-Shift the ePWM6 and ePWM4. I've been reading other threads from TI forums like this one: https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/906918?tisearch=e2e-sitesearch&keymatch=F28004x%252525252525252520PWM%252525252525252520PhaseShift
I leave below my initialization of the modules (ePWM5_B is another stuff, ignore it):
void Config_ePWM_OUTPUTs (void){
SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC); //TIENE QUE IR AQUI PORQUE SINO NO SE SINCRONIZA BIEN EL EPWM
EPWM_enablePhaseShiftLoad(EPWM4_BASE);
EPWM_enablePhaseShiftLoad(EPWM6_BASE);
//-------------------------------------> EPWM_7_A_B (H1 - L1) <------------------------------------
EPwm7Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
//----------------------------------------------
EPWM_setTimeBaseCounterMode(EPWM7_BASE, EPWM_COUNTER_MODE_UP);
//----------------------------------------------
EPWM_setTimeBasePeriod(EPWM7_BASE, EPWM7_PERIOD);
EPWM_setPhaseShift(EPWM7_BASE, 0U);
//----------------------------------------------
EPWM_setCounterCompareValue(EPWM7_BASE, EPWM_COUNTER_COMPARE_A, EPWM7_DUTY);
//----------------------------------------------
EPWM_setClockPrescaler(EPWM7_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);
//----------------------------------------------
EPWM_setActionQualifierAction(EPWM7_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(EPWM7_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction(EPWM7_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(EPWM7_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
//----------------------------------------------
//-------------------------------------> EPWM_6_A (H2) <------------------------------------
EPwm6Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;// follow Previous PWM
//----------------------------------------------
EPWM_setTimeBaseCounterMode(EPWM6_BASE, EPWM_COUNTER_MODE_UP);
//----------------------------------------------
EPWM_setTimeBasePeriod(EPWM6_BASE, EPWM6_PERIOD);
EPWM_setPhaseShift(EPWM6_BASE, 100U);
//----------------------------------------------
EPWM_setClockPrescaler(EPWM6_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);
//----------------------------------------------
EPWM_setCounterCompareValue(EPWM6_BASE, EPWM_COUNTER_COMPARE_A, EPWM6_DUTY);
//----------------------------------------------
EPWM_setActionQualifierAction(EPWM6_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(EPWM6_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
//----------------------------------------------
//-------------------------------------> EPWM_4_A (L2) <------------------------------------
EPwm4Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;// follow Previous PWM
//----------------------------------------------
EPWM_setTimeBaseCounterMode(EPWM4_BASE, EPWM_COUNTER_MODE_UP);
//----------------------------------------------
EPWM_setTimeBasePeriod(EPWM4_BASE, EPWM4_PERIOD);
EPWM_setPhaseShift(EPWM4_BASE, 0U);
//----------------------------------------------
EPWM_setClockPrescaler(EPWM4_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);
//----------------------------------------------
EPWM_setCounterCompareValue(EPWM4_BASE, EPWM_COUNTER_COMPARE_A, EPWM4_DUTY);
//----------------------------------------------
EPWM_setActionQualifierAction(EPWM4_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(EPWM4_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
//----------------------------------------------
//-------------------------------------> EPWM_5_B (12V_ISO) <------------------------------------
//----------------------------------------------
EPWM_setClockPrescaler(EPWM5_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);
EPWM_setEmulationMode(EPWM5_BASE, EPWM_EMULATION_FREE_RUN);
//----------------------------------------------
EPWM_setTimeBaseCounter(EPWM5_BASE, 0);
EPWM_setTimeBasePeriod(EPWM5_BASE, EPWM5_PERIOD);
EPWM_setPeriodLoadMode(EPWM5_BASE, EPWM_PERIOD_SHADOW_LOAD);
EPWM_setTimeBaseCounterMode(EPWM5_BASE, EPWM_COUNTER_MODE_UP);
//----------------------------------------------
EPWM_setCounterCompareValue(EPWM5_BASE, EPWM_COUNTER_COMPARE_A, EPWM5_DUTY);
EPWM_setCounterCompareShadowLoadMode(EPWM5_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_PERIOD);
//----------------------------------------------
EPWM_setActionQualifierShadowLoadMode(EPWM5_BASE, EPWM_ACTION_QUALIFIER_A, EPWM_AQ_LOAD_ON_CNTR_ZERO);
EPWM_setActionQualifierAction(EPWM5_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(EPWM5_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
//----------------------------------------------
SysCtl_setSyncInputConfig(SYSCTL_SYNC_IN_EPWM4, SYSCTL_SYNC_IN_SRC_EPWM7SYNCOUT);
SysCtl_setSyncInputConfig(SYSCTL_SYNC_IN_EPWM1, SYSCTL_SYNC_IN_SRC_EPWM7SYNCOUT);
SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC); // Enable sync and clock to PWM
}
I await your response, regards. Iulian