2. PWM硬件原理:定时器与PWM的关系、PWM输出通道、PWM频率与分辨率的关系

讲PWM,绕不开定时器。很多新手上来就调PWM参数,调了半天波形不对,其实就是没搞懂定时器是怎么“变”出PWM的。这一节我把这三块掰开揉碎了讲清楚。

2.1 定时器与PWM的关系

说白了,PWM就是定时器的一个“副业”。定时器本来是用来计时的,但工程师们发现,只要在计数过程中加几个比较器,就能输出方波。

我习惯把定时器想象成一个“电子秒表”:

  • 它从0开始往上数(或者往下数)
  • 数到某个值,触发一次动作
  • 数到最大值,自动归零重来

PWM就是利用这个“数到某值就翻转电平”的机制。你看下面这张图就明白了:

定时器与PWM生成原理 定时器计数值(锯齿波/三角波) 比较值(CCR) 自动重装载值(ARR) PWM输出波形 关键寄存器: • ARR(自动重装载寄存器):决定PWM周期 • CCR(捕获/比较寄存器):决定占空比 • CNT(计数器):实时计数值,与CCR比较产生翻转

核心逻辑就一句话:CNT数到CCR就翻转,数到ARR就归零。ARR决定周期,CCR决定高电平宽度。

我的习惯:调试PWM时,先看ARR值对不对,再看CCR值。ARR错了,整个周期都歪了,CCR调得再准也没用。

2.2 PWM输出通道

一个定时器通常有多个通道。比如STM32的TIM2,有4个通道,每个通道都能独立输出PWM。

你想想看,这意味着什么?一个定时器就能同时控制4路电机或者4个LED,而且它们共用同一个时钟基准,相位天然同步。

我整理了一下常见的通道配置:

定时器 通道数 输出引脚 复用功能
TIM2 4 PA0-PA3 / PA15, PB3, PB10, PB11 通用定时器,16位
TIM3 4 PA6, PA7, PB0, PB1 / PC6-PC9 通用定时器,16位
TIM1 4 PA8-PA11 / PE9, PE11, PE13, PE14 高级定时器,支持互补输出
TIM8 4 PC6-PC9 / PE5, PE7, PE9, PE11 高级定时器,支持刹车功能

每个通道的工作原理是一样的,但输出引脚不同。选通道其实就是选引脚——你得看PCB上那个引脚连到了哪里。

我曾经踩过的坑:有一次我选了TIM2_CH1,但没注意这个引脚被板上的一个上拉电阻拉高了。结果PWM输出一直高电平,查了半天才发现是硬件冲突。所以选通道前,一定先看原理图,确认引脚没有被其他外设占用。

2.3 PWM频率与分辨率的关系

这是最容易被忽略的地方。频率和分辨率,就像鱼和熊掌——你很难兼得。

先看公式:

PWM频率 = 定时器时钟 / (ARR + 1) / (预分频系数 + 1)
分辨率 = 1 / (ARR + 1) × 100%

ARR越大,分辨率越高,但频率越低。反过来,想要高频,ARR就得小,分辨率就跟着降。

举个例子你就明白了:

场景 时钟频率 预分频 ARR PWM频率 分辨率
LED调光 72 MHz 71 999 1 kHz 0.1% (1000级)
电机控制 72 MHz 0 719 100 kHz 0.14% (720级)
音频输出 72 MHz 0 35 2 MHz 2.78% (36级)

看到没?LED调光需要细腻的亮度变化,所以分辨率要高,频率1kHz就够了。电机控制需要高频来降低噪音,分辨率可以牺牲一点。音频输出需要2MHz以上的载波,分辨率就只能降到36级——这时候波形会明显有阶梯感。

我的经验法则:

  • LED调光:频率 > 100Hz,分辨率 > 256级(8位)
  • 直流电机:频率 10kHz-50kHz,分辨率 > 100级
  • 舵机控制:频率 50Hz,分辨率 > 1000级
  • 音频DAC:频率 > 1MHz,分辨率看需求

嗯,这里要注意一点:分辨率不是越高越好。16位分辨率(65536级)看起来很美好,但ARR=65535,如果时钟72MHz不分频,PWM频率只有1098Hz。很多应用根本用不了这么低的频率。

我建议:先确定应用需要的PWM频率,再反推ARR最大值,最后看分辨率能不能接受。如果分辨率不够,要么提高时钟频率,要么换更高主频的芯片。

最后总结一下这三者的关系:

  • 定时器是PWM的“心脏”,提供计数和比较机制
  • 输出通道是PWM的“手脚”,决定信号从哪个引脚出去
  • 频率与分辨率是PWM的“性能指标”,受ARR和时钟共同约束