Arduino入门教程--第二十六课 关于基准源 将3.3V作为外部基准源使用
本帖最后由 弘毅 于 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测量室内温度
搭建电路
然后程序基本一样。。。唯一的算法上5V 要改成 3.3V
/*
作者:迷你强
时间:2013年8月18日
IDE版本号:1.0.4
发布地址:www.geek-workshop.com
作用:第三次使用arduino模拟口测量室内温度,在没有外围基准的情况下,这次估计最准了。。
*/
void setup() {
analogReference(EXTERNAL);//使用aref引脚电压作为基准源
Serial.begin(9600); //使用9600速率进行串口通讯
}
void loop() {
int n = analogRead(A0); //读取A0口的电压值
float vol = n * (3.3 / 1023.0*100); //使用浮点数存储温度数据,温度数据由电压值换算得到(电压3.3V)
Serial.println(vol); //串口输出温度数据
delay(2000); //等待2秒,控制刷新速度
}
如需标定以下参数供参考:LM35传感器理论误差为±0.25℃ ,静态热耗散0.08℃。
实验效果就不展示了,反正一样,请大家自行比较三种方式的温度误差,理论上本次的温度应该是三次中间最准的,有条件的童鞋可以弄个进过质监局标定的标准温度计对lm35温度进行标定,看看还误差多少。
下一次,我们将使用带温度补偿的0.1%精度的专用外部基准源来再次做本实验,希望能将这个不准的问题终结掉 沙发,楼主好旧没发帖了 刚好用上了,之前的一块UNO电源干扰波纹很大 直接想砸了 现在一直用nano 做个实验AD采样精度要求高 有没有好的外部基准推荐呢? 葱头同学 发表于 2013-8-18 14:45 static/image/common/back.gif
刚好用上了,之前的一块UNO电源干扰波纹很大 直接想砸了 现在一直用nano 做个实验AD采样精度要求高 有没有好 ...
过几天写个帖子。。。高精度外部基准源 楼主,我觉得应该用这个代码吧?
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)。
agaonet 发表于 2013-8-18 18:06 static/image/common/back.gif
楼主,我觉得应该用这个代码吧?
哦。。复制代码时忘记了。感谢提醒,已修正 请教楼主:我家的嘀嘀叫的那种灰常廉价的电子钟被我姑娘摔坏了。我拆开来看,就是一个能输出脉冲的电路板上加了一个电磁线圈。我把能输出脉冲的那两端引入到arduino上,通过从模拟端口采样,第一次发现3秒才有一次脉冲,第二次发现2秒一个脉冲。。。
我不知道我的方法对不对,贴出代码来,您帮我看看。
我主要的目的就是通过这种方法测量出脉冲的时间频率。int i=0;
void setup()
{
analogReference(EXTERNAL);
Serial.begin(9600);
pinMode(9,OUTPUT);
}
void loop()
{
int n = analogRead(A0); //读取A0口的电压值
float vol = n * (3.3 / 1024 * 100); //使用浮点数存储温度数据,温度数据由电压值换算得到(电压3.3V) //这里偷了你的代码。呵呵。
if (n>120)
{
i=i+1;
// Serial.print("Clock == ");
//Serial.print(vol);
// Serial.print(" == ");
//Serial.println(i);
digitalWrite(9,HIGH);
}
digitalWrite(9,LOW);
}电路图很简单啊,就是脉冲输出的正负级,分别接到A0和GND, 然后3.3V与AREF短接在一起,获得3.3的基准电压。 由于嘀嘀叫采用1.5v工作电压,且只需要每一秒驱动线圈输出推动嵌入了磁铁的齿轮一下,所以输出电流非常小,电压也不好测试。。用万用表几乎测量不出来。1秒一次,不知道是感应电流,还是实际的。 迷你强 发表于 2013-8-18 19:09 static/image/common/back.gif
哦。。复制代码时忘记了。感谢提醒,已修正
http://ww3.sinaimg.cn/bmiddle/6254e69fjw1e7r1jr7g8cj20hs0npgmi.jpg agaonet 发表于 2013-8-18 19:40 static/image/common/back.gif
可以参考这篇帖子
http://www.geek-workshop.com/thread-3085-1-1.html 好久没来了,想念整个论坛啊! 支持强哥精益求精!!! 迷你强 发表于 2013-8-18 20:11 static/image/common/back.gif
可以参考这篇帖子
http://www.geek-workshop.com/thread-3085-1-1.html
谢谢,我已看帖。不过你那个帖子程序时20~20MHz的,,钟表输出脉冲应该1秒一次。。。所以,无法测量哈。呵呵。谢谢。 成功了,看了之前的教程,使用了串口波形图软件,同时加了个电容(虽然找了一个电容10uf的),然后波形出来就是1秒一个脉冲,加了电容后白噪声维持在300(0~1024),然后每一秒输出一个680 or 0 ,交替出现,输出频率正好是1秒。 请问用温度的高低控制数码管的数字变化的代码怎么写?
页:
[1]
2