Part Number: TMS320F28388D
Other Parts Discussed in Thread: SYSCONFIG
Hello, I am facing a problem with CLB and ePWM modules. I had configured CLB to create an auxiliary clock using CLB TILE4 and I could capture the clock in oscilloscope with the sysconfig standalone project. However, when I integrated the project into a motor control program that configured the ePWM1 module like in the following code, there would be no clock generated anymore. I found that the function InitEPwmTcExample(0) at line 32 was the reason. How could I resolve this confict?
Thanks for taking the time to read this!
#include <Main.h>
volatile struct EPWM_REGS *ePWM[] ={ &EPwm1Regs,
&EPwm2Regs,
&EPwm3Regs,
&EPwm4Regs,
&EPwm5Regs,
&EPwm6Regs,
&EPwm7Regs,
&EPwm8Regs,
&EPwm9Regs,
&EPwm10Regs,
&EPwm11Regs,
&EPwm12Regs };
void ConfigEPWM(void)
{
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
EALLOW;
ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV = 0;
EDIS;
EALLOW;
EPwm1Regs.TZFRC.bit.OST = 1;
EPwm2Regs.TZFRC.bit.OST = 1;
EPwm3Regs.TZFRC.bit.OST = 1;
EDIS;
InitEPwmTcExample(0);
InitEPwmTcExample(1);
InitEPwmTcExample(2);
EPwm1Regs.ETSEL.bit.SOCAEN = 1;
EPwm1Regs.ETSEL.bit.SOCASEL = 1;
EPwm1Regs.ETPS.bit.SOCAPRD = 1;
EPWM_disablePhaseShiftLoad(EPWM1_BASE);
EPWM_setPhaseShift(EPWM1_BASE, 0U);
EPWM_enableSyncOutPulseSource(EPWM1_BASE, EPWM_SYNC_OUT_PULSE_ON_CNTR_ZERO);
configurePhase(EPWM2_BASE, EPWM1_BASE, 0);
configurePhase(EPWM3_BASE, EPWM1_BASE, 0);
EPWM_setSyncInPulseSource(EPWM2_BASE, EPWM_SYNC_IN_PULSE_SRC_SYNCOUT_EPWM1);
EPWM_setSyncInPulseSource(EPWM3_BASE, EPWM_SYNC_IN_PULSE_SRC_SYNCOUT_EPWM1);
EPWM_enablePhaseShiftLoad(EPWM2_BASE);
EPWM_enablePhaseShiftLoad(EPWM3_BASE);
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO2 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO3 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO4 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO5 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 1;
EDIS;
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
GPIO_setDirectionMode(84, GPIO_DIR_MODE_OUT); // Enable PWM EN (PWMEN_INV - SN74LVCC3245A) refer to CJ_GPIO.c
PWM_EN;
}
void InitEPwmTcExample(Uint16 module)
{
ePWM[module]->TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
ePWM[module]->TBCTL.bit.PHSEN = TB_DISABLE;
ePWM[module]->TBPHS.bit.TBPHS = 0x0000;
ePWM[module]->TBCTL.bit.HSPCLKDIV = TB_DIV1;
ePWM[module]->TBCTL.bit.CLKDIV = TB_DIV1;
ePWM[module]->TBPRD = 6250;
ePWM[module]->TBCTR = 0x0000;
ePWM[module]->AQCTLA.bit.CAU = AQ_CLEAR;
ePWM[module]->AQCTLA.bit.CAD = AQ_SET;
ePWM[module]->DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
ePWM[module]->DBCTL.bit.IN_MODE = DBA_ALL;
ePWM[module]->DBRED.bit.DBRED = 660;
ePWM[module]->DBFED.bit.DBFED = 660;
ePWM[module]->DBCTL.bit.POLSEL = DB_ACTV_LOC;
ePWM[module]->CMPA.bit.CMPA = 3124;
}
void configurePhase(uint32_t base, uint32_t masterBase, uint16_t phaseVal)
{
uint32_t readPrdVal, phaseRegVal;
readPrdVal = EPWM_getTimeBasePeriod(masterBase);
if((HWREGH(base + EPWM_O_TBCTL) & 0x3U) == EPWM_COUNTER_MODE_UP_DOWN)
{
phaseRegVal = (2U * readPrdVal * phaseVal) / 360U;
}
else if((HWREGH(base + EPWM_O_TBCTL) & 0x3U) < EPWM_COUNTER_MODE_UP_DOWN)
{
phaseRegVal = (readPrdVal * phaseVal) / 360U;
}
EPWM_selectPeriodLoadEvent(base, EPWM_SHADOW_LOAD_MODE_SYNC);
EPWM_setPhaseShift(base, phaseRegVal);
EPWM_setTimeBaseCounter(base, phaseRegVal);
}
