ZHDA102 March   2026 MSPM0G3519

 

  1.   1
  2.   摘要
  3.   商标
  4. 1 简介
  5. 2 空闲低电平状态:PWM 输出通道低电平状态配置
  6. 3 非对称 PWM:具有相移控制功能的双路同步 PWM 生成
    1. 3.1 使用相位加载功能
      1. 3.1.1 主要计时器(主计时器)的配置
      2. 3.1.2 辅助计时器的配置
      3. 3.1.3 交叉触发功能的实现
    2. 3.2 使用辅助捕获/比较通道
  7. 4 位操作 (Bit-Banging) 仿真:基于软件的通信协议实现
    1. 4.1 使用 TIMA 仿真 UART Rx
    2. 4.2 使用 TIMA 仿真 UART Tx
  8. 5 基于反馈的 PWM 生成
    1. 5.1 基于反馈的 PWM 信号复制
    2. 5.2 使用输入基准生成延迟的 PWM 信号
  9. 6 延迟计时器启动:具有可配置延迟的同步计时器实例启动
  10. 7 基于硬件事件停止正在运行的计时器
  11. 8 动态 PWM 更新:占空比和时间周期调整
    1. 8.1 影子加载和影子比较功能
    2. 8.2 使用 DMA 生成任意信号
  12. 9 总结
  13. 10参考资料

使用辅助捕获/比较通道

TIMA0 具有 4 条外部通道和 2 条内部 CC 通道,可独立用于生成 3 个相移 PWM。这可通过利用内部 CC 通道的 SECONDARY CC 事件来实现。GPTIMER 提供通过配置 CCCTL.CC2SELD 或 CCCTL.CC2SELU 来选择辅助 CC 通道的功能,具体取决于计数模式(递减、递增、递增/递减)。

 以辅助通道方法使用 TIMA0 生成非对称 PWM 的示意图图 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 通道:

  • 在 TIMA.CTRCTL 中,为以下各项设置所需的计数器控制设置:
    • 计数模式 (CM) 和启用后计数值 (CVAE)。
    • CLC、CZC 和 CAC,用于指定控制计数器清零、前进或加载的条件
  • 设置 TIMA.LOAD 值以配置 PWM 周期
  • 对于比较模式,设置 TIMA.CCCTL_xy[0/1].COC=0
  • 通过设置 CCPD 寄存器中的相应位,将 CCP 配置为 CC 块的输出。
  • 在 TIMA.OCTL_xy[0/1] 中,设置 CCPO = 0 以选择信号发生器输出。
  • 通过针对相应计数器 n 将 ODIS.C0CCPn 设置为 0 来启用相应的 CCP 输出。
  • 使用 CCPOINV 位配置信号的极性,并配置 CCPIV 以指定计数器禁用时的 CCP 输出状态。
  • 将 CC0 的 CCCTL.CC2SELD 字段配置为 3,表示 CC3 用作辅助 CC 块。
  • 将 CC1 的 CCCTL.CC2SELD 字段配置为 4,表示 CC4 用作辅助 CC 块。
  • 将 CC2 的 CCCTL.CC2SELD 字段配置为 5,表示 CC5 用作辅助 CC 块。
  • 根据所需的相移配置 CC3。例如,如果需要 500 个 TIMCLK 周期的相移,则配置 CC3= 加载值 – 500 = 9500。
  • 根据所需的相移配置 CC4。例如,如果需要 1000 个 TIMCLK 周期的相移,则配置 CC4= 加载值 – 1000 = 9000。
  • 根据所需的相移配置 CC5。例如,如果需要 2000 个 TIMCLK 周期的相移,则配置 CC5= 加载值 – 2000 = 8000。
  • 根据所需的占空比配置 CC0、CC1、CC2,分别以 CC3、CC4 和 CC5 为基准。
  • CC3、CC4 和 CC5 值将分别用作 CC0、CC1 和 CC2 的伪加载值。
  • 将 CC0、CC1 和 CC2 的 CCACT.CC2DACT 配置为 0x1,以在计数器分别达到 CC3、CC4 和 CC5 值时将输出设置为高电平。
  • 将 CC0、CC1 和 CC2 的 CCACT.CDACT 配置为 0x2,以在计数器分别达到 CC0、CC1 和 CC2 值时将输出置为低电平。
  • 通过设置 TIMA.CTRCTL.EN = 1 来启用计数器。
/* 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。

 使用 TIMA0 辅助事件生成相移 PWM图 3-3 使用 TIMA0 辅助事件生成相移 PWM