3. PWM调光技术:从原理到实战

说到LED调光,PWM绝对是绕不开的核心技术。我做了这么多年LED驱动,可以说90%以上的调光方案都离不开它。今天咱们就把它彻底讲透。

3.1 PWM调光原理

PWM,全称是脉冲宽度调制。说白了,就是通过快速开关LED,用眼睛的视觉暂留效应来模拟亮度变化。

你想想看,LED要么全亮,要么全灭。那怎么调光呢?

答案很简单:让LED在「亮」和「灭」之间快速切换。亮的时间长,灭的时间短,人眼就觉得亮;反过来就觉得暗。这就是PWM的核心思想。

关键公式:

平均亮度 = 全亮亮度 × 占空比

占空比 = 导通时间 / 周期时间 × 100%

举个例子。假设周期是1ms,LED亮0.5ms、灭0.5ms,占空比就是50%。这时候你看到的亮度,大约是满亮度的50%。

我在项目中遇到过一个问题:有客户说LED亮度调不低,最低只能到30%。后来一查,是PWM频率太低,LED在低占空比时出现了明显的闪烁。嗯,这里要注意,频率选择很关键。

3.2 频率选择:避开频闪与噪声

频率选多少合适?这问题我当年也纠结过。直接说结论:

应用场景 推荐频率 说明
美容仪LED 1kHz - 5kHz 人眼无感知,驱动效率高
摄影补光 10kHz - 20kHz 避免相机快门产生条纹
高精度仪器 20kHz以上 避开人耳可听范围

为什么会这样?

频率太低(比如100Hz以下),人眼能感觉到闪烁,用久了眼睛会累。频率太高(比如100kHz以上),MOS管的开关损耗会急剧增加,驱动效率下降。

避坑指南:

我曾经在一个美容仪项目里用了2kHz的PWM,结果用户反馈说能听到「滋滋」声。后来发现是LED驱动电感的啸叫。解决办法是把频率调到4kHz,刚好避开人耳敏感区。

还有一个坑:如果你用手机摄像头拍LED灯,看到闪烁条纹,那就是频闪。美容仪产品最好用1kHz以上,这样手机拍出来也是稳定的。

3.3 占空比与光强关系

很多人以为占空比和光强是线性关系。其实不然。

我实测过很多LED,结果是这样的:

占空比 理论光强 实际光强 偏差
10% 10% 8.5% -1.5%
50% 50% 48% -2%
90% 90% 89% -1%

偏差主要来自两个地方:

  • LED开启延迟:从PWM信号发出到LED真正亮起来,有几十纳秒的延迟
  • 驱动电路响应:恒流源的建立时间会影响低占空比的精度

我个人习惯在低占空比区域做软件补偿。比如目标10%占空比,实际给到11%,这样光强就更准了。

小技巧:

如果你需要非常线性的调光曲线,可以用查表法。先实测一组数据,然后反向拟合。我一般用20个点做线性插值,效果已经很好了。

3.4 软件PWM vs 硬件PWM

这是很多新手会纠结的问题。我直接说结论:

硬件PWM:用芯片自带的PWM外设。定时器自动翻转IO口,CPU不用管。

软件PWM:用定时器中断,在中断里手动翻转IO口。

来看看对比:

对比项 硬件PWM 软件PWM
CPU占用 几乎为0 高(中断频繁)
频率精度 受中断影响
通道数 有限(看芯片) 理论上无限
实现难度 简单 稍复杂

我个人的建议是:

  • 如果芯片有硬件PWM,优先用硬件。省心、稳定、不占CPU。
  • 如果通道不够用,或者芯片没有PWM外设,才考虑软件PWM。

这里给一个软件PWM的示例代码(基于STM32):

// 软件PWM实现
// 假设定时器1ms中断一次

uint8_t pwm_duty = 50;  // 占空比 0-100
uint8_t pwm_counter = 0;

void TIM_IRQHandler(void) {
    if(TIM_GetITStatus(TIM2, TIM_IT_Update)) {
        pwm_counter++;
        if(pwm_counter >= 100) {
            pwm_counter = 0;
        }
        
        if(pwm_counter < pwm_duty) {
            GPIO_SetBits(GPIOA, GPIO_Pin_0);  // LED亮
        } else {
            GPIO_ResetBits(GPIOA, GPIO_Pin_0); // LED灭
        }
        
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    }
}

这段代码很简单。每1ms进一次中断,计数器加1。当计数器小于占空比时,LED亮;否则灭。这样周期就是100ms,频率10Hz。

但注意,10Hz太低了,会闪。实际用的时候,把定时器改成100μs中断一次,周期100次,就是1kHz了。

软件PWM的坑:

我曾经在一个项目里用软件PWM控制8路LED,结果CPU负载飙到80%。后来发现是中断太频繁了。解决办法是改用硬件PWM,CPU负载直接降到5%。

所以,能用硬件就别用软件。这是血的教训。

3.5 实战经验总结

最后,把我这些年做PWM调光的经验总结一下:

  1. 频率选1kHz-5kHz,美容仪够用,人眼无感,驱动效率高
  2. 低占空比做补偿,实测+查表,保证线性度
  3. 优先硬件PWM,省CPU、精度高、稳定
  4. 注意电感啸叫,频率避开人耳敏感区(2kHz-4kHz)
  5. 用示波器看波形,别光靠眼睛判断

PWM调光说难不难,说简单也不简单。关键是把原理吃透,再结合实际情况灵活应用。希望这些经验能帮你少走弯路。