1. PWM 基础概念:从波形到实战
各位同学好,我是老周。做嵌入式这些年,PWM 是我打交道最多的外设之一。今天咱们就从最基础的东西聊起——什么是 PWM,它的两个核心参数,以及到底能用在哪些地方。
你可能会想,PWM 不就是个方波吗?嗯,对,也不全对。它背后藏着不少门道。
1.1 什么是 PWM
PWM,全称 Pulse Width Modulation,脉冲宽度调制。说白了,就是通过调节脉冲的宽度来模拟一个连续变化的信号。
我习惯这么理解:你有一个开关,只能开或关。但如果你开关的速度足够快,并且控制每次开的时间比例,就能让负载感受到一个介于 0 和 100% 之间的效果。比如 LED 灯,快速闪烁时人眼就感觉它在半亮。
核心思想:数字引脚只能输出高电平或低电平,但通过快速切换并控制高电平的持续时间,就能模拟出模拟量输出效果。
举个例子,我早期做的一个项目里,需要用一个 GPIO 控制加热丝的功率。没有 DAC,怎么办?PWM 就是答案。50% 占空比,加热丝就工作在 50% 功率。简单粗暴,但有效。
1.2 占空比与频率
这两个参数是 PWM 的灵魂。搞不懂它们,后面优化就无从谈起。
占空比(Duty Cycle)
占空比,就是一个周期内高电平时间占总周期的百分比。
- 0% 占空比:一直低电平,相当于关断。
- 100% 占空比:一直高电平,相当于直通。
- 50% 占空比:一半时间高,一半时间低。
我曾经踩过一个坑:用 8 位定时器做 PWM,占空比寄存器写 255 对应 100%,写 0 对应 0%。但有个芯片的计数器是从 0 到 255 共 256 个周期,所以 50% 占空比对应的值不是 128,而是 127。这种细节,手册不仔细看真容易翻车。
频率(Frequency)
频率就是 PWM 信号每秒钟重复的次数,单位 Hz。频率决定了 PWM 的「细腻程度」和「响应速度」。
| 应用场景 | 典型频率范围 | 说明 |
|---|---|---|
| LED 调光 | 100 Hz - 1 kHz | 低于 100 Hz 人眼会看到闪烁 |
| 电机控制 | 1 kHz - 50 kHz | 太低电机抖动,太高开关损耗大 |
| 音频输出 | 20 kHz - 200 kHz | 需要避开人耳可听范围 |
| 开关电源 | 50 kHz - 2 MHz | 高频可减小变压器体积 |
我的经验:选频率时先看负载特性。LED 调光用 500 Hz 左右就挺好,既省电又不闪。电机控制我一般从 10 kHz 起步,再根据噪音和发热微调。
1.3 PWM 的应用场景
PWM 的应用范围很广,我挑三个最常见的说说。
电机控制
直流电机调速,PWM 是标准方案。通过改变占空比,就能控制电机转速。
我记得第一次做小车项目时,直接用 100% 占空比让电机全速跑,结果小车直接窜出去了。后来加了 PID 配合 PWM,才让速度稳下来。
这里有个关键点:电机是感性负载,PWM 频率不能太低。否则电机会发出尖锐的啸叫声,那是线圈在振动。我一般设 10 kHz 以上,人耳就听不到了。
LED 调光
LED 调光可能是大家接触最多的 PWM 应用。手机屏幕亮度调节、台灯调光,背后都是 PWM。
为什么不用调电阻?因为 LED 是电流型器件,调电阻会导致色温偏移。PWM 调光保持 LED 工作在额定电流,只改变点亮时间,色温不变。
注意:LED 调光的 PWM 频率不能太低。低于 100 Hz 人眼能感知到闪烁,长时间看容易疲劳。我建议至少 200 Hz 起步,最好 1 kHz 以上。
音频输出
用 PWM 做音频输出,本质上是用高频 PWM 信号经过低通滤波器还原出模拟音频波形。
这个我踩过坑。有次想用单片机播放一段提示音,直接用 8 位 PWM 加 RC 滤波。结果声音又小又失真。后来换成 12 位分辨率的 PWM,频率提到 200 kHz,滤波后效果才勉强能听。
音频 PWM 对分辨率要求高。8 位只有 256 级,动态范围不够。至少 10 位以上,配合高阶滤波器,才能得到可用的音质。
1.4 PWM 知识体系总览
下面这张图把本章的核心知识点串起来了。你可以把它当作后续学习的路线图。
1.5 小结
这一章我们聊了 PWM 的本质——用数字信号模拟模拟效果。占空比控制输出大小,频率控制响应速度。三个典型应用各有侧重:电机看频率和功率,LED 看闪烁和色温,音频看分辨率和滤波。
我个人觉得,PWM 是嵌入式开发里性价比最高的外设之一。一个定时器加一个 GPIO,就能实现调速、调光、调音。但用好它,需要对参数有深刻理解。后面的章节,我会带你一步步深入,从配置到优化,把 PWM 的性能榨干。