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频率,结果客户反馈说“灯看着不舒服”。我一开始没当回事,后来用手机摄像头一拍,发现画面里全是条纹。这才意识到问题。

下面是我总结的几个技巧:

  1. 提高PWM频率:至少1kHz,最好5kHz以上。频率越高,人眼越难察觉。
  2. 避免与市电频率共振:在中国,市电是50Hz。如果你的PWM频率是50Hz的整数倍(比如100Hz、200Hz),可能会与灯光频闪叠加,产生“拍频”效应。我建议避开这些频率。
  3. 使用恒流驱动:PWM调光时,LED的电流变化很快。如果驱动电路响应慢,就会出现“拖尾”现象,导致亮度不均匀。恒流驱动可以解决这个问题。
  4. 软件滤波:在改变占空比时,不要一步到位。而是用渐变的方式,比如每次增加或减少1,间隔几毫秒。这样人眼感觉更自然。
  5. 硬件去耦:在LED供电端加一个电容,可以平滑电流波动。我一般用10μF的陶瓷电容,效果不错。

注意:

如果你用手机摄像头测试频闪,记得把快门速度调低。有些手机有“防频闪”模式,会干扰测试结果。最好用专业的光学频闪仪。

嗯,说到测试,我有个小技巧:拿一个旋转的风扇,对着灯光看。如果风扇叶片看起来是静止的,说明有频闪。如果看起来是模糊的,说明没有。这个方法虽然不精确,但快速有效。

最后,总结一下:PWM调光的核心就是频率和占空比。频率决定是否闪烁,占空比决定亮度。分辨率决定了调光的细腻程度。而避免频闪,需要从硬件和软件两方面入手。你想想看,把这些都掌握了,一个氛围灯的颜色控制,基本就稳了。

下一节,咱们会讲如何用PWM控制RGB三路LED,实现颜色混合。到时候,我会分享一个我踩过的坑——关于颜色校准的。敬请期待。