第2章:PWM基础概念:PWM工作原理、占空比与频率、PWM分辨率与精度

各位同学,咱们今天聊聊PWM。说实话,PWM这东西在嵌入式开发里太常见了。调个灯、控个电机、模拟个DAC,哪哪都离不开它。我刚开始做嵌入式那会儿,总觉得PWM不就是方波嘛,有啥好研究的?后来踩了几个坑才明白,这里面的门道还真不少。

2.1 PWM工作原理:说白了就是开关

PWM,全称Pulse Width Modulation,脉冲宽度调制。名字挺唬人,原理其实很简单——就是让一个信号在高低电平之间快速切换。你想想看,如果我们让LED灯以极快的速度亮灭,人眼会看到什么?对,一个介于亮和灭之间的亮度。

为什么会这样?因为人眼有视觉暂留效应。LED亮的时候,光信号进入眼睛;灭的时候,视觉细胞还在保持之前的信号。只要切换频率够快,人眼就来不及反应,看到的就是一个平均亮度。

我在项目中遇到过一件事。有一次调试一个呼吸灯效果,PWM频率设得太低,结果灯在闪烁,而不是平滑呼吸。后来把频率提到1kHz以上,效果就对了。嗯,这里要注意:频率的选择直接影响最终效果。

PWM的核心思想就是:通过调节高电平在一个周期内的占比,来模拟一个连续变化的模拟量。说白了,就是用数字信号去骗模拟世界。

核心公式:

平均电压 = 高电平电压 × 占空比

比如5V的PWM信号,占空比50%,平均电压就是2.5V。

2.2 占空比与频率:两个最关键的参数

搞PWM,你首先得搞清楚两个参数:占空比和频率。这两个参数决定了PWM信号的一切。

2.2.1 占空比(Duty Cycle)

占空比,就是高电平时间占整个周期的百分比。公式很简单:

占空比 = (高电平时间 / 周期) × 100%

举个例子:

  • 占空比0%:一直低电平,灯全灭
  • 占空比25%:高电平占1/4周期,灯微亮
  • 占空比50%:高电平占一半,灯半亮
  • 占空比75%:高电平占3/4,灯较亮
  • 占空比100%:一直高电平,灯全亮

我建议你把这个对应关系记牢。实际调试的时候,我经常用示波器看占空比,一眼就能判断出问题在哪。

2.2.2 频率(Frequency)

频率,就是PWM信号每秒钟切换的次数。单位是赫兹(Hz)。频率的倒数就是周期:

周期 = 1 / 频率

频率的选择很讲究。我个人的经验是:

应用场景 推荐频率范围 说明
LED调光 100Hz - 1kHz 太低会闪烁,太高浪费资源
电机控制 1kHz - 20kHz 太低电机抖动,太高MOS管发热
音频DAC 44.1kHz以上 需要满足奈奎斯特采样定理
开关电源 100kHz - 1MHz 高频可以减小变压器体积

避坑指南:我曾经在一个电机驱动项目里,把PWM频率设到了100kHz。结果电机没转起来,MOS管先烧了。后来查资料才知道,MOS管的开关损耗和频率成正比。频率太高,MOS管来不及完全导通或关断,功耗剧增。所以,频率不是越高越好。

2.3 PWM分辨率与精度:别被数字骗了

这两个概念经常被混淆。我刚开始也搞不清楚,后来在项目里吃了亏才明白。

2.3.1 分辨率(Resolution)

分辨率,指的是PWM信号能调节的占空比步进数。说白了,就是你能把占空比分成多少份。

举个例子:

  • 8位PWM:分辨率256级,占空比可以从0/255到255/255
  • 10位PWM:分辨率1024级,占空比从0/1023到1023/1023
  • 16位PWM:分辨率65536级,占空比从0/65535到65535/65535

分辨率越高,你能调节的粒度就越细。比如调LED亮度,8位PWM有256级,人眼基本看不出阶梯感。但如果是调一个精密仪器的电压输出,可能就需要16位甚至更高。

我记得有一次做激光功率控制,用了8位PWM,结果功率调节总是一跳一跳的。换成12位PWM后,调节就平滑多了。嗯,这就是分辨率不够的典型表现。

2.3.2 精度(Accuracy)

精度,是实际输出和理论值之间的偏差。分辨率高不代表精度高。你想想看,就算你有16位分辨率,如果时钟源不准,或者定时器有误差,实际输出的占空比和理论值还是有差距。

影响精度的因素:

  • 时钟源精度:晶振的温漂、老化都会影响
  • 定时器计数误差:特别是高频PWM,计数误差会被放大
  • 输出驱动延迟:GPIO的上升沿和下降沿时间不对称
  • 外部电路影响:RC滤波、负载变化等

重要提醒:分辨率是你能调多细,精度是实际有多准。两者不是一回事。我见过有人用16位PWM做精密控制,结果精度只有8位的水平,就是因为忽略了时钟源误差。选型的时候,一定要同时考虑分辨率和精度。

2.4 三者之间的关系:一个简单的例子

咱们用一个具体的例子来串一下这三个概念。

假设你要用PWM控制一个LED灯的亮度:

  • 频率:你选了1kHz,周期就是1ms。这个频率人眼不会看到闪烁。
  • 占空比:你设了50%,高电平0.5ms,低电平0.5ms。灯半亮。
  • 分辨率:你用8位定时器,占空比可以调256级。从最暗到最亮,有256个档位。
  • 精度:实际输出占空比可能是49.8%或50.2%,取决于时钟和定时器误差。

你看,这三个参数共同决定了PWM的性能。缺一个都不行。

总结一下:

  • 频率决定响应速度,也影响功耗
  • 占空比决定平均输出
  • 分辨率决定调节粒度
  • 精度决定实际效果

好了,这一章的内容就到这里。下一章咱们会深入PWM的硬件实现,看看定时器是怎么生成PWM信号的。到时候我会拿STM32和Linux的PWM子系统来举例,都是实战干货。

记住我今天说的:PWM不难,但细节决定成败。多动手,多拿示波器看波形,慢慢就有感觉了。


公众号:蓝海资料掘金营,微信deep3321