1. PWM 基础概念:从原理到实战
各位同学,咱们今天聊聊 PWM。说实在的,这玩意儿在嵌入式领域太常见了。我刚开始学单片机那会儿,总觉得 PWM 是个挺玄乎的东西——不就是方波嘛,有啥好讲的?后来做项目多了才发现,越是基础的东西,理解透了越能玩出花来。
1.1 什么是 PWM?
PWM,全称 Pulse Width Modulation,中文叫脉冲宽度调制。说白了,就是通过调节脉冲的宽度来控制平均电压。
你想想看,如果我们有一个开关,一秒钟开关 1000 次,每次开的时间不一样,那负载上得到的平均电压也就不一样。这就是 PWM 的核心思想——用数字信号模拟模拟量。
核心公式:
平均电压 = 高电平电压 × 占空比
比如 5V 系统,占空比 50%,平均电压就是 2.5V
我在做第一个智能灯项目时,就用了 PWM 调光。当时客户要求灯光从 0% 到 100% 平滑变化,我直接用定时器输出 PWM,占空比从 0 逐步增加到 100%,效果非常顺滑。嗯,这里要注意——如果步进太大,人眼能感觉到闪烁,那就翻车了。
1.2 PWM 的两个关键参数
搞懂 PWM,你只需要抓住两个东西:频率和占空比。
| 参数 | 定义 | 单位 | 典型值 |
|---|---|---|---|
| 频率 | 每秒钟脉冲重复的次数 | Hz | 50Hz ~ 几十 kHz |
| 占空比 | 高电平时间占整个周期的比例 | % | 0% ~ 100% |
频率怎么选?
- 控制舵机:50Hz(周期 20ms),这是舵机标准协议
- 电机调速:几百 Hz 到几十 kHz,太低会听到啸叫
- LED 调光:100Hz 以上,避免人眼感知闪烁
占空比怎么用?
- 占空比 0%:一直低电平,相当于关
- 占空比 100%:一直高电平,相当于开
- 占空比 50%:一半时间高,一半时间低
我的经验:做电机调速时,频率别选太低。我曾经试过 50Hz 驱动直流电机,结果电机嗡嗡响,转速还不稳。后来换成 1kHz,问题就解决了。频率太低,电机线圈会感受到明显的脉冲,而不是平滑的电流。
1.3 PWM 的典型应用场景
PWM 的应用范围很广,我挑三个最常见的说说。
电机调速
直流电机的转速和两端电压成正比。通过 PWM 调节平均电压,就能控制转速。占空比越大,电机转得越快。
- 占空比 0%:电机停转
- 占空比 50%:半速运转
- 占空比 100%:全速运转
我做过一个智能小车项目,用 PWM 控制两个轮子的转速差来实现转向。左轮 PWM 大一点,车子就往右拐。原理很简单,但调参调了我一下午——两个电机的特性不完全一样,得做校准。
灯光调光
LED 的亮度和电流有关,但更常用的方法是 PWM 调光。人眼有视觉暂留效应,只要频率够高,看到的亮度就是平均亮度。
- 频率建议:200Hz ~ 1kHz
- 占空比 10%:微光
- 占空比 90%:接近最亮
注意:LED 调光时,频率不能太低。低于 100Hz 人眼能感觉到闪烁,长时间看会眼睛疲劳。我见过有人用 50Hz 做台灯调光,用户反馈眼睛酸——这就是频率没选对。
舵机控制
舵机是咱们这门课的重点。标准舵机通过 PWM 信号控制角度,协议很固定:
- 频率:50Hz(周期 20ms)
- 高电平时间 0.5ms:0°
- 高电平时间 1.5ms:90°
- 高电平时间 2.5ms:180°
说白了,就是通过改变高电平的宽度,告诉舵机"转到哪个位置"。这个咱们后面会详细讲,包括怎么用 STM32 的定时器精确产生这些脉冲。
1.4 PWM 知识体系总览
下面这张图把 PWM 的核心知识点串起来了,你可以对照着看。
1.5 为什么用 STM32 做 PWM?
市面上能输出 PWM 的芯片很多,但 STM32 有几个优势:
- 定时器资源丰富:高级定时器、通用定时器、基本定时器,随便用
- 精度高:16 位计数器,占空比可以精细调节
- 多通道独立输出:一个定时器可以同时输出多路 PWM
- 硬件自动生成:配置好后 CPU 不用管,不占用软件资源
个人建议:初学阶段先用通用定时器(如 TIM2、TIM3)练手。配置简单,不容易出错。等熟悉了再玩高级定时器的互补输出、死区插入这些高级功能。
1.6 避坑指南
做 PWM 项目,有几个坑我踩过,分享给你:
- 频率和占空比搞混:频率决定周期,占空比决定高电平宽度。别把两者弄反了。
- 舵机频率必须是 50Hz:别想着改频率让舵机转更快,标准舵机只认 50Hz。
- 电机驱动要加隔离:直接用单片机 IO 口驱动电机?等着烧芯片吧。加个 MOS 管或者驱动芯片。
- LED 调光注意人眼感知:频率低于 100Hz 会闪烁,高于 1kHz 可能产生音频噪声。
我曾经犯过的错:做第一个舵机项目时,我把频率设成了 100Hz,结果舵机一直抖,怎么调占空比都没用。查了半天资料才发现——标准舵机只认 50Hz,周期必须是 20ms。从那以后,我每次用舵机第一件事就是确认频率。