硬件定时器原理:定时器的工作模式、预分频器与自动重装载寄存器、PWM生成模式

各位同学,今天我们来聊聊硬件定时器。说实话,很多做嵌入式开发的朋友,写了几年代码,对定时器的理解还停留在「调个库就能用」的阶段。但你要想真正把PWM性能榨干,就必须把定时器的底层原理吃透。

我个人习惯把定时器比作一个「会数数的闹钟」。它内部有一个计数器,每来一个时钟脉冲就加1,加到某个值就触发事件。听起来简单,但这里面的门道可不少。

定时器的工作模式:不只是数数那么简单

定时器的工作模式,说白了就是「计数器怎么数、数到多少、数完干什么」。我把它归纳为三种核心模式:

  • 向上计数模式:计数器从0开始,一直加到自动重装载值(ARR),然后溢出归零,重新开始。这是最常用的模式,适合生成周期性的定时中断或PWM。
  • 向下计数模式:计数器从ARR开始,一直减到0,然后重新加载ARR值。这种模式在某些特殊场景下有用,比如生成对称的PWM波形。
  • 中心对齐模式:计数器先向上计数到ARR,再向下计数到0,如此往复。这种模式生成的PWM波形是对称的,非常适合电机控制。

核心要点:向上计数和向下计数本质上是「锯齿波」,而中心对齐是「三角波」。这两种波形决定了PWM的生成方式完全不同。

我记得有一次做无刷电机驱动,客户要求极低的转矩脉动。我一开始用的向上计数模式,结果电机在低速时抖得厉害。后来换成中心对齐模式,问题一下就解决了。你想想看,同样的PWM频率,不同的计数模式,效果天差地别。

预分频器与自动重装载寄存器:精度的关键

这两个寄存器,是定时器最核心的配置项。很多新手在这里翻车,我详细说说。

预分频器(PSC)

预分频器的作用,就是把定时器的输入时钟频率降下来。比如你的系统时钟是72MHz,直接给定时器用,计数器跑得太快,可能几微秒就溢出了。这时候就需要预分频器来分频。

预分频器的值是一个16位的寄存器,范围从0到65535。实际的分频系数是 PSC + 1。举个例子:

系统时钟:72 MHz
预分频器值:71
实际定时器时钟:72 MHz / (71 + 1) = 1 MHz
计数器每1微秒加1

我的经验:预分频器的值不要设得太大,否则定时器的分辨率会下降。我一般会先确定需要的PWM频率,然后反推PSC和ARR的值,尽量让ARR的值大一些,这样占空比的调节精度更高。

自动重装载寄存器(ARR)

ARR决定了定时器的计数周期。在向上计数模式下,计数器从0数到ARR,然后归零。所以PWM的周期就是:

PWM周期 = (ARR + 1) × (PSC + 1) / 系统时钟频率

举个例子,你要生成1kHz的PWM,系统时钟72MHz:

1 kHz = 72 MHz / ((ARR + 1) × (PSC + 1))
假设 PSC = 71,则定时器时钟 = 1 MHz
那么 ARR + 1 = 1 MHz / 1 kHz = 1000
所以 ARR = 999

注意:ARR和PSC都是整数,计算时一定要考虑取整带来的误差。我曾经在一个项目中,因为ARR计算时忘了减1,导致PWM频率偏差了0.1%,结果电机在高速运行时产生了明显的振动。这种小细节,往往就是性能瓶颈的根源。

PWM生成模式:边沿对齐与中心对齐

好了,前面铺垫了这么多,终于到PWM生成模式了。这两种模式,我建议你从波形形状上去理解,而不是死记硬背寄存器配置。

边沿对齐模式

边沿对齐模式,也叫「非对称PWM」。它的特点是:PWM脉冲的起始边(上升沿或下降沿)与定时器的计数周期对齐。

  • 在向上计数模式下,计数器从0开始,当计数值小于比较值(CCR)时,输出高电平;大于等于CCR时,输出低电平。计数器溢出时,重新从0开始。
  • 这种模式下,PWM的占空比调节非常灵活,但波形是非对称的。

边沿对齐模式适合大多数通用场景,比如LED调光、舵机控制、简单的电机调速。它的优点是配置简单,占空比更新速度快。

中心对齐模式

中心对齐模式,也叫「对称PWM」。它的特点是:PWM脉冲的中心与定时器的计数周期中心对齐。

  • 计数器先向上计数到ARR,再向下计数到0。在向上计数和向下计数的过程中,都会与CCR进行比较。
  • 这种模式下,PWM波形是对称的,谐波含量更低,电磁干扰(EMI)也更小。

中心对齐模式特别适合电机控制、逆变器、开关电源等对波形质量要求高的场景。我做过一个伺服驱动器项目,客户要求PWM的谐波失真小于1%,用边沿对齐模式怎么调都过不了,换成中心对齐模式,一次通过。

对比项 边沿对齐模式 中心对齐模式
波形形状 非对称(锯齿波) 对称(三角波)
谐波含量 较高 较低
EMI性能 一般 较好
占空比更新 每个周期更新一次 每个周期更新两次(上/下计数)
适用场景 LED调光、舵机、通用PWM 电机控制、逆变器、开关电源

关键区别:边沿对齐模式的PWM分辨率是 ARR + 1,而中心对齐模式的分辨率是 2 × ARR。因为中心对齐模式在向上和向下计数时都会比较,所以有效分辨率翻倍。但代价是PWM频率减半(同样的ARR值下)。

嗯,这里要注意一个坑。中心对齐模式下,占空比的更新时机很关键。如果你在向上计数和向下计数时都更新CCR,可能会导致波形不对称。我建议只在计数器溢出时(即计数到0或ARR时)更新CCR,这样能保证波形的一致性。

定时器PWM生成模式对比 边沿对齐模式 向上计数(锯齿波) PWM脉冲与周期起始对齐 占空比分辨率:ARR+1 适用:LED调光、舵机、通用 中心对齐模式 向上+向下计数(三角波) PWM脉冲与周期中心对齐 占空比分辨率:2×ARR 适用:电机控制、逆变器、电源 核心差异 边沿对齐:锯齿波计数,PWM脉冲与周期起始对齐,分辨率ARR+1 中心对齐:三角波计数,PWM脉冲与周期中心对齐,分辨率2×ARR 根据应用场景选择PWM生成模式

最后,我再说一个实际项目中容易忽略的点。很多人以为PWM频率越高越好,其实不然。频率太高,开关损耗会急剧增加,MOS管发热严重。频率太低,电机可能会发出人耳可闻的噪声。我个人习惯,电机控制用10kHz-20kHz,LED调光用1kHz-5kHz,开关电源用50kHz-200kHz。当然,具体还要看你的硬件设计。