举报
为 NuMicro® M451 系列微控制器中的 PWM 模块设置计数器同步,主要是通过控制特定的寄存器来实现多个 PWM 通道(在同一 PWM 组内)的计数器值同时更新或归零,以实现精确的相位控制或多通道波形对齐。以下是详细的步骤说明:
核心概念:
设置步骤:
选择 PWM 组和目标通道:
PWM0 还是 PWM1 组。PWM0_CH0, PWM0_CH1, ..., PWM0_CH5)需要被同步。通常一个组内的所有通道都能被同步。配置 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)。这意味着计数器的更新(包括同步操作和周期/占空比寄存器更新)只在计数器溢出或归零时才会真正生效,确保相位稳定。配置 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_CTL 和 PCNTSR 选择具体源,此处可暂时保留。SYNC_PWMDIR (Direction Control in Synchronous Mode):可选。是否在同步时改变计数方向。通常保留为 0。SYNC_SRC_CNTEN (Synchronization Source Counter Enable Control):可选。更复杂的计数器启停同步控制,通常保留为 0。选择并配置同步源:
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 内部事件。SYNC_PWMx_CNT_ZERO(设置计数器在归零事件上同步自身或其他通道?仔细看手册。通常需要外部触发或软件触发作为源)。SYS->GPx_MFP 配置 EXT_SYNCx 功能),然后在 EXT_SYNC_SRC 中选择一个对应的外部输入源(如 SYNC_TMR0 对应 T0_EXT 引脚功能)。SYNC_SRC_SW) 或内部同步源。配置计数器的同步值:
PWMx->SYNC_UPD_DATA (x=0或1) 寄存器 (计数器同步更新值) 配置:CSUPD: 这是一个 16 位的值。当同步事件发生时,PWM 计数器会立刻被设置成这个值。0x0000:这意味着在同步事件发生时,所有目标通道的计数器都被重置为 0,确保它们精确地在同一时刻从起点开始计数(周期匹配或零匹配)。你也可以设置成其他值来定义一个特定的起始点。启用通道同步(指定同步目标):
PWMx->PCNTSR (x=0或1) 寄存器 (PWM 计数器同步寄存器) 配置:SYNC_PWM0 到 SYNC_PWM5(或该 PWM 组支持的最大通道数)的位域(通常是 BIT0 到 BIT5)。SYNC_UPD_DATA 的值(通常是 0),那么需要 置位其对应的 SYNC_PWM0 位 (设置为 1)。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。CTL).SYNC)。SYNC_SRC_CTL)。SYNC_UPD_DATA).PCNTSR 中置位对应通道位).PCNTSR 相应位写入触发值) 或等待硬件源触发。重要提示:
SYNC, SYNC_SRC_CTL, SYNC_UPD_DATA, PCNTSR 寄存器的详细描述。不同子型号或系列间可能有细微差异。HCLK) 和 PWM 时钟 (PCLK / PWMx_CLK) 正确配置和使能。EXT_SYNCx),需要通过 SYS->GPx_MFP 或类似寄存器正确配置引脚功能。SYNC_PWM0) 是示意。实际编程时请使用厂商提供的 BSP (Board Support Package) 中的寄存器定义宏 (PWM_PCNTSR_SYNC_PWM0_Msk),或者根据手册定义你自己的宏,以确保准确性。SYNC=1 (同步更新模式) 下,周期 (CNR) 或占空比 (CMRx) 寄存器的修改也是在计数器归零时才生效,这会影响相位观察。按照以上步骤操作,并结合仔细阅读手册和调试,你就能成功地为 NuMicro M451 的 PWM 模块设置计数器同步功能。
举报
更多回帖