内容简介:如上图,若分辨率为
Arduino Mega 2560 能够读取 0 ~ 5V 的电压,并转换为 10bit 即 0~1023 级的数字信号。这怎么理解呢?
如上图,若分辨率为 2bit (即 2² ) ,意味着将 5V 分为 0~3 级的数字信号,每级精度是 5V /4 = 1250mV 。如果分辨率为 10bit ,即 0~1023 ,每级是 5V / 1024 = 4.88mV ;如果是 12bit ,即 0~4096 ,每级是 5V / 4096 = 1.22mV 。分辨率越高,每级分得越小,精度就越高。
得到 0~1023 级测量结果后,在程序内简单转化一下(没有复杂函数,只用乘除法),就能直观读出电压。接线图如下:
问题来了,怎样显示电压呢?这里使用最简单的 IDE 串口监视器,连着开发板,直接在电脑屏幕上显示,但我们先要使用 Serial.begin() 启动串口通信,然后通过 Serial.print() 将电压在屏幕打印出来:
/*
作者:Ardui.Co
效果:串口显示模拟端口的电压值
版本:1.0
更新时间:2017年1月8日
*/
void setup()
{
Serial.begin(9600); //指定串口通讯比特率为9600
}
void loop()
{
int v = analogRead(A0); //从A0口读取电压,模拟端口电压测量范围为0-5V,返回的值为0-1024
float volt = v * (5.0 / 1024.0); //将返回值换算成电压
Serial.print(volt); //串口输出电压值
Serial.println(" V"); //输出单位,并且换行
delay(1000); //输出后等待1s,降低刷新速度
}
通过 A0 读取电压范围不能超过 5V ,否则会损坏开发板,但要测量更高的电压怎么办?其实,我们可以通过分压电路来实现:
根据欧姆定律, Va0 = V * R1/(R1+R2) = V * 10/20 = 1/2 V
即: V = 2 Va0
因此调整一下换算语句就能得出实际电压:
float volt = v * (5.0 / 1024.0) * 2
但经过分压电路的测量会降低分辨率 (R1+R2)/ R1 倍(上述电路为 2 倍),如果分压式电阻 R1 = 10K , R2 = 20K ,可以测量 0 ~ 15V ,但分辨率降低 3 倍。换句话说,分压测量越高的电压,分辨率就越底。
我们会用温度传感器实验,来介绍 ADC 的分辨率,同时会学到怎样利用 Arduino 内部参考电压提高测量精度。
LM35 是美国国家半导体(现被 TI 收购)推出的精密温度传感,其信号输出为模拟量:电压值与温度(摄氏)呈正比。不仅体积非常小(常见 TO-92 封装),而且不需额外的校正,就能获得较高的精度。
其主要特性:
供电电压:4~35V
工作范围:与芯片有关,
LM35A 为
-55~150°C 常见
LM35D 为
0~100°C
测量范围:与封装和电路有关,常用
TO-92 为
2 ~150°C
测量精度:与芯片有关, LM35A 性能最优,这次实验用的 LM35D 最差,其典型值为 ±0.8°C ,最大值 ±2°C
电压与温度的关系: Vout = Temperature × 10mV/°C
想了解更多,可以参考官方 DataSheet 。接线方式如下:
电压转换方式:
Vin 为输入(被测量)电压; Vref 是参考电压,若不设置就是供电电压, Arduino Mega 2560 为 5V ; resolution 是模拟端口的 ADC bit , Arduino Mega 2560 模拟端口为 10bit , Result 为模拟端口的测量结果,数值为 0~1023 。程序如下:
/*
作者:Ardui.Co
效果:LM35 简单温度测量
版本:1.0
更新时间:2017年1月9日
*/
int LM35 = A0; //指定A0端口读取LM35
float Vin; //存储传感器电压
float temperature; //存储温度测量结果
void setup()
{
Serial.begin(9600); //初始化串口连接
}
void loop()
{
Vin = analogRead(LM35) * 5.0 / 1024; //计算出A0的电压,单位为V
temperature = Vin * 1000.0 / 10.0; //将A0电压要转换成mV,根据LM35转换系数10mV/°C,除以10,得出温度
Serial.print("Temperature: "); //在串口监视器输出结果
Serial.print(temperature);
Serial.println(" *C");
delay(500); //延时0.5s
}
ADC测量精度问题:
对于 5V 参考电压来说,每级为 5V / 1024 = 4.88mV ,转化为温度,每级分辨率就是 0.488 °C 。如果环境温度为 T , Arduino Mega 2560 的测量结果是 0.488 Result ,但 Result 是 0 ~ 1023 的正整数,误差 τ 就是
τ = T mod 0.488 ( mod 为求余运算)
Arduino Mega 2560 内置了 1.1v 参考电压,使用这个参考电压,每级为 1.1V / 1024 = 1.07mV ,每级分辨率提高到 0.107°C 。
如果环境温度为 10°C ,取 5V 参考电压的分辨率为 0.24°C ,取 1.1V 参考电压则为 0.049°C ;如果环境温度为 25°C ,取 5V 参考电压的误差为 0.112°C ,取 1.1V 参考电压则为 0.069°C 。
接线不变,调整一下程序,引入 Arduino 的内部参考电压:
/*
作者:Ardui.Co
效果:LM35 使用1.1内部参考电压提高分辨率
版本:1.0
更新时间:2017年1月9日
*/
int LM35 = A0; //指定A0端口读取LM35
float Vin; //存储传感器电压
float temperature; //存储温度测量结果
void setup()
{
analogReference(INTERNAL); //使用内部参考电压
Serial.begin(9600);
}
void loop()
{
Vin = analogRead(LM35) * 1.1 / 1024; //计算出A0的电压,单位为V
temperature = Vin * 1000.0 / 10.0; //将A0电压要转换成mV,根据LM35转换系数10mV/°C,除以10,得出温度
Serial.print("Temperature: "); //在串口监视器输出结果
Serial.print(temperature);
Serial.println(" *C");
delay(500);
}
参考电压稳定性:
由于参考电压跟 Vin 和温度成正比,实际中的电源电压往往十分不稳定,电池电压会随着电量变化(比如:单个锂离子放电电压约为 4.25V ~ 2.95V ),开关电源会有 50 ~ 200mV 纹波,常见的USB电源在不同负载上约有 ±4% 的变化。
但别以为用 Arduino Mega 2560 内部参考电压就万事大吉,其误差更高达 5% 。因此,使用内部基准源在提高分辨能力的同时,也引入了额外的测量误差,所以要用稳定性高的参考电压。
其实,也有一个折中的方案。 Arduino Mega 2560 内部提供了一块 LDO (低压差稳压 IC ),为 3.3V 端口供电。 LDO 一般为德州仪器的 LP2985-33DBVR ,其误差小于 1.5% ,用它来做外部参考电压,相对 5V 来说分辨率更高,相对 1.1V 内部参考电压来说,测量误差更小。
要使用外部参考电压,将 Aref 连接到 3.3V 端口:
我们将 3.3V 的端口跟 Aref 链接,并在内部程序中声明:
/*
作者:Ardui.Co
效果:LM35 使用3.3外部参考电压提高分辨率
版本:1.0
更新时间:2017年1月10日
*/
int LM35 = A0; //指定A0端口读取LM35
float Vin; //存储传感器电压
float temperature; //存储温度测量结果
void setup()
{
analogReference(EXTERNAL); //使用内部参考电压
Serial.begin(9600);
}
void loop()
{
Vin = analogRead(LM35) * 3.3 / 1024; //计算出A0的电压,单位为V
temperature = Vin * 1000.0 / 10.0; //将A0电压要转换成mV,根据LM35转换系数10mV/°C,除以10,得出温度
Serial.print("Temperature: "); //在串口监视器输出结果
Serial.print(temperature);
Serial.println(" *C");
delay(500);
}
我们还可以 Aref 连接到 Arduino 开发板之外的参考源上,以获取更精确的测量结果。
另外,要提高的分辨率,除了改变参考电压,也可以采用高位数的 ADC 芯片,不少精密 ADC 可达 16bit 以上分辨率。
参考链接
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
编写高质量代码:改善Python程序的91个建议
张颖、赖勇浩 / 机械工业出版社 / 2014-6 / 59.00元
在通往“Python技术殿堂”的路上,本书将为你编写健壮、优雅、高质量的Python代码提供切实帮助!内容全部由Python编码的最佳实践组成,从基本原则、惯用法、语法、库、设计模式、内部机制、开发工具和性能优化8个方面深入探讨了编写高质量Python代码的技巧与禁忌,一共总结出91条宝贵的建议。每条建议对应Python程序员可能会遇到的一个问题。本书不仅以建议的方式从正反两方面给出了被实践证明为......一起来看看 《编写高质量代码:改善Python程序的91个建议》 这本书的介绍吧!