极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 123545|回复: 66

Arduino入门教程--第十七课--使用内部基准源进行ADC采样

[复制链接]
发表于 2012-9-9 09:52:27 | 显示全部楼层 |阅读模式
ADC全称为Analog To Digital Converter,中文全称为模数转换器。其作用是把模拟量的电压值,转换为数字。

在前面的教程中我们使用过LM35温度传感器,这个传感器为一个模拟量传感器,给传感器VCC连接ocrobot mango(Arduino兼容板)板上5V,GND连接板子上GND,在Vout引脚会输出电压,从0V开始,每升高10mv电压代表着温度上升1℃,两者成线性关系。

线路连接图我也同样按照以前的接法,LM35的VCC接5V,GND接GND,VOUT接A0.




Arduino A0-A5口为ADC引脚,其分辨率为10位,也就是1024级,输出数值为0-1023,默认以输入电压作为基准电压。

对于一些场合,比如使用电池供电,因为在电量消耗过程中电压会不停变化,如果输入电压过高或者不准,就会导致参考基准不准,从而导致数值发生偏差。这时我们就可以采用内部基准源。

以LM35温度传感器为例:
首先我们使用USB线连接ocrobot mango(Arduino兼容板),用USB供电,下载下面代码。


  1. /*
  2. 作者:极客工坊-迷你强
  3. 时间:2012年9月11日
  4. IDE版本号:1.0.1
  5. 发布地址:www.geek-workshop.com
  6. 作用:使用arduino模拟口测量室内温度

  7. */
  8. void setup() {
  9.    Serial.begin(9600);         //使用9600速率进行串口通讯
  10. }

  11. void loop() {

  12.   int n = analogRead(A0);    //读取A0口的电压值

  13.   double vol = n * (5 / 1024.0*100);   //使用双精度浮点数存储温度数据,温度数据由电压值换算得到

  14.   Serial.println(vol);                   //串口输出温度数据
  15.   delay(2000);                           //等待2秒,控制刷新速度
  16. }
复制代码


我们使用万用表同步测试5V端口(默认的基准电压从这里采集)的供电电压,万用表显示为5.03V。



代码下载好以后,我们使用串口监视器查看返回来的温度数值,数值显示当前温度在27.34℃左右。



然后我们使用外接电源从DC口供电,这时USB供电就会被自动切断,换用外置供电稳压后的电源给系统供电,万用表上数值显示当前电压为5.11V。



然后我们重新打开串口监视器,返回的数值显示当前温度在26.86设置度左右。



下面调用内部1.1V基准来试试看从LM35读取的温度数值。把下面代码下载,然后打开串口监视器。

  1. /*
  2. 作者:极客工坊-迷你强
  3. 时间:2012年9月11日
  4. IDE版本号:1.0.1
  5. 发布地址:www.geek-workshop.com
  6. 作用:使用arduino模拟口测量室内温度

  7. */
  8. void setup() {

  9.   Serial.begin(9600);         //使用9600速率进行串口通讯
  10.   analogReference(INTERNAL); //调用板载1.1V基准源
  11. }

  12. void loop() {

  13.   int n = analogRead(A0);    //读取A0口的电压值

  14.   double vol = n * (1.1 / 1024.0*100);   //使用双精度浮点数存储温度数据,温度数据由电压值换算得到

  15.   Serial.println(vol);                   //串口输出温度数据
  16.   delay(2000);                           //等待2秒,控制刷新速度
  17. }
复制代码


我这里返回的结果如下,显示当前温度为28.25℃左右。



本次使用三种不同方法,同一温度传感器得到不同数值。
  • 使用外置电源供电误差最大,其供电电压为5.11V,偏离5V电压2.2%。
  • 使用USB供电稍微好一点,但是供电电压为5.03V,偏离5V电压0.6%。
  • 调用内部1.1V基准源,经过批量采样,1.1V内部基准源的平均误差范围在1.22%左右,最高达到2.2%。

在5V量程下,Arduino ADC的采样精度是10位也就是1024级,最小分辨率为5/1024=0.0048828125 V=4.8828125 mV

在1.1V内部基准源量程下,Arduino ADC的采样精度是10位,最小分辨率为1.1/1024=0.00107421875 V=1.07421875 mV

LM35是每10mV代表1℃,在5V量程下,分辨率接近0.5度,1.1V量程下分辨率接近0.1度。

通过以上分析换算,这次使用USB供电时,基准源误差相对于其他更小一些,USB供电温度更接近真实温度,但是当供电环境不稳定时,内部基准源就发挥作用了~如果进一步要求更高级精度,那么就需要使用精密外部基准源。基准误差越小,ADC的精度也就越高,根据需求环境选用合适的基准源在各种制作中也是很重要的一个环节。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2012-9-12 13:44:06 | 显示全部楼层
double vol = n * (1.1 / 1024.0*100);
这个地方为何换算公式不变?
回复 支持 反对

使用道具 举报

发表于 2012-9-12 13:57:16 | 显示全部楼层
我测了一下1.1基准和5.0标准的传感器端电压,都是一个数量级,可以理解为“调用内部1.1V基准”,是将1.1v分为n个单位(1024),然后参与运算,对吗
回复 支持 反对

使用道具 举报

发表于 2012-9-13 22:59:29 | 显示全部楼层
内部基准可靠吗?
回复 支持 反对

使用道具 举报

发表于 2012-9-13 23:25:01 | 显示全部楼层
wasdpkj 发表于 2012-9-12 13:57
我测了一下1.1基准和5.0标准的传感器端电压,都是一个数量级,可以理解为“调用内部1.1V基准”,是将1.1v分 ...

可以这样理解
回复 支持 反对

使用道具 举报

发表于 2012-9-13 23:25:32 | 显示全部楼层
太行摄狼 发表于 2012-9-13 22:59
内部基准可靠吗?

相对普通的稳压基准,可靠度还是很高的。
回复 支持 反对

使用道具 举报

发表于 2012-9-14 08:00:17 | 显示全部楼层
=.= 有没有办法提高输出精度的办法呢 255的输出粒度坑爹啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-9-14 10:04:09 | 显示全部楼层
水乐天 发表于 2012-9-14 08:00
=.= 有没有办法提高输出精度的办法呢 255的输出粒度坑爹啊

adc芯片  DAC芯片。。。要啥精度,给多少钱
回复 支持 反对

使用道具 举报

发表于 2012-9-15 22:15:01 | 显示全部楼层
迷你强 发表于 2012-9-14 10:04
adc芯片  DAC芯片。。。要啥精度,给多少钱

..ARDUINO自带AD/DC转化模块(就是模拟脚)
基准电源就像原子钟一样,属于一个标准提供者,一个参照系(数字电压表就是有一个基准电源作为参照来得到被测线路的电压,试问参照物不准,结果如何准确呢)
帖子的意思就是程序都是按照5V来设计的,但是由于供电电路给的电压不是标准的5V,出来的数值就有偏颇
一般来说不需要外置AD/DA模块(除非你需要同时使用的模拟口超过了板子上的接口数量,才需要外接)
回复 支持 反对

使用道具 举报

发表于 2012-9-15 22:15:42 | 显示全部楼层
弱弱的问下,TAOBAO上很多仿官方的板子貌似都木有1.1的口啊。。。。郁闷
回复 支持 反对

使用道具 举报

发表于 2012-9-15 22:16:48 | 显示全部楼层
水乐天 发表于 2012-9-14 08:00
=.= 有没有办法提高输出精度的办法呢 255的输出粒度坑爹啊

给一个给力的稳压基准(稳定,低电压)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-9-15 22:40:43 | 显示全部楼层
darkorigin 发表于 2012-9-15 22:15
弱弱的问下,TAOBAO上很多仿官方的板子貌似都木有1.1的口啊。。。。郁闷


不是1.1专门有个接口,而是调用单片机内部的1.1V基准源。届时,接口电压会变成1.1V

回复 支持 反对

使用道具 举报

发表于 2012-9-16 00:07:01 | 显示全部楼层
迷你强 发表于 2012-9-15 22:40
不是1.1专门有个接口,而是调用单片机内部的1.1V基准源。届时,接口电压会变成1.1V

额 看到了
analogReference(INTERNAL); //调用板载1.1V基准源
这个函数可以让5V口变成1.1V 是么?谢谢讲解噢~~
呵呵,好像analogReference 这个函数貌似很多教材上都没有呢。哪里可以获取到更全面的ARDUINO内置函数啊(英语差了点,官网看的很吃力)最好是中文的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-9-16 11:17:35 | 显示全部楼层
darkorigin 发表于 2012-9-16 00:07
额 看到了
analogReference(INTERNAL); //调用板载1.1V基准源
这个函数可以让5V口变成1.1V 是么?谢谢 ...

你竟然没看到我们论坛导航栏上有硕大的WIKI么?我们倾力汉化的《arduino语法手册》就放在里面。。。。。。。。。。。。。。。。
回复 支持 反对

使用道具 举报

发表于 2012-9-16 22:44:46 | 显示全部楼层
迷你强 发表于 2012-9-16 11:17
你竟然没看到我们论坛导航栏上有硕大的WIKI么?我们倾力汉化的《arduino语法手册》就放在里面。。。。。。 ...

天。 我一直在看精华区。。。。。WIKI我忽略了,悲催啊
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2022-10-8 05:26 , Processed in 0.092507 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表