“第十九课--Microduino 内部基准源ADC采样/zh”的版本间的差异
(→原理图) |
|||
第1行: | 第1行: | ||
− | |||
{| style="width: 800px;" | {| style="width: 800px;" | ||
|- | |- | ||
| | | | ||
==目的== | ==目的== | ||
− | + | 前面讲过LM35采集时每升高10mv电压代表着温度上升1℃,两者成线性关系。因此对电压稳定性要求很高。本实验将通过调用Microduino 内部基准源(3.3V或1.1V电压)结合LM35采集温度。 | |
− | + | *'''[[Microduino-Core]]''' | |
− | + | *'''[[Microduino-FT232R]]''' | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | * | ||
− | |||
− | '''[[Microduino-Core]]''' | ||
− | '''[[Microduino-FT232R]]''' | ||
*其他硬件设备 | *其他硬件设备 | ||
− | **面包板跳线 | + | **面包板跳线 一盒 |
− | **面包板 | + | **面包板 一块 |
− | ** | + | **USB数据连接线 一根 |
− | ** | + | **LM35D温度传感器 一个 |
− | ** | + | **数字万用表 一个 |
− | |||
==原理图== | ==原理图== | ||
− | + | 原理图接法与以往一样LM35的VCC接5V,GND接GND,VOUT接A0. | |
− | + | [[File:第十八课-原理图.jpg|600px|center|thumb]] | |
− | [[File: | + | ===实验一=== |
− | + | *用Microduino-Ft232RL供电 | |
− | == | + | **程序 |
− | * | ||
<source lang="cpp"> | <source lang="cpp"> | ||
− | + | void setup() { | |
− | + | Serial.begin(115200); //使用115200速率进行串口通讯 | |
− | + | pinMode(A0, INPUT); | |
− | |||
− | void setup() | ||
− | { | ||
− | |||
− | |||
− | |||
} | } | ||
− | + | void loop() { | |
− | void loop() | + | int n = analogRead(A0); //读取A0口的电压值 |
− | { | + | double vol = n * (5.0 / 1024.0*100); //使用双精度浮点数存储温度数据,温度数据由电压值换算得到 |
− | + | Serial.println(vol); //串口输出温度数据 | |
− | + | delay(1000); //等待1秒,控制刷新速度 | |
− | |||
− | |||
− | // | ||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
</source> | </source> | ||
− | * | + | 串口监视温度数据: |
+ | [[File:第十八课-USB供电.jpg|600px|center|thumb]] | ||
+ | ===实验二=== | ||
+ | *用Microduino 内部基准源1.1V计算温度值 | ||
+ | **程序 | ||
<source lang="cpp"> | <source lang="cpp"> | ||
− | + | void setup() { | |
− | + | Serial.begin(115200); //使用115200速率进行串口通讯 | |
− | + | analogReference(INTERNAL); //调用板载1.1V基准源 | |
− | void | + | } |
− | { | + | void loop() { |
− | + | int n = analogRead(A0); //读取A0口的电压值 | |
− | + | double vol = n * (1.1 / 1024.0*100); //使用双精度浮点数存储温度数据,温度数据由电压值换算得到 | |
+ | Serial.println(vol); //串口输出温度数据 | ||
+ | delay(1000); //等待1秒,控制刷新速度 | ||
} | } | ||
+ | </source> | ||
+ | 串口监视温度数据: | ||
+ | [[File:第十八课-1.1V基准电源.jpg|600px|center|thumb]] | ||
+ | ===实验三=== | ||
+ | *用Microduino 内部基准源3.3V计算温度值 | ||
+ | '''注意:使用aref引脚电压作为基准源,需要将3.3V基准源接入Microduino的 aref接口。''' | ||
+ | [[File:第十八课-3.3基准原理图.jpg|600px|center|thumb]] | ||
− | void | + | 基准源3.3V作为外部基准源使用详细参考:http://www.geek-workshop.com/thread-5717-1-1.html |
− | { | + | *程序 |
− | + | <source lang="cpp"> | |
− | + | void setup() { | |
− | + | Serial.begin(115200); //使用115200速率进行串口通讯 | |
− | + | analogReference(EXTERNAL); //使用aref引脚电压作为基准源,需要将3.3V基准源接入Microduino的 aref接口 | |
− | |||
− | |||
− | |||
} | } | ||
− | + | void loop() { | |
− | void | + | int n = analogRead(A0); //读取A0口的电压值 |
− | + | double vol = n * (3.3 / 1024.0*100); //使用双精度浮点数存储温度数据,温度数据由电压值换算得到 | |
− | + | Serial.println(vol); //串口输出温度数据 | |
+ | delay(1000); //等待1秒,控制刷新速度 | ||
} | } | ||
</source> | </source> | ||
+ | 串口监视温度数据: | ||
+ | [[File:第十八课-3.3V基准电源.jpg|600px|center|thumb]] | ||
+ | ==分析== | ||
+ | 本次使用三种不同方法,同一温度传感器得到不同数值。 | ||
+ | *使用USB供电稍微好一点,供电电压为4.99V,偏离5V电压0.2%。 | ||
+ | *调用内部1.1V和3.3V基准源,经过批量采样,1.1V内部基准源的平均误差范围在1.22%左右,最高达到2.2%。 | ||
+ | *在5V量程下,Arduino ADC的采样精度是10位也就是1024级,最小分辨率为5/1024=0.0048828125 V=4.8828125 mV | ||
+ | *在3.3V内部基准源量程下,Arduino ADC的采样精度是10位,最小分辨率为3.3/1024=0.00322265625 V=3.22265625 mV | ||
+ | *在1.1V内部基准源量程下,Arduino ADC的采样精度是10位,最小分辨率为1.1/1024=0.00107421875 V=1.07421875 mV | ||
+ | *LM35是每10mV代表1℃,在5V量程下,分辨率接近0.5度;3.3V量程下分辨率接近0.3度;1.1V量程下分辨率接近0.1度。 | ||
==结果== | ==结果== | ||
− | + | 通过以上分析换算,这次使用USB供电时,基准源误差相对于其他更小一些,USB供电温度更接近真实温度,但是当供电环境不稳定时,内部基准源就发挥作用了。如果进一步要求更高级精度,那么就需要使用精密外部基准源。基准误差越小,ADC的精度也就越高,根据需求环境选用合适的基准源在各种制作中也是很重要的一个环节。 | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | ==视频== | ||
|} | |} |
2014年4月22日 (二) 03:31的版本
目的前面讲过LM35采集时每升高10mv电压代表着温度上升1℃,两者成线性关系。因此对电压稳定性要求很高。本实验将通过调用Microduino 内部基准源(3.3V或1.1V电压)结合LM35采集温度。
原理图原理图接法与以往一样LM35的VCC接5V,GND接GND,VOUT接A0. 实验一
void setup() {
Serial.begin(115200); //使用115200速率进行串口通讯
pinMode(A0, INPUT);
}
void loop() {
int n = analogRead(A0); //读取A0口的电压值
double vol = n * (5.0 / 1024.0*100); //使用双精度浮点数存储温度数据,温度数据由电压值换算得到
Serial.println(vol); //串口输出温度数据
delay(1000); //等待1秒,控制刷新速度
}
串口监视温度数据: 实验二
void setup() {
Serial.begin(115200); //使用115200速率进行串口通讯
analogReference(INTERNAL); //调用板载1.1V基准源
}
void loop() {
int n = analogRead(A0); //读取A0口的电压值
double vol = n * (1.1 / 1024.0*100); //使用双精度浮点数存储温度数据,温度数据由电压值换算得到
Serial.println(vol); //串口输出温度数据
delay(1000); //等待1秒,控制刷新速度
}
串口监视温度数据: 实验三
注意:使用aref引脚电压作为基准源,需要将3.3V基准源接入Microduino的 aref接口。 基准源3.3V作为外部基准源使用详细参考:http://www.geek-workshop.com/thread-5717-1-1.html
void setup() {
Serial.begin(115200); //使用115200速率进行串口通讯
analogReference(EXTERNAL); //使用aref引脚电压作为基准源,需要将3.3V基准源接入Microduino的 aref接口
}
void loop() {
int n = analogRead(A0); //读取A0口的电压值
double vol = n * (3.3 / 1024.0*100); //使用双精度浮点数存储温度数据,温度数据由电压值换算得到
Serial.println(vol); //串口输出温度数据
delay(1000); //等待1秒,控制刷新速度
}
串口监视温度数据: 分析本次使用三种不同方法,同一温度传感器得到不同数值。
结果通过以上分析换算,这次使用USB供电时,基准源误差相对于其他更小一些,USB供电温度更接近真实温度,但是当供电环境不稳定时,内部基准源就发挥作用了。如果进一步要求更高级精度,那么就需要使用精密外部基准源。基准误差越小,ADC的精度也就越高,根据需求环境选用合适的基准源在各种制作中也是很重要的一个环节。 视频 |