本帖最后由 AllBlue 于 2013-8-15 19:35 编辑
PWM方式控制LED亮度
上面点亮LED灯实验中我们提到,当我们的delay()函数中的数字很小达到一定值时,LED就不再闪烁了吗,这是为什么呢?下面我们就要介绍这一技术--PWM。 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。 简单说来就是我们上面发现的实验现象:当我们将LED闪烁的时间变小,例如delay(10ms),这是你看不到LED闪烁了,它常亮,但是亮度降低了,如果继续改变时间间隔,它的亮度会更低;这项技术别称为PWM。 下面我们看下它的工作原理,如下图: 其实,它就是通过让LED闪烁的足够快,让我们的肉眼察觉不到,再通过改变亮灭时间的占空比例来调节LED的亮度。当然在其他领域也是可以运用到它的,例如改变声音大小等。 了解了PWM 的工作原理,我们就可以做实验来验证下它吧! 实验元件(和闪烁LED一样): UNO 实验套装(UNO R3控制板、USB数据线、面包板、跳线) LED灯 一枚
电阻220Ω 一枚
UNO控制板为我们提供了6 个PWM 控制接口,分别为:D3、D5、D6、D9、D10、D11,也就是说我们想要使用PWM 控制时,这6个接口都是可以使用的,如果你记得不清楚,控制板上每个PWM引脚都有“~”符号!下面看下我们的电路图: 我们电路连接的是D11数字引脚。 我想通过上面的介绍,大家对PWM 的控制也是了解了,程序说不定都能写出来了,下面是例程: - /*
- PWM控制LED
- 调高LED亮度直到最亮,调低LED亮度直到熄灭。
- */
- #define LED 11 //定义LED灯引脚
- int i = 0; //存储最新数值变数,我们将使用它来从上到下计数
- void setup(){
- pinMode(LED,OUTPUT); //设定LED引脚为输出
- }
- void loop(){
- for(i = 0;i < 255;i++){ //变数从0到254之间变化(渐强)
- analogWrite(LED, i); //设定LED亮度
- delay(10); //延时10ms,因为analogWrite执行瞬间完成,
- //速度太快不易察觉
-
- }
- for(i =255;i > 0; i--){ //变数从255到1之间变化(渐弱)
- analogWrite(LED, i); //设定LED亮度
- delay(10); //延时10ms
- }
- }
复制代码我们将上面的例程上传到UNO R3控制板中,可以看到,LED像呼吸一样由灭到亮,由亮到灭~~ 实验成功!! 你也可以使用该方法控制别的元器件例如蜂鸣器(下面会给大家介绍到)。。。。 |