新唐MCU技术
直播中

话多显蠢

10年用户 890经验值
擅长:479461
私信 关注
[问答]

请问如何为 NuMicro® M451 系列中的 PWM 设置计数器同步?

如何为 NuMicro® M451 系列中的 PWM 设置计数器同步?

回帖(2)

宣苗

2025-8-29 15:45:36
完成所需的 PWM 设置后,添加以下代码:
/* 启用 PWM0、PWM2、PWM4 定时器同步 */
PWM_ENABLE_TIMER_SYNC(PWM0, BIT0|BIT2|BIT4);    
/* 启动 PWM */
PWM0->SSTRG = 1;
举报

小黑羊

2025-9-3 18:03:31

为 NuMicro® M451 系列微控制器中的 PWM 模块设置计数器同步,主要是通过控制特定的寄存器来实现多个 PWM 通道(在同一 PWM 组内)的计数器值同时更新或归零,以实现精确的相位控制或多通道波形对齐。以下是详细的步骤说明:


核心概念:



  1. 同步源: 触发同步操作的事件源(例如:软件强制同步、外部信号、周期匹配、零匹配等)。

  2. 同步目标: 需要被同步的 PWM 通道的计数器。

  3. 同步行为: 目标计数器的数值被强制更新为预设的同步值(通常为 0,即重新计数)。


设置步骤:




  1. 选择 PWM 组和目标通道:



    • 确定你使用的是 PWM0 还是 PWM1 组。

    • 确定组内哪些 PWM 通道(例如 PWM0_CH0, PWM0_CH1, ..., PWM0_CH5)需要被同步。通常一个组内的所有通道都能被同步。




  2. 配置 PWM 基本模式 (可选,但推荐):



    • 在启用 PWM 计数器之前,通过 PWMx->CTL (x=0或1) 寄存器设置 PWM 计数器的核心工作模式:

      • Counter Type (MODE): 通常设置为 Dual-Edge Mode (0x2) 用于中心对齐 PWM (计数器从 0 递增到 CMPDAT,再从 CMPDAT 递减回 0),或 Auto-Reload Mode (0x0) 用于边沿对齐 PWM (计数器从 0 递增到 CMPDAT 后自动归零)。

      • Counter Synchronization Mode (SYNC): 关键设置! 此位决定计数器何时接受同步。强烈建议设置为 SYNC = 1 (Synchronous update mode)。这意味着计数器的更新(包括同步操作和周期/占空比寄存器更新)只在计数器溢出或归零时才会真正生效,确保相位稳定。





  3. 配置 PWM 计数器操作模式:



    • 通过 PWMx->SYNC (x=0或1) 寄存器 (同步控制寄存器) 进行配置:

      • SYNC_PWMEN (Synchronization Mode Enable): 设为 1,以启用该 PWM 组的同步功能。

      • SYNCMODE (Synchronization Mode): 关键设置!

        • 0: One-Shot Mode: 计数器只在下一个同步源事件发生时被同步一次。之后需要新的同步源事件或软件重新触发。

        • 1: Interval Mode: 计数器在每次同步源事件发生时都会被同步。这是实现周期性同步/重对齐的常用模式。


      • SYNC_CNTEN (Counter Enable Control):可选。是否同步使能/禁用计数器。通常保留为 0。

      • SYNCSRCMODE (Synchronization Source Mode):可选。选择同步触发源信号的类型(0=外部引脚/事件,1=内部事件),但通常通过 SYNC_SRC_CTLPCNTSR 选择具体源,此处可暂时保留。

      • SYNC_PWMDIR (Direction Control in Synchronous Mode):可选。是否在同步时改变计数方向。通常保留为 0。

      • SYNC_SRC_CNTEN (Synchronization Source Counter Enable Control):可选。更复杂的计数器启停同步控制,通常保留为 0。





  4. 选择并配置同步源:



    • 通过 PWMx->SYNC_SRC_CTL (x=0或1) 寄存器 (同步源控制寄存器) 配置:

      • EXT_SYNC_SRC (External Synchronization Source)关键选择! 指定一个具体的同步信号源:

        • SYNC_PWM0: PWM0 内部同步源 (如 PWM0_Counter overflow/zero).

        • SYNC_PWM1: PWM1 内部同步源 (如 PWM1_Counter overflow/zero). 注意:PWM0 不能选择 PWM1 作为源,反之亦然,除非使用外部引脚连接。

        • SYNC_TMR0, SYNC_TMR1, ..., SYNC_TMR3: 指定定时器作为源 (T0_EXT, T1_EXT, T2_EXT, T3_EXT).

        • SYNC_BPWM0, SYNC_BPWM1: 指定基本 PWM 模块作为源(BPWM0_EXT, BPWM1_EXT)。

        • SYNC_STADC: 指定系统定时器触发事件 (STADC)。

        • SYNC_PWM0_CNT_ZERO, SYNC_PWM0_CNT_UP_PERIOD, SYNC_PWM0_CNT_DN_PERIOD: PWM0 内部事件(计数器归零、递增计数时达到周期值、递减计数时达到周期值)。

        • SYNC_PWM1_CNT_ZERO, SYNC_PWM1_CNT_UP_PERIOD, SYNC_PWM1_CNT_DN_PERIOD: PWM1 内部事件。


      • 选择最适合你的应用场景的源。例如:

        • 如果需要所有 PWM 通道同时从 0 开始计数,可以使用 SYNC_PWMx_CNT_ZERO(设置计数器在归零事件上同步自身或其他通道?仔细看手册。通常需要外部触发或软件触发作为源)。

        • 如果你需要由一个外部引脚触发同步事件,你需要配置该引脚为 PWM 的同步输入引脚(通过 SYS->GPx_MFP 配置 EXT_SYNCx 功能),然后在 EXT_SYNC_SRC 中选择一个对应的外部输入源(如 SYNC_TMR0 对应 T0_EXT 引脚功能)。

        • 最常用的是软件同步 (SYNC_SRC_SW) 内部同步源






  5. 配置计数器的同步值:



    • 通过 PWMx->SYNC_UPD_DATA (x=0或1) 寄存器 (计数器同步更新值) 配置:

      • CSUPD: 这是一个 16 位的值。当同步事件发生时,PWM 计数器会立刻被设置成这个值

      • 通常设置为 0x0000:这意味着在同步事件发生时,所有目标通道的计数器都被重置为 0,确保它们精确地在同一时刻从起点开始计数(周期匹配或零匹配)。你也可以设置成其他值来定义一个特定的起始点。





  6. 启用通道同步(指定同步目标):



    • 通过 PWMx->PCNTSR (x=0或1) 寄存器 (PWM 计数器同步寄存器) 配置:

      • 这个寄存器是同步功能的核心使能和触发点

      • 它包含 SYNC_PWM0SYNC_PWM5(或该 PWM 组支持的最大通道数)的位域(通常是 BIT0 到 BIT5)。

      • 如果你希望某个通道(如 CH0)在同步事件发生时将其计数器重置为 SYNC_UPD_DATA 的值(通常是 0),那么需要 置位其对应的 SYNC_PWM0 位 (设置为 1)

      • 你需要为所有你想同步的通道设置其对应的位为 1。

      • 例如:要同步 PWM0_CH0, CH2, CH5,那么设置 PWM0->PCNTSR = (1 << 0) | (1 << 2) | (1 << 5);

      • 手动触发一次同步 (重要!):向 PCNTSR 寄存器写入 1 来触发一次同步操作 (这是软件触发同步的关键)。硬件会自动将该位清0(写1清除!)。后续的同步将由步骤 4 中选择的源自动触发(如果配置为内部周期事件)。

        • 手动触发代码通常为:PWM0->PCNTSR = (PWM0->PCNTSR & 0xFFFFFF00) | (1 << N); (其中 N 是触发位字段的偏移量,通常寄存器描述会指出触发位是 BIT0-BITx)。关键在于:M451 的 PCNTSR 寄存器设计为:你需要向要触发同步的通道对应的位写 ‘1’ 来手动触发一次该通道的同步。同时,硬件在同步动作完成后会自动将该位清0。 例如:
          // 假设要手动触发 PWM0_CH0 同步一次:
          PWM0->PCNTSR = (PWM0->PCNTSR & ~PWM_PCNTSR_SYNC_PWM0_Msk) | PWM_PCNTSR_SYNC_PWM0_Msk; // 写入位掩码,将 CH0 的触发位置 1

          (请务必查阅手册 PWM_PCNTSR 寄存器的具体描述,确认触发位的位置和操作行为!)







总结与关键点:



  • 同步目标通道: 通过在 PCNTSR 寄存器中置位相应通道的使能位来选择。

  • 同步行为与时机:

    • 通过 SYNC 寄存器 (SYNC_PWMEN, SYNCMODE, SYNC) 配置同步功能和模式(推荐 SYNCMODE=1 持续同步,SYNC=1 同步更新)。

    • 同步时计数器会被强制置为 SYNC_UPD_DATA 的值(通常是 0)。


  • 同步触发源:

    • 通过 SYNC_SRC_CTL 选择同步源(软件同步、内部事件、外部引脚)。

    • 软件同步通过设置 PCNTSR 对应位(然后写 1)来手动触发。

    • 硬件同步由选定的源自动触发(例如当计数器达到周期值或归零时)。


  • 关键寄存器: PWMx->CTL, PWMx->SYNC, PWMx->SYNC_SRC_CTL, PWMx->SYNC_UPD_DATA, PWMx->PCNTSR

  • 步骤流程:

    1. 基本配置 (CTL).

    2. 配置核心同步功能 (SYNC)。

    3. 选择同步源 (SYNC_SRC_CTL)。

    4. 设置同步值 (SYNC_UPD_DATA).

    5. 使能目标通道同步 (PCNTSR 中置位对应通道位).

    6. 手动触发首次同步 (向 PCNTSR 相应位写入触发值) 或等待硬件源触发。



重要提示:



  1. 仔细阅读手册: NuMicro M451 系列的参考手册 (Reference Manual) 是最终权威。查看 "PWM Controller" 章节,特别是关于 "Synchronization", SYNC, SYNC_SRC_CTL, SYNC_UPD_DATA, PCNTSR 寄存器的详细描述。不同子型号或系列间可能有细微差异。

  2. 时钟配置: 确保你的系统时钟 (HCLK) 和 PWM 时钟 (PCLK / PWMx_CLK) 正确配置和使能。

  3. 引脚复用: 如果使用外部引脚作为同步源 (EXT_SYNCx),需要通过 SYS->GPx_MFP 或类似寄存器正确配置引脚功能。

  4. 寄存器位偏移: 示例代码中的位偏移 (SYNC_PWM0) 是示意。实际编程时请使用厂商提供的 BSP (Board Support Package) 中的寄存器定义宏 (PWM_PCNTSR_SYNC_PWM0_Msk),或者根据手册定义你自己的宏,以确保准确性。

  5. 调试: 使用示波器测量多个 PWM 通道的输出信号,确认同步是否成功(通道上升/下降沿是否在期望的时刻对齐)。特别注意在 SYNC=1 (同步更新模式) 下,周期 (CNR) 或占空比 (CMRx) 寄存器的修改也是在计数器归零时才生效,这会影响相位观察。


按照以上步骤操作,并结合仔细阅读手册和调试,你就能成功地为 NuMicro M451 的 PWM 模块设置计数器同步功能。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分