第4课 PWM 控制 LED 亮度

前面了解开关方式,但怎么调节 LED 的亮度?调节亮度方式很多,在 Arduino 的应用中,最常见的控制方式是PWM (脉冲宽度调制)。

其实,不仅 LED 亮度,3D打印机和机器人伺服电机、遥控设备的舵机等都是通过 PWM 来控制。因此,PWM是灵活运用 Arduino 必备技能。

先简单介绍一下什么是 PWM。维基百科的解释是“利用电压或电流会通/断方式,将重复脉冲序列加载到模拟负载上。”听起来很复杂,其实就是周期性开启/关闭 LED,从而向 LED 输出不同的功率。因为人眼对亮度的感知是一个累积过程, 亮的时间在整个周期中,所占得比例越大,人眼感觉越亮。

第一个实验很简单,一个LED就可以完成:

我们设计一个简单的程序,让 LED 暗亮循环,呈现呼吸灯效果:

注意,Andruino Uno 提供 6 个 PWM 信号端口,在开发板上都有特殊标记(一般是 # 或者 ~),要使用 PWM 必须要用这些端口。同时,PWM 输出范围为0 – 255 级

 

呼吸灯的效果不错,但是没有人机交互,怎样才能自由地控制 LED 亮度?现在加入两个按钮,接线图如下:

我们要读取两个按钮的状态,将数字端口10、11设置为 INPUT 状态,按下去触发高电平,增/减亮度:

analogWrite() 利用数字端口输出了一个模拟量。但Arduino 的数字端口,只有高/低电平两种信号输出,应该怎么理解这个模拟量的含意和机制呢?首先要弄清按下按钮时,9号数字端口发生了什么,同时要进一步理解PWM:

按下按钮,即  n 增加或减少后,用万用表测量一下 9号数字端口的变化:

按下按钮时,频率不变、电压在变,PWM 的占空比也在变。占空比(注意视频中,万用表是“空占比”,即占空比的倒数,日常多用“占空比”)就是开启和关闭之间的时间比值:

占空比 = τ / T

当 n = 255 时,占空比为 100% 以上,处于完全开启状态(τ = T);当 n = 0时,占空比为 0% ,处于完全关闭的状态(τ = 0);当 n = 64 时,占空比 = 25%;当 n = 127 时,占空比 = 50%;当 n = 191 时,占空比 = 75%。如下图:

其实,输出不同的占空比,可以理解为输出 0 ~ 5V 之间的电压来调节LED的亮度。虽然你在视频看到就这样,但这不完全正确,后面的课程会继续深入介绍 PWM 的原理。

另外,有没有注意到,LED 在较暗亮度下是否感到了闪烁?现实中,一些显示器采用 PWM 控制的 LED 背光,亮度调到最低时,也有这种频闪效应。

因为PWM 控制亮度的原理是 “亮-灭-亮-灭” 过程,频率低,占空比小,LED 单个周期内关闭的绝对时间就长,实际上,就是可见光在对眼睛进行一个频率的闪烁冲击。PWM频率越低,人眼对冲击的感知越高;反之,频率越高,对冲击的感知越低。

Arduino Uno 6个 PWM 端口分别提供了两种频率,5、6号端口为980Hz,其他均为490Hz 。如果我们采用5号端口控制LED,会降低频闪的感觉。

2 thoughts on “第4课 PWM 控制 LED 亮度

  1. 奎奎

    第一次做的时候,PWM的范围误打成n<=25了,灯一直没亮,我还以为灯坏了……果真每个细节都要注意呀

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *