极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 34423|回复: 20

Arduino入门教程--第二十六课 关于基准源 将3.3V作为外部基准源使用

[复制链接]
发表于 2013-8-18 10:19:10 | 显示全部楼层 |阅读模式
本帖最后由 弘毅 于 2016-9-8 13:44 编辑

      开始,我一直认为arduino的模拟口adc采样是准确的,直到Arduino入门教程--第十课--用arduino做简单温度计大家热烈的讨论为啥温度不准,偏高或者偏低,那时候我知道了测量基准源这个玩意(USB供电的情况下会造成5V电压不足,用作5V基准的电压可能只有4.8V甚至更低),随后有了Arduino入门教程--第十七课--使用内部基准源提高ADC(模拟口)采样精度 但依旧引起大家的热烈讨论,原因是芯片内部基准源制造误差可能会达到5%(实际28颗批量样本测试为2.2% 数据表),远低于稳压LDO芯片1%精度的标准,所以,有了今天的这篇文章。还是测温度,这次有点不同,我们会使用3.3V LDO作为基准源进行测量。
      依旧说明下试验环境:本试验是在没有任何外部硬件支持的情况下,arduino采用usb供电方式,来达到尽可能准确的adc采样。



首先。我们要将要用的基准源接入arduino的 aref接口,其他依旧链接,LM35测量室内温度
   
搭建电路

3.3v基准测温度_bb.png


3.3v基准测温度_图示.png


然后程序基本一样。。。唯一的算法上5V 要改成 3.3V
  1. /*
  2. 作者:迷你强
  3. 时间:2013年8月18日
  4. IDE版本号:1.0.4
  5. 发布地址:www.geek-workshop.com
  6. 作用:第三次使用arduino模拟口测量室内温度,在没有外围基准的情况下,这次估计最准了。。

  7. */
  8. void setup() {
  9.   analogReference(EXTERNAL);  //使用aref引脚电压作为基准源
  10.   Serial.begin(9600);         //使用9600速率进行串口通讯
  11. }

  12. void loop() {

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

  14.   float vol = n * (3.3 / 1023.0*100);   //使用浮点数存储温度数据,温度数据由电压值换算得到(电压3.3V)

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



如需标定以下参数供参考:LM35传感器理论误差为±0.25℃ ,静态热耗散0.08℃。

实验效果就不展示了,反正一样,请大家自行比较三种方式的温度误差,理论上本次的温度应该是三次中间最准的,有条件的童鞋可以弄个进过质监局标定的标准温度计对lm35温度进行标定,看看还误差多少。

下一次,我们将使用带温度补偿的0.1%精度的专用外部基准源来再次做本实验,希望能将这个不准的问题终结掉
回复

使用道具 举报

发表于 2013-8-18 10:46:31 | 显示全部楼层
沙发,楼主好旧没发帖了
回复 支持 反对

使用道具 举报

发表于 2013-8-18 14:45:37 | 显示全部楼层
刚好用上了,之前的一块UNO电源干扰波纹很大 直接想砸了 现在一直用nano 做个实验AD采样精度要求高 有没有好的外部基准推荐呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-18 15:47:48 | 显示全部楼层
葱头同学 发表于 2013-8-18 14:45
刚好用上了,之前的一块UNO电源干扰波纹很大 直接想砸了 现在一直用nano 做个实验AD采样精度要求高 有没有好 ...

过几天写个帖子。。。高精度外部基准源
回复 支持 反对

使用道具 举报

发表于 2013-8-18 18:06:16 | 显示全部楼层
楼主,我觉得应该用这个代码吧?


analogReference(type)
描述
配置用于模拟输入的基准电压(即输入范围的最大值)。选项​​有:

DEFAULT:默认5V(Arduino板为5V)或3.3伏特(Arduino板为3.3V)为基准电压。
INTERNAL:在ATmega168和ATmega328上以1.1V为基准电压,以及在ATmega8上以2.56V为基准电压(Arduino Mega无此选项)
INTERNAL1V1:以1.1V为基准电压(此选项仅针对Arduino Mega)
INTERNAL2V56:以2.56V为基准电压(此选项仅针对Arduino Mega)
EXTERNAL:以AREF引脚(0至5V)的电压作为基准电压。
参数
type:使用哪种参考类型(DEFAULT, INTERNAL, INTERNAL1V1, INTERNAL2V56, 或者 EXTERNAL)。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-18 19:09:25 | 显示全部楼层
agaonet 发表于 2013-8-18 18:06
楼主,我觉得应该用这个代码吧?


哦。。复制代码时忘记了。感谢提醒,已修正
回复 支持 反对

使用道具 举报

发表于 2013-8-18 19:27:27 | 显示全部楼层
请教楼主:我家的嘀嘀叫的那种灰常廉价的电子钟被我姑娘摔坏了。我拆开来看,就是一个能输出脉冲的电路板上加了一个电磁线圈。我把能输出脉冲的那两端引入到arduino上,通过从模拟端口采样,第一次发现3秒才有一次脉冲,第二次发现2秒一个脉冲。。。

我不知道我的方法对不对,贴出代码来,您帮我看看。

我主要的目的就是通过这种方法测量出脉冲的时间频率。
  1. int i=0;
  2. void setup()
  3. {
  4.   analogReference(EXTERNAL);
  5.   Serial.begin(9600);
  6.   pinMode(9,OUTPUT);
  7. }

  8. void loop()
  9. {   
  10.   int n = analogRead(A0);    //读取A0口的电压值
  11.   float vol = n * (3.3 / 1024 * 100);   //使用浮点数存储温度数据,温度数据由电压值换算得到(电压3.3V) //这里偷了你的代码。呵呵。
  12.   
  13. if (n>120)
  14.   {
  15.   i=i+1;
  16. //    Serial.print("Clock == ");
  17. //  Serial.print(vol);
  18. // Serial.print(" == ");
  19. //  Serial.println(i);
  20.   digitalWrite(9,HIGH);
  21.   }
  22.   digitalWrite(9,LOW);
  23. }
复制代码
电路图很简单啊,就是脉冲输出的正负级,分别接到A0和GND, 然后3.3V与AREF短接在一起,获得3.3的基准电压。
回复 支持 反对

使用道具 举报

发表于 2013-8-18 19:32:11 | 显示全部楼层
由于嘀嘀叫采用1.5v工作电压,且只需要每一秒驱动线圈输出推动嵌入了磁铁的齿轮一下,所以输出电流非常小,电压也不好测试。。用万用表几乎测量不出来。1秒一次,不知道是感应电流,还是实际的。
回复 支持 反对

使用道具 举报

发表于 2013-8-18 19:40:14 | 显示全部楼层
迷你强 发表于 2013-8-18 19:09
哦。。复制代码时忘记了。感谢提醒,已修正


回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-18 20:11:35 | 显示全部楼层
agaonet 发表于 2013-8-18 19:40

可以参考这篇帖子
http://www.geek-workshop.com/thread-3085-1-1.html
回复 支持 反对

使用道具 举报

发表于 2013-8-18 23:49:12 | 显示全部楼层
好久没来了,想念整个论坛啊!
回复 支持 反对

使用道具 举报

发表于 2013-8-19 01:22:25 | 显示全部楼层
支持强哥精益求精!!!
回复 支持 反对

使用道具 举报

发表于 2013-8-19 19:31:02 | 显示全部楼层
迷你强 发表于 2013-8-18 20:11
可以参考这篇帖子
http://www.geek-workshop.com/thread-3085-1-1.html

谢谢,我已看帖。不过你那个帖子程序时20~20MHz的,,钟表输出脉冲应该1秒一次。。。所以,无法测量哈。呵呵。谢谢。
回复 支持 反对

使用道具 举报

发表于 2013-8-19 21:10:28 | 显示全部楼层
成功了,看了之前的教程,使用了串口波形图软件,同时加了个电容(虽然找了一个电容10uf的),然后波形出来就是1秒一个脉冲,加了电容后白噪声维持在300(0~1024),然后每一秒输出一个680 or 0 ,交替出现,输出频率正好是1秒。
回复 支持 反对

使用道具 举报

发表于 2013-8-22 20:57:27 | 显示全部楼层
请问用温度的高低控制数码管的数字变化的代码怎么写?
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2020-4-8 14:00 , Processed in 0.060867 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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