第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