4. PWM调光原理:PWM基础概念、频率与占空比、调光分辨率、避免频闪的技巧
好,咱们进入调光的核心环节——PWM。说实话,在氛围灯项目里,你要控制颜色,本质上就是在控制三路LED(红绿蓝)的亮度。而控制亮度最常用、最靠谱的手段,就是PWM。
我最早接触PWM,是在做一个小夜灯项目。那时候不懂,直接用可调电阻分压,结果灯的颜色偏得离谱,而且发热严重。后来才明白,LED是电流型器件,调电压远不如调占空比来得精准。嗯,咱们今天就把它彻底讲透。
4.1 PWM基础概念
PWM,全称是脉冲宽度调制。说白了,就是让一个信号在“高电平”和“低电平”之间快速切换。你想想看,如果高电平时间越长,低电平时间越短,那LED看起来就越亮。反之,高电平时间短,LED就暗。
这里有个关键点:人眼有视觉暂留效应。只要切换频率够快,你就感觉不到灯在闪烁,只会觉得亮度变了。这就是PWM调光能成立的根本原因。
我在项目中遇到过一位新手,他问:“为什么不用DAC直接输出模拟电压?”我的回答是:DAC成本高、效率低,而且容易受温度影响。PWM就简单多了,一个定时器加一个GPIO引脚,搞定。
核心公式:
LED亮度 ≈ 占空比 × 最大亮度
占空比 = 高电平时间 / (高电平时间 + 低电平时间)
4.2 频率与占空比
这两个参数是PWM的灵魂。咱们分开说。
频率
频率决定了PWM信号每秒钟切换多少次。单位是赫兹(Hz)。
- 低频(< 100Hz):人眼能明显感觉到闪烁。我建议别用,除非你想做频闪效果。
- 中频(100Hz - 1kHz):大部分情况下够用。但要注意,如果摄像头拍摄,可能会看到条纹。
- 高频(> 1kHz):人眼完全感觉不到闪烁。我个人习惯用1kHz到5kHz之间。
为什么会这样?因为人眼的视觉暂留时间大约是1/24秒,也就是约41.7毫秒。如果PWM周期比这个长,你就会看到一亮一灭。所以,频率至少要高于100Hz,最好在1kHz以上。
占空比
占空比决定了亮度。0%就是全灭,100%就是全亮。中间值对应不同亮度。
举个例子:
// 假设PWM周期为1ms(频率1kHz)
// 占空比50%:高电平0.5ms,低电平0.5ms
// 占空比25%:高电平0.25ms,低电平0.75ms
// 伪代码示例
void set_pwm_duty(uint8_t duty) {
// duty范围:0-255
OCR1A = duty; // 设置比较值
}
我记得有一次,客户要求灯在最低亮度时不能完全熄灭。我就在代码里加了个判断:如果占空比小于5,就强制设为5。这样既保证了最低亮度可见,又不会出现“死区”。
4.3 调光分辨率
调光分辨率,说白了就是你能把亮度分成多少级。比如8位分辨率,就是0-255共256级。10位分辨率,就是0-1023共1024级。
| 分辨率 | 级数 | 适用场景 |
|---|---|---|
| 8位 | 256 | 基础氛围灯,够用 |
| 10位 | 1024 | 中高端产品,过渡平滑 |
| 12位 | 4096 | 专业级调光,几乎无阶梯感 |
| 16位 | 65536 | 电影级,但MCU资源消耗大 |
我个人建议,对于大多数氛围灯项目,8位分辨率就足够了。为什么?因为人眼对亮度的分辨能力有限,256级已经很难看出阶梯感。除非你做的产品要跟专业摄影灯竞争,那才需要更高分辨率。
不过要注意一点:分辨率越高,PWM频率就越难做高。因为定时器的计数周期变长了。比如你用16位分辨率,频率可能只能做到几百赫兹。这时候就要权衡了。
我的经验:
如果MCU资源紧张,可以用8位分辨率配合1kHz频率。如果追求极致平滑,用10位分辨率配合500Hz频率。别盲目追求高分辨率,够用就好。
4.4 避免频闪的技巧
频闪是PWM调光最大的坑。你想想看,如果灯在闪烁,人眼虽然感觉不到,但大脑会疲劳。长期下来,用户会觉得眼睛酸胀、头痛。所以,避免频闪是必须的。
我曾经在一个项目中,用了200Hz的PWM频率,结果客户反馈说“灯看着不舒服”。我一开始没当回事,后来用手机摄像头一拍,发现画面里全是条纹。这才意识到问题。
下面是我总结的几个技巧:
- 提高PWM频率:至少1kHz,最好5kHz以上。频率越高,人眼越难察觉。
- 避免与市电频率共振:在中国,市电是50Hz。如果你的PWM频率是50Hz的整数倍(比如100Hz、200Hz),可能会与灯光频闪叠加,产生“拍频”效应。我建议避开这些频率。
- 使用恒流驱动:PWM调光时,LED的电流变化很快。如果驱动电路响应慢,就会出现“拖尾”现象,导致亮度不均匀。恒流驱动可以解决这个问题。
- 软件滤波:在改变占空比时,不要一步到位。而是用渐变的方式,比如每次增加或减少1,间隔几毫秒。这样人眼感觉更自然。
- 硬件去耦:在LED供电端加一个电容,可以平滑电流波动。我一般用10μF的陶瓷电容,效果不错。
注意:
如果你用手机摄像头测试频闪,记得把快门速度调低。有些手机有“防频闪”模式,会干扰测试结果。最好用专业的光学频闪仪。
嗯,说到测试,我有个小技巧:拿一个旋转的风扇,对着灯光看。如果风扇叶片看起来是静止的,说明有频闪。如果看起来是模糊的,说明没有。这个方法虽然不精确,但快速有效。
最后,总结一下:PWM调光的核心就是频率和占空比。频率决定是否闪烁,占空比决定亮度。分辨率决定了调光的细腻程度。而避免频闪,需要从硬件和软件两方面入手。你想想看,把这些都掌握了,一个氛围灯的颜色控制,基本就稳了。
下一节,咱们会讲如何用PWM控制RGB三路LED,实现颜色混合。到时候,我会分享一个我踩过的坑——关于颜色校准的。敬请期待。