我有一个项目利用了 CPU2提供的所有12个 PWM 模块。 所有引脚的配置几乎完全相同、但在探测输出时、只有 PWM<7-12>看起来工作正常、对应 PWM<1-6>的12个输出引脚在没有开关的情况下处于高电平或低电平。
下面显示的是 EPWM6的配置、但几乎相同的配置用于所有器件。
void init()
{
// PWM H
GPIO_setPadConfig(10, GPIO_PIN_TYPE_STD);
GPIO_setPinConfig(GPIO_10_EPWM6A);
GPIO_setMasterCore(10, GPIO_CORE_CPU2);
// PWM L
GPIO_setPadConfig(11, GPIO_PIN_TYPE_STD);
GPIO_setPinConfig(GPIO_11_EPWM6B);
GPIO_setMasterCore(11, GPIO_CORE_CPU2);
SysCtl_selectCPUForPeripheral(SYSCTL_CPUSEL0_EPWM, 6, SYSCTL_CPUSEL_CPU2);
base = EPWM6_BASE;
EPWM_setTimeBasePeriod(base, 1000);
EPWM_setPhaseShift(base, 0U);
EPWM_setTimeBaseCounter(base, 0U);
EPWM_disableInterrupt(base);
EPWM_setCounterCompareValue(base, EPWM_COUNTER_COMPARE_A, 0U);
EPWM_setCounterCompareValue(base, EPWM_COUNTER_COMPARE_B, 0U);
EPWM_setTimeBaseCounterMode(base, EPWM_COUNTER_MODE_UP_DOWN);
EPWM_disablePhaseShiftLoad(base);
EPWM_setClockPrescaler(base, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);
EPWM_setCounterCompareShadowLoadMode(base, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);
EPWM_setCounterCompareShadowLoadMode(base, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO);
EPWM_setActionQualifierAction(base, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction(base, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
EPWM_setActionQualifierAction(base, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
EPWM_setActionQualifierAction(base, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
EPWM_setInterruptSource(base, EPWM_INT_TBCTR_ZERO);
EPWM_enableInterrupt(base);
EPWM_setInterruptEventCount(base, 10);
Interrupt_enable(INT_EPWM6);
SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
}
__interrupt void pwm_isr(void)
{
// new_val as placeholder for this demo
EPWM_setCounterCompareValue(EPWM6_BASE, EPWM_COUNTER_COMPARE_A, new_val);
EPWM_setCounterCompareValue(EPWM6_BASE, EPWM_COUNTER_COMPARE_B, new_val);
EPWM_clearEventTriggerInterruptFlag(EPWM6_BASE);
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP3);
}
注: 为完整起见、上面包括了 SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_TBCLKSYNC)调用。 实际上、直到所有 PWM 都被设置后、才会调用它。
我最初以为中断配置和处理可能会出错、但是如果我禁用 PWM<1-6>的中断并从 PWM<7-12>的 ISR 更新它们的比较寄存器、则仍然无法正常工作。