1.4 模拟输入/输出
1.4.1 模拟I/O的函数库
Arduino模拟I/O函数包括analogRead(pin)、analogWrite(pin,value)和analogReference(type),分别实现读取模拟量、PWM输出和设置参考电压的功能。
需要说明的是,模拟I/O函数库的操作对象仅仅为Arduino模拟输入引脚,如A0、A1等。同时,根据所选用的Arduino控制板不同,可用的模拟引脚数也不同。
1.analogRead(pin)
功能:从指定的模拟引脚读取数据值。
语法:analogRead(pin)
参数:
pin:模拟输入引脚(Uno:A0~A5,Mini、Nano:A0~A7,Mega:A0~A15)。
返回值:0~1023的整数值。
详细说明:
Arduino Uno拥有6路模拟输入:标号A0~A5,每一路具有10位的分辨率(即输入有1024个不同值),默认输入信号范围为0~5V,输入范围和最小分辨率可以通过analogReference(type)来设置。若参考电压为5V,则最小分辨率约为4.88mV。
在使用analogRead()前,不需要调用pinMode()来设置引脚为输入引脚。如果模拟输入引脚没有接入稳定的电压值,analogRead()返回值将由外界的干扰而决定,这个一般用来产生随机数。
2.analogWrite(pin,value)
功能:从指定的引脚输出模拟值(PWM)。
语法:analogWrite(pin,value)
参数:
pin:指定的引脚号。
value:0(完全关闭)~255(完全打开)。
详细说明:
在使用analogWrite()前,不需要调用pinMode()来设置引脚为输出引脚。
analogWrite()执行之后,指定引脚上将产生一个稳定的特殊占空比方波,PWM信号频率大约为490Hz,占空比为value/255,对应的电压值为value/255×5。
3.analogReference(type)
功能:配置模拟输入的参考电压(输入电压的最大值)。
语法:analogWrite(pin,value)
参数:
type:参考电压类型(DEFAULT、INTERNAL、INTERNAL1V1、INTERNAL2V56,或者EXTERNAL)。
参考电压类型的具体说明如下:
❏DEFAULT:默认5V(Arduino AVR控制器)或3.3V(Arduino Due控制器)为基准电压。
❏INTERNAL:在ATmega168和ATmega328上以1.1V为基准电压,在ATmega8上以2.56V为基准电压(Arduino Mega无此选项)。
❏INTERNAL1V1:以1.1V为基准电压(此选项仅针对Arduino Mega)。
❏INTERNAL2V56:以2.56V为基准电压(此选项仅针对Arduino Mega)。
❏EXTERNAL:以AREF引脚(0~5V)的电压作为基准电压。
注意 AREF引脚上的电压必须在0~5V,不得小于0V或超过5V。如果使用AREF引脚上的电压作为参考电压,在调用analogRead()前必须将参考电压的类型设置为EXTERNAL。在改变参考电压后,之前从analogRead()读取的数据可能不准确。
1.4.2 实验:会呼吸的灯
1.实验目的
会呼吸的灯,简而言之就是亮度由暗逐渐变亮,由亮逐渐变暗的LED,视觉效果上像在呼吸一样。通过Arduino Uno带有PWM(~)功能的数字引脚3控制LED产生由暗逐渐变亮,由亮逐渐变暗的呼吸灯效果。
2.硬件连接
将LED的阴极接至GND,阳极接至Arduino Uno带有PWM(~)功能的数字引脚3。硬件连接图如图1-27所示。
图1-27 会呼吸的灯硬件连接图
3.软件设计
通过模拟输出analogWrite(pin,value)对LED的亮度进行控制,从而形成呼吸灯,程序如代码清单1-4所示。
代码清单1-4:会呼吸的灯程序代码
int PWM_Pin = 3; // 定义数字引脚3作为LED亮度的控制引脚 void setup() { pinMode(PWM_Pin, OUTPUT); // 将数字引脚3设置为输出状态 } void loop() { // 将LED的亮度由熄灭逐渐调高至全亮 for (int brightness = 0; brightness <= 255; brightness++) { analogWrite(PWM_Pin, brightness); delay(5); } // 将LED的亮度由全亮逐渐调低至熄灭 for (int brightness = 255; brightness >= 0; brightness--) { analogWrite(PWM_Pin, brightness); delay(5); } // 中间间断500毫秒 delay(500); }
1.4.3 实验:调光LED
1.实验目的
通过Arduino Uno的模拟引脚A0读取电位器的分压,实现对数字引脚D3上LED亮度的控制。学习analogWrite(pin,value)和analogRead(pin)的使用。
2.硬件连接
将LED的阴极串联220Ω的限流电阻接至GND,阳极(长管脚)接至Arduino Uno带有PWM(~)功能的数字引脚D3。将旋转电位器的两端接至+5V和GND,中间端接至模拟端口A0。硬件连接图如图1-28所示。
图1-28 调光LED 硬件连接图
3.软件设计
通过模拟输入analogRead(pin)和模拟输出analogWrite(pin,value),利用电位器对LED的亮度进行控制,程序如代码清单1-5所示。
代码清单1-5:调光LED程序代码
int sensorPin = A0; // 定义模拟引脚A0作为电位器的读取引脚 int ledPin = 3; // 定义数字引脚3作为LED亮度的控制引脚 int sensorValue = 0;
void setup() { //将LED引脚设置为输出状态 pinMode(ledPin, OUTPUT); }
void loop() { sensorValue = analogRead(sensorPin); // 读取电位器的分压值的数字量(0~1023) analogWrite(ledPin,sensorValue/4); // 将电位器的分压值的数字量(0~1023)缩小4倍, 转换为模拟输出量(0~255),来调节LED的亮度 }