lxf 发表于 2020-6-24 09:43:32

第10课 PWM模拟输出实现LED呼吸灯

本帖最后由 lxf 于 2020-8-15 17:08 编辑

第10课 PWM模拟输出实现LED呼吸灯

目标
1、整数类型int和变量的使用2、PWM及模拟输出3、for循环的使用4、呼吸灯的制作
实验材料
Arduino UNO开发板LED发光模块配套USB数据线配套杜邦线若干Arduino IDE软件

内容
模拟信号
模拟信号是指信息参数在给定范围内表现为连续的信号, 或在一段连续的时间间隔内,其代表信息的特征量可以在任意瞬间呈现为任意数值的信号。

模拟输出与PWM调制
模拟信号输出的电压值在0~5V变化,但Arduino UNO板的输出端口都是数字端口,仅能输出高(5V)和低(0V)两种电压值,所以ArduinoUNO板无法输出真正的模拟信号,Arduino程序内建的模拟输出是通过PWM(Pulse Width Modulation)脉冲宽度调制的方法,用高低电平不断切换的数字脉冲信号来模拟模拟信号,在讲解PWM之前要先了解两个概念:脉冲周期及占空比。脉冲周期:相邻两次脉冲之间的时间间隔,周期的倒数即脉冲频率。占空比:在一次脉冲周期内高电平持续时间与脉冲周期的比值。PWM实际是通过高低电平的快速切换来实现模拟信号的输出效果的,在一个脉冲周期内,若占空比为50%,则相当于灯全亮半个周期,之后灯熄灭半个周期。Arduino的PWM信号脉冲周期仅有0.002s,即每秒500个脉冲周期,由于人眼的视觉残留效果,呈现出的视觉效果相当于50%的亮度,而此时PWM等效输出电压V=5V×占空比=5V×50%=2.5V。

Arduino UNO板数字引脚支持PWM功能的口有6个,分别是3、5、6、9、10、11,当然这些口也可以当普通的数字输出使用,Arduino的PWM支持256级输出,也就是我们可以设置模拟值的范围在0-255,其中255就是表示100%的PWM输出。
案例
通过模拟输出PWM控制LED灯,改变其亮度,达到呼吸效果
接线图
(Arduino UNO开发板与LED发光模块接线图)
接线方式
Arduino UNO开发板    <------>          LED发光模块          3V3/5V            <------>                VCC         GND               <------>               GND            D3                   <------>               IN
应用for循环+1执行循环内的程序

应用for循环-1执行循环内的程序

程序实现代码
void setup(){
}
void loop(){
for (int i = 0; i <= 255; i ++)    //循环语句,控制PWM亮度的增加
{
    analogWrite(3,i);       //对引脚3写入i的数值
    delay(10);               //当前亮度维持的时间是10ms
}
for (int i = 255; i >= 0; i--) {    //循环语句,控制PWM亮度的减小
    analogWrite(3,i);
    delay(10);               //当前亮度维持的时间是10ms
}
}
for
for语句用于重复执行一段语句块,通常会使用一个增量计数器递增和终止循环,for语句对于任何需要重复的操作是非常有用的。
结构
for(表达式1;表达式2;表达式3){语句块}以上程序的执行过程如下:
1) 先求解表达式1。2) 求解表达式2,若其值为真(非0),则执行括号中的语句块,否则将结束循环。3) 每一次执行完语句块,Arduino将求解表达式3。4) 重复执行步骤 2) 和 3),直到循环结束。注意:表达式1仅在第一次循环时求解,以后都不会再执行,可以认为这是一个初始化语句。for循环的执行过程可用下图表示:

analogWrite
将一个模拟数值写进Arduino引脚,这个操作可以用来控制LED的亮度, 或者控制电机的转速,Arduino每一次对引脚执行analogWrite()指令,都会给该引脚一个固定频率的PWM信号,PWM信号的频率大约为490Hz。在Arduino UNO控制器中,5号引脚和6号引脚的PWM频率为980Hz,在一些基于ATmega168和ATmega328的Arduino控制器中,analogWrite()函数支持以下引脚: 3, 5, 6, 9, 10, 11。在Arduino Mega控制其中,该函数支持引脚 2 – 13 和 44 – 46,使用ATmega8的Arduino控制器中,该函数只支持引脚 9, 10, 11。在调用analogWrite()函数前,您无需使用pinMode()函数来设置该引脚。
语法
analogWrite(pin, value)
参数
pin:被读取的模拟引脚号码value:0到255之间的PWM频率值, 0对应off, 255对应on
Int

整数是基本数据类型,整数数据类型占用2字节,整数的范围为-32,768到32,767( -2^15 ~(2^15)-1)。
整数类型使用2的补码方式存储负数,最高位通常为符号位,表示数的正负,其余位被“取反加1”。Arduino可处理负数计算,但是对整数类型数值进行右移位运算符时,可能会产生不可预料的编译结果。
语法
int var = val;
var – 变量名
val – 赋给变量的值
提示
当变量数值过大而超过整数类型所能表示的范围时(-32,768 到 32,767),变量值会“回滚”int x
x = -32,768;
x = x – 1; // x 现在是 32,767。x = 32,767;
x = x + 1; // x 现在是 -32,768。

=赋值运算符(单个等号)
把等号右边的值存储到等号左边的变量中。
在C语言中单个等号被称为赋值运算符,它与在代数课中的意义不同,后者象征等式或相等,赋值运算符告诉Arduino将等号右边的数值或表达式计算结果存入等号左边的变量中。赋值运算符(单个=号)左边的变量要足够大到容纳赋值运算符右面的值,如果不够大,存储在该变量中的值将是错误的。不要混淆单个等号的赋值运算符( = )和双等号的关系运算符( == ),关系运算符用于关系运算符两边的表达式是否相等。返回值无
i++、i--
复合运算符i++相当于 i = i + 1i-- 相当于 i = i – 1
页: [1]
查看完整版本: 第10课 PWM模拟输出实现LED呼吸灯