Arduino与LabVIEW开发实战
上QQ阅读APP看书,第一时间看更新

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位的分辨率[1]分辨率是ADC的一个重要指标,一般以位数来说明,比如为N位,就是将参考电压分成2的N次方份,每一份即可以测量的最小变化量。以AVR单片机为核心的Arduino控制板ADC的位数为10位,如果参考电压为5V,则可分辨的最小电压是0.00488V,约0.005V。(即输入有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的亮度 }