ZHDA102 March 2026 MSPM0G3519
TIMA0 具有 4 条外部通道和 2 条内部 CC 通道,可独立用于生成 3 个相移 PWM。这可通过利用内部 CC 通道的 SECONDARY CC 事件来实现。GPTIMER 提供通过配置 CCCTL.CC2SELD 或 CCCTL.CC2SELU 来选择辅助 CC 通道的功能,具体取决于计数模式(递减、递增、递增/递减)。
图 3-2 以辅助通道方法使用 TIMA0 生成非对称 PWM 的示意图根据所选的辅助通道,可以通过配置 CCACT.CC2UACT 或 CCACT.CC2DACT 来完成输出生成,具体取决于计数模式(递增、递减、递增/递减)。
例如,如果计数器加载值为 10000,并且计数器处于递减计数模式,且 CC4 值为 9000。
将 CCCTL[1].CC2SELD 配置为 0x4,这意味着选择 CC4 作为主通道 CC1 的辅助 CC 通道。
将 CCACT[1].CC2DACT 配置为 0x1,这意味着只要计数器的值达到 9000(即当前 CC4 值),CC 输出值就会设置为高电平。CC4 将用作 CC1 的伪加载值。
可以观察到,由于 CCACT[1].CC2DACT,每次计数器达到 9000 时,CC1 的输出都会变为高电平。当计数器达到 4000(CC1 值)时,PWM 输出将变为低电平。
实施此方法来生成三个相移 PWM 非常有用。使用交叉触发功能可通过多个计时器实例生成更多同步相移 PWM 输出通道。
按照以下配置序列设置辅助 CC 通道:
/* TIMA0 Configuration for Generating Phase Shifted PWMs Using Secondary CC events */
static const DL_TimerA_ClockConfig gPWM_0ClockConfig = {
.clockSel = DL_TIMER_CLOCK_BUSCLK,
.divideRatio = DL_TIMER_CLOCK_DIVIDE_1,
.prescale = 255U
};
static const DL_TimerA_PWMConfig gPWM_0Config = {
.pwmMode = DL_TIMER_PWM_MODE_EDGE_ALIGN,
.period = 10000,
.isTimerWithFourCC = true,
.startTimer = DL_TIMER_STOP,
};
SYSCONFIG_WEAK void SYSCFG_DL_PWM_0_init(void) {
DL_TimerA_setClockConfig(
PWM_0_INST, (DL_TimerA_ClockConfig *) &gPWM_0ClockConfig);
DL_TimerA_initPWMMode(
PWM_0_INST, (DL_TimerA_PWMConfig *) &gPWM_0Config);
// Set Counter control to the smallest CC index being used
DL_TimerA_setCounterControl(PWM_0_INST,DL_TIMER_CZC_CCCTL0_ZCOND,DL_TIMER_CAC_CCCTL0_ACOND,DL_TIMER_CLC_CCCTL0_LCOND);
DL_TimerA_setCaptureCompareOutCtl(PWM_0_INST, DL_TIMER_CC_OCTL_INIT_VAL_LOW,
DL_TIMER_CC_OCTL_INV_OUT_DISABLED, DL_TIMER_CC_OCTL_SRC_FUNCVAL,
DL_TIMERA_CAPTURE_COMPARE_0_INDEX);
DL_TimerA_setCaptCompUpdateMethod(PWM_0_INST, DL_TIMER_CC_UPDATE_METHOD_IMMEDIATE, DL_TIMERA_CAPTURE_COMPARE_0_INDEX);
DL_TimerA_setCaptureCompareOutCtl(PWM_0_INST, DL_TIMER_CC_OCTL_INIT_VAL_LOW,
DL_TIMER_CC_OCTL_INV_OUT_DISABLED, DL_TIMER_CC_OCTL_SRC_FUNCVAL,
DL_TIMERA_CAPTURE_COMPARE_1_INDEX);
DL_TimerA_setCaptCompUpdateMethod(PWM_0_INST, DL_TIMER_CC_UPDATE_METHOD_IMMEDIATE, DL_TIMERA_CAPTURE_COMPARE_1_INDEX);
PWM_0_INST->COUNTERREGS.CCCTL_01[0]=0x60000000;//Configuring CC3 as the secondary event for CC0
PWM_0_INST->COUNTERREGS.CCCTL_01[1]=0x80000000;//Configuring CC4 as the secondary event for CC1
PWM_0_INST->COUNTERREGS.CCCTL_23[0]=0xA0000000;//Configuring CC5 as the secondary event for CC2
PWM_0_INST->COUNTERREGS.CCACT_01[0]=0x00001080;//Configuring CC2DACT to drive PWM High and CDACT to drive PWM Low
PWM_0_INST->COUNTERREGS.CCACT_01[1]=0x00001080;//Configuring CC2DACT to drive PWM High and CDACT to drive PWM Low
PWM_0_INST->COUNTERREGS.CCACT_23[0]=0x00001080;//Configuring CC2DACT to drive PWM High and CDACT to drive PWM Low
DL_TimerA_setCaptureCompareValue(PWM_0_INST, 5000, DL_TIMER_CC_0_INDEX);
DL_TimerA_setCaptureCompareValue(PWM_0_INST, 4000, DL_TIMER_CC_1_INDEX);
DL_TimerA_setCaptureCompareValue(PWM_0_INST, 3000, DL_TIMER_CC_2_INDEX);
DL_TimerA_setCaptureCompareValue(PWM_0_INST, 9500, DL_TIMER_CC_3_INDEX);
DL_TimerA_setCaptureCompareValue(PWM_0_INST, 9000, DL_TIMER_CC_4_INDEX);
DL_TimerA_setCaptureCompareValue(PWM_0_INST, 8000, DL_TIMER_CC_5_INDEX);
DL_TimerA_enableClock(PWM_0_INST);
DL_TimerA_setCCPDirection(PWM_0_INST , DL_TIMER_CC0_OUTPUT | DL_TIMER_CC1_OUTPUT |DL_TIMER_CC2_OUTPUT);
}图 3-3 显示了移位的 PWM 输出波形。要动态更改周期/占空比,请参阅节 8。
图 3-3 使用 TIMA0 辅助事件生成相移 PWM