第一讲:PWM基础概念

各位同学好,我是老张。做LED驱动这行十几年了,今天咱们来聊聊PWM。

说实话,刚入行那会儿,我对PWM的理解也就停留在“会调亮度”这个层面。直到有一次做舞台灯光项目,客户要求色温渐变必须平滑得像流水一样,我才真正把PWM吃透。嗯,这节课咱们就从最基础的概念讲起。

什么是PWM?

PWM,全称是Pulse Width Modulation,中文叫脉冲宽度调制。说白了,就是通过控制脉冲的宽度来模拟模拟信号。

你想想看,单片机或者微控制器输出的数字信号,只有0和1两种状态。但LED需要的是连续可调的亮度,怎么办?PWM就是解决方案。

我习惯用一个比喻来解释:想象你在开关一盏灯。如果开关速度足够快,人眼就反应不过来。你让灯亮的时间长一点、灭的时间短一点,看起来就亮一些;反过来就暗一些。PWM就是这个道理。

核心要点:PWM是一种用数字信号模拟模拟信号的技术。它通过快速切换高低电平,用占空比来等效输出电压或功率。

PWM的两个关键参数

搞PWM,你必须要搞懂两个东西:频率和占空比。我当年面试新人,就爱问这两个概念,能讲明白的,基础都不会差。

1. 频率

频率,就是PWM信号每秒钟切换多少次。单位是赫兹(Hz)。

举个例子:1kHz的PWM,就是一秒钟开关1000次。每次开关周期是1毫秒。

频率的选择很讲究。我在项目中遇到过一个问题:用200Hz的PWM驱动LED,结果拍视频时发现屏幕在闪烁。为什么?因为摄像头的采样频率和PWM频率产生了差拍。

我的经验:LED调光一般建议用1kHz以上。人眼的临界闪烁频率大约是60Hz,但为了安全,我通常用1kHz到5kHz。太高了也不行,开关损耗会增加。

2. 占空比

占空比,就是一个周期内高电平时间占总周期的比例。用百分比表示。

比如一个周期是1ms,高电平0.5ms,低电平0.5ms,占空比就是50%。

占空比直接决定了LED的亮度。100%占空比就是全亮,0%就是全灭。50%就是一半亮度——注意,这里说的亮度是视觉亮度,不是线性关系。

占空比 高电平时间(1kHz为例) 视觉亮度(近似)
0% 0 μs 全灭
25% 250 μs 约10%
50% 500 μs 约30%
75% 750 μs 约60%
100% 1000 μs 全亮

看到没?50%占空比对应的视觉亮度只有30%左右。这是因为人眼对亮度的感知是对数关系,不是线性的。这个后面讲调光曲线时会详细说。

PWM在LED控制中的应用

LED控制里,PWM主要干三件事:调亮度、调色温、调颜色。

1. 调亮度

这个最简单。一个LED,一个PWM信号,改变占空比就改变亮度。我最早做的小夜灯项目就是这么干的。

// 简单的PWM调亮度示例(伪代码)
void set_brightness(int percent) {
    // percent: 0-100
    PWM_duty = percent * 255 / 100;  // 假设8位PWM
    set_pwm_duty(PWM_duty);
}

2. 调色温

这个稍微复杂点。需要两颗LED:一颗暖色(3000K),一颗冷色(6500K)。分别用两路PWM控制。

暖色LED的PWM占空比高,色温就偏暖;冷色LED的PWM占空比高,色温就偏冷。两路PWM的占空比之和通常保持100%。

我记得有个客户要求色温从3000K渐变到6500K,渐变时间30秒。我用了指数曲线来做渐变,效果非常平滑。要是用线性渐变,中间段会感觉变化太快。

3. 调颜色(RGB)

RGB LED有三颗芯片:红、绿、蓝。每颗芯片一路PWM,三路独立控制。通过调节三路占空比,理论上可以混合出1600万种颜色。

// RGB颜色混合示例
void set_color(int r, int g, int b) {
    // r, g, b: 0-255
    set_pwm_duty(RED_CH,   r);
    set_pwm_duty(GREEN_CH, g);
    set_pwm_duty(BLUE_CH,  b);
}

避坑指南:我曾经犯过一个错误——RGB三路PWM的频率不一样。结果颜色混合时出现了肉眼可见的闪烁。后来我统一用同一个定时器的三个通道,频率保持一致,问题就解决了。

PWM的硬件实现

讲到这里,你可能想问:PWM信号怎么产生?

常见的方式有三种:

  • 硬件PWM:用MCU自带的PWM外设。精度高、不占CPU。我推荐优先用这个。
  • 软件PWM:用定时器中断模拟。灵活但占用CPU。适合引脚不够的情况。
  • 专用PWM芯片:比如PCA9685。可以同时输出16路PWM,适合大型LED阵列。

我个人习惯,能用硬件PWM绝不用软件。为什么?因为软件PWM在中断里做延时,会影响其他任务的实时性。有一次做多路呼吸灯,软件PWM导致主循环卡顿,按键响应延迟了200ms,用户体验很差。

小结

这节课咱们讲了PWM的基本概念。频率和占空比是核心,一定要理解透。下节课我会讲PWM的调光算法,包括线性调光、对数调光、Gamma校正这些实战内容。

嗯,最后留个思考题:为什么人眼对亮度的感知不是线性的?想明白这个,你就能理解为什么调光曲线那么重要了。

咱们下节课见。