Arduino--模拟输入输出

Arduino--模拟输入输出 一.pinmode三种模式1.输入模式引脚在该模式时引脚为高阻抗状态可用于引脚读取传感器信号或者开关信号该引脚未与上拉电阻或下拉电阻相连时该引脚电平不稳定若与上拉电阻相连该引脚处于高电平状态若与下拉电阻相连则处于低电平状态2.输出模式引脚为该状态时引脚为低阻抗状态此时引脚可以点亮LED或者驱动电机3.输入上拉模式定义对于一个不确定的信号可以通过arduino微控制器内部自带的电阻与电源VCC相连使其固定在高电平输入上拉(INPUT_PULLUP)模式与输入(INPUT)模式的比较1当将Ardiuno上的引脚2设置为INPUT模式并且引脚2没有接入外部电路引脚2的电平状态是随机的。2当将Ardiuno上的引脚2设置为INPUT模式并且引脚2接入电阻时如图所示此时引脚2处于高电平状态。3当将Ardiuno上的引脚2设置为INPUT_PULLUP模式时如图所示由于Arduino 微控制器自带内部上拉电阻因此引脚2处于高电平状态。该电路效果与第2个电路图等效输入上拉和输入下拉模式都是为了避免由于电压的“悬浮”而造成电路的不稳定二.模拟输出1.模拟信号是连续变化的信号模拟信号可以用连续的电压或者电流表示。模拟量的概念与数字量相对应它经过量化之后可以转化为数字量。模拟量在连续的变化过程中的任何一个取值都是一个有具体意义的物理量如温度电压电流。模拟输入输出的意思是模拟信号的输入输出。只能用引脚3.5.6.10.11数字输入输出通常是接收开关量的信号2.模拟输出函数analogWrite1analogWrite函数借助PWM调制将模拟值pwm波写入引脚引脚生成指定占空比的稳定的矩形波可以用于输出模拟信号它有两个参数第一个参数是模拟引脚号第二个参数是0到255之间的PWM频率值0对应“off”255对应“on”。2在Arduino UNO控制器中5号引脚和6号引脚的PWM频率为980Hz。在一些基于ATmega168和ATmega328的Arduino控制器中analogWrite函数支持引脚 3、5、6、9、10、11在开发板上的引脚处有“~”标记。3PWMPulse Width Modulation即脉冲宽度调制在具有惯性的系统中可以通过对一系列脉冲的宽度进行调制来等效地获得所需要的模拟参量常应用于电机控速、开关电源等领域。4PWM频率值0-255对应占空比0%-100%呈正比关系如下图所示。如果有规律地改变PWM频率值就能产生等效的模拟波形如上图紫色虚线描绘的波形当然PWM频率值固定也能产生一个等效的模拟电压其值不局限于高电平或低电平标定的电压电压值取决于PWM频率值。二.按键控制LED亮度1.持续按下按键1LED的亮度会持续下降直至熄灭持续按下按键2LED的亮度会持续上升直至程序设定的最大值。bool pushButton1; // 创建布尔型变量用来存储按键开关1的电平状态 bool pushButton2; // 创建布尔型变量用来存储按键开关2的电平状态 int ledPin 9; //LED引脚号 int brightness 128; //LED亮度参数255/2127.5一个适中的亮度参数 void setup() { pinMode(2, INPUT_PULLUP); //将引脚2设置为输入上拉模式 pinMode(8, INPUT_PULLUP); //将引脚8设置为输入上拉模式 pinMode(ledPin, OUTPUT); //将LED引脚设置为输出模式 Serial.begin(9600); //启动串口通讯波特率为9600 } void loop() { pushButton1 digitalRead(2); //读取引脚2电平状态并将其赋值给布尔变量pushButton1 pushButton2 digitalRead(8); //读取引脚8电平状态并将其赋值给布尔变量pushButton2 if (!pushButton1 brightness 0) //当持续按下按键开关1并且LED亮度参数大于0 { brightness--; //减低LED亮度参数 } else if (!pushButton2 brightness 255) //当持续按下按键开关2并且LED亮度参数小于255 { brightness; //增加LED亮度参数 } analogWrite(ledPin, brightness); //模拟输出控制LED亮度 Serial.println(brightness); //将LED亮度参数显示在串口监视器上 delay(10); }三.模拟输入1.模拟输入函数analogRead1analogRead函数仅有一个参数用于指示模拟引脚该函数用于从Arduino的模拟输入引脚读取模拟电压的数值。2Arduino控制器有多个10位数模转换通道这意味着Arduino可以将0-5V的电压输入信号映射到数值0-1023就是将输入的模拟量转换成单片机能“读懂”的数字信号或者说将模拟量转换为二进制的形式供计算机接收。3在模拟输入引脚没有任何连接的情况下用analogRead指令读取该引脚这时获得的返回值为不固定的数值这个数值可能受到多种因素影响比如将手靠近引脚也可能使得该返回值产生变化。2.电位器控制LED灯亮度void setup() { Serial.begin(9600); //串口通讯初始化(9600 bps) pinMode(9, OUTPUT); //设置9号引脚为输出模式 } void loop() { int analogInputVal analogRead(A0); //读取模拟输入值 int brightness map(analogInputVal, 0, 1023, 0, 255); //将模拟输入数值0 - 1023等比映射到模拟输出数值区间0-255内根据该映射关系由analogInputVal得出brightness analogWrite(9, brightness); //根据模拟输入值调节LED亮度 //将结果通过串口监视器显示 Serial.print(analogInputVal ); Serial.println(analogInputVal); Serial.print(brightness ); Serial.println(brightness); Serial.println(); }电位器的两端引脚分别接5V和GND中间引脚连接Arduino的引脚A0转动电位器引脚A0的电压随之发生改变程序需要不断地将当前电压记录在变量analogInputVal中当然记录的值并不完全等于电压值只是它与实际电压值有一个映射关系或者说线性关系。②analogRead函数的返回值范围为0-1023针对本项目而言而LED灯的亮度参数取值范围为0-255虽然二者取值范围不同但是可以为它们构造一个等比映射的关系如下图所示这样引脚A0的电压值就能与LED灯的亮度参数存在一个映射关系或者说线性关系