友情提示:380元/半年,儿童学编程,就上码丁实验室。
前面了解开关方式,但怎么调节 LED 的亮度?调节亮度方式很多,在 Arduino 的应用中,最常见的控制方式是PWM (脉冲宽度调制)。
其实,不仅 LED 亮度,3D打印机和机器人伺服电机、遥控设备的舵机等都是通过 PWM 来控制。因此,PWM是灵活运用 Arduino 必备技能。
先简单介绍一下什么是 PWM。维基百科的解释是“利用电压或电流会通/断方式,将重复脉冲序列加载到模拟负载上。”听起来很复杂,其实就是周期性开启/关闭 LED,从而向 LED 输出不同的功率。因为人眼对亮度的感知是一个累积过程, 亮的时间在整个周期中,所占得比例越大,人眼感觉越亮。
第一个实验很简单,一个LED就可以完成:
我们设计一个简单的程序,让 LED 暗亮循环,呈现呼吸灯效果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
/*
作者:Ardui.Co
效果:LED 暗亮循环
版本:1.0
更新时间:2017年1月6日
*/
intLight=9;//定义 9 号数字端口为外接 LED 接口,须有 PWM 标记的端口
intn=0;//初始化LED亮度为0
voidsetup(){
pinMode(Light,OUTPUT);
}
voidloop(){
for(n;n<=255;n++)
{
analogWrite(Light,n);
delay(10);
}
for(n;n>=0;n–)
{
analogWrite(Light,n);
delay(10);
}
}
|
注意,Andruino Uno 提供 6 个 PWM 信号端口,在开发板上都有特殊标记(一般是 # 或者 ~),要使用 PWM 必须要用这些端口。同时,PWM 输出范围为0 – 255 级。
呼吸灯的效果不错,但是没有人机交互,怎样才能自由地控制 LED 亮度?现在加入两个按钮,接线图如下:
我们要读取两个按钮的状态,将数字端口10、11设置为 INPUT 状态,按下去触发高电平,增/减亮度:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
/*
作者:Ardui.Co
效果:按钮控制 LED 亮度
版本:1.0
更新时间:2017年1月6日
*/
intLight=9;
intn=0;
voidsetup()
{
pinMode(Light,OUTPUT);
pinMode(10,INPUT);
pinMode(11,INPUT);
}
voidloop()
{
intup=digitalRead(10); //读取10号口的状态
intdown=digitalRead(11); //读取11号口的状态
if(up==HIGH) //判断10号口目前是否是高电平
{
n=n+10; //以10为间隔,增加亮度
if(n>=255){
n=255;//限定最大值为255
}
analogWrite(Light,n); // 使用PWM控制9号口输出,n 取值在0-255之间
delay(100);//防抖
}
if(down==HIGH) //降低亮度
{
n=n-10;
if(n<=0){
n=0;
}
analogWrite(Light,n);
delay(100);
}
}
|
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,会降低频闪的感觉。