ZHDA102 March   2026 MSPM0G3519

 

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