找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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


目标

1、整数类型int和变量的使用
2、PWM及模拟输出
3、for循环的使用
4、呼吸灯的制作

实验材料

Arduino UNO开发板
LED发光模块
配套USB数据线
配套杜邦线若干
Arduino IDE软件

图片1.png

内容

模拟信号

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

图片2.png

模拟输出与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。

图片3.png

Arduino UNO板数字引脚支持PWM功能的口有6个,分别是3、5、6、9、10、11,当然这些口也可以当普通的数字输出使用,Arduino的PWM支持256级输出,也就是我们可以设置模拟值的范围在0-255,其中255就是表示100%的PWM输出。

案例

通过模拟输出PWM控制LED灯,改变其亮度,达到呼吸效果

接线图

图片4.png
(Arduino UNO开发板与LED发光模块接线图)

接线方式

Arduino UNO开发板    <------>          LED发光模块
          3V3/5V              <------>                VCC
           GND                 <------>               GND
            D3                   <------>                 IN

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

图片5.png

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

图片6.png

程序实现代码

  1. void setup(){
  2. }
  3. void loop(){
  4.   for (int i = 0; i <= 255; i ++)    //循环语句,控制PWM亮度的增加
  5. {
  6.     analogWrite(3,i);       //对引脚3写入i的数值
  7.     delay(10);               //当前亮度维持的时间是10ms
  8.   }
  9.   for (int i = 255; i >= 0; i--) {    //循环语句,控制PWM亮度的减小
  10.     analogWrite(3,i);
  11.     delay(10);               //当前亮度维持的时间是10ms
  12.   }
  13. }
复制代码

for

for语句用于重复执行一段语句块,通常会使用一个增量计数器递增和终止循环,for语句对于任何需要重复的操作是非常有用的。

结构

for(表达式1;表达式2;表达式3){
语句块
}
以上程序的执行过程如下:
1) 先求解表达式1。
2) 求解表达式2,若其值为真(非0),则执行括号中的语句块,否则将结束循环。
3) 每一次执行完语句块,Arduino将求解表达式3。
4) 重复执行步骤 2) 和 3),直到循环结束。
注意:表达式1仅在第一次循环时求解,以后都不会再执行,可以认为这是一个初始化语句。
for循环的执行过程可用下图表示:

微信图片_20200815170331.png

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 + 1
i-- 相当于 i = i – 1
分享至 : QQ空间
收藏

0 个回复

您需要登录后才可以回帖 登录 | 立即注册