Thread 中讨论的其他器件:SysConfig
大家好、我遇到了 CLB 和 ePWM 模块的问题。 我已将 CLB 配置为 使用 CLB TILE4创建辅助时钟 、并且可以使用 SysConfig 独立项目在示波器中捕获时钟。 然而、当我将项目集成到一个电机控制程序中、此程序像在以下代码中那样配置 ePWM1模块时、将不再生成时钟。 我发现 第32行中的函数 InitEPwmTcExamples(0)就是原因。 如何解决此问题?
感谢您花时间阅读本文档!
#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);
}
