PWM 占空比怎么算:周期、平均电压与调光调速实战
讲清 PWM 占空比的算法,占空比等于高电平时间除以周期,如何由占空比推出平均电压,频率和周期的倒数关系,以及在 Arduino、电机和 LED 调光里该怎么选频率。
PWM 占空比怎么算:周期、平均电压与调光调速实战
第一次用单片机控制电机时,我盯着数据手册里一堆 prescaler、compare 寄存器发懵。后来才明白,真正要握住的概念只有一个:占空比。把占空比这件事想透,LED 调光、电机调速、舵机控制,本质上都是同一道算术题。这篇就把这道题拆开讲清楚。
占空比到底是什么
PWM 是脉宽调制,引脚不停地在高电平和低电平之间切换。一个完整的开关循环叫一个周期,而占空比指的是:一个周期里,信号保持高电平的那部分占了多大比例,用百分比写出来。
核心公式只有一句:占空比等于高电平时间除以周期。
50 占空比,就是引脚一半时间高、一半时间低,画出来是一条对称方波。占空比越大,送到负载的能量越多,所以它正是你调暗 LED、放慢电机时要拧的那个旋钮。0 占空比代表引脚一直低,100 占空比代表引脚一直高,这两个端点其实是稳定直流,已经不再"开关"了。
频率和周期:互为倒数
要算高电平时间,先得有周期,而周期来自频率。两者是倒数关系:
周期 T 等于 1 除以频率 f。
频率是每秒发生多少个完整周期,单位赫兹。1 kHz 的信号每秒重复 1000 次,所以每个周期 T 等于 1 除以 1000 等于 0.001 秒,也就是 1 毫秒。20 kHz 的电机驱动载波,周期则是 50 微秒。
这里最容易翻车:把频率和周期填反。本想填 1 kHz 频率,却往周期框里填了 1000,算出来差一百万倍。记住频率单位是 Hz、周期单位是秒,两个数互为倒数,就不会错。我习惯先用 PWM 占空比计算器 把频率换算成周期,再往下推,省得心算出岔子。
一个完整的算例
把上面两步串起来,看一个真实例子。
设频率 1 kHz、占空比 50:
- 周期 T 等于 1 除以 1000,得 1 毫秒。
- 高电平时间 t_on 等于 T 乘 0.5,得 500 微秒。
- 低电平时间 t_off 等于 1 毫秒减 500 微秒,得 500 微秒。
如果电源是 5 V,平均电压 Vavg 等于 5 乘 0.5,正好是一半,即 2.5 V。这就是那条最直观的结论:50 占空比下,平均电压恰好是电源电压的一半。
占空比怎么变成平均电压
对于响应速度远慢于 PWM 频率的负载,它感受到的有效电压就是一个周期内的平均值:
平均电压 Vavg 等于电源电压 Vcc 乘占空比。
5 V 电源、40 占空比平均 2 V,60 占空比平均 3 V。PWM 正是靠这点来调暗 LED 或设定加热档位,而不用变阻器白白发热。但有个前提:负载得够慢,或者经过电容滤波,看到的才是平滑的平均值。直接盯着一颗高频闪动的 LED 看,你眼睛接收的还是完整的 Vcc 脉冲,不是那个平滑的 2.5 V。把平均电压当成峰值,是新手第二常踩的坑。
Arduino、电机和 LED 调光怎么选频率
频率不是越高越好,要看负载。
LED 调光:一般要高于约 200 Hz 才不闪烁,1 kHz 以上是稳妥默认值,还能避开相机果冻效应留下的条纹。在 Arduino 上,你算出占空比后,直接换成 analogWrite 的 0 到 255 值或定时器比较值写进去就行。
电机调速:有刷直流电机几百赫兹到几千赫兹都能转,但低频会嗡嗡作响。很多设计把频率推到 20 kHz,让开关声落在人耳听觉之上,运行就安静了。
舵机是例外:它要固定约 50 Hz 的帧,读的是 1 到 2 毫秒的脉宽,而不是占空比百分比。算下来占空比只有 5 到 10。如果你不小心把舵机设成 50 占空比,等于发出 10 毫秒脉冲,会把它死顶到限位上。
调光时除了占空比,限流电阻也得配好,这部分可以用 LED 限流电阻计算器 一起算清楚。固件里量到的高电平脉宽对不上预期时,把示波器读数和频率填回计算器反解占空比,马上就知道是分频还是比较值差了一档。
小结
记住三个关系就够用:占空比等于高电平时间除以周期,周期等于 1 除以频率,平均电压等于电源电压乘占空比。剩下的无非是把单片机的寄存器值对应到这三个数上。把算术交给工具,你就能把精力留给电路本身。
Made by Toolora · Updated 2026-06-13