友情提示:380元/半年,儿童学编程,就上码丁实验室。
我是潘,曾经是个工程师。这是“Arduino 公开课” 系列的入门教程。第7课我们会继续利用 Arduino 模拟端口和ADC功能,测量电池电压,还会涉及到新的知识:串口通信。有任何疑问请在评论区提出,我会逐一回答。
第5课已经讲过,Arduino Uno能够读取 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() 将电压在屏幕打印出来:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
/*
作者:Ardui.Co
效果:串口显示模拟端口的电压值
版本:1.0
更新时间:2017年1月8日
*/
voidsetup()
{
Serial.begin(9600);//指定串口通讯比特率为9600
}
voidloop()
{
intv=analogRead(A0); //从A0口读取电压,模拟端口电压测量范围为0-5V,返回的值为0-1024
floatvolt=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
因此调整一下换算语句就能得出实际电压:
1
|
floatvolt=v *(5.0/1024.0)*2
|
但经过分压电路的测量会降低分辨率 (R1+R2)/ R1 倍(上述电路为 2 倍),如果分压式电阻R1 = 10K,R2 = 20K,可以测量 0 ~ 15V ,但分辨率降低 3 倍。换句话说,分压测量越高的电压,分辨率就越底。
ADC 的测量精度十分重要,尤其对数控机床、3D打印、机器人、能源系统等现实应用中。下一课我们用另外一个案例,来介绍怎样提高 Arduino 模拟端口分辨率。