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); }