Arduino Mega 2560能够读取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()将电压在屏幕打印出来:

/*

作者:Ardui.Co

效果:串口显示模拟端口的电压值

版本:1.0

更新时间:2017年1月8日

*/

void setup()

{

Serial.begin(9600); //指定串口通讯比特率为9600

}

void loop()

{

int v = analogRead(A0); //从A0口读取电压,模拟端口电压测量范围为0-5V,返回的值为0-1024

float volt = v * (5.0 / 1024.0); //将返回值换算成电压

Serial.print(volt); //串口输出电压值

Serial.println(" V"); //输出单位,并且换行

delay(1000); //输出后等待1s,降低刷新速度

}

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

因此调整一下换算语句就能得出实际电压:

float volt = v * (5.0 / 1024.0) * 2

1

floatvolt=v*(5.0/1024.0)*2

但经过分压电路的测量会降低分辨率(R1+R2)/ R1倍(上述电路为2倍),如果分压式电阻R1 = 10K,R2 = 20K,可以测量0 ~ 15V,但分辨率降低3倍。换句话说,分压测量越高的电压,分辨率就越底。

我们会用温度传感器实验,来介绍ADC的分辨率,同时会学到怎样利用Arduino内部参考电压提高测量精度。

LM35是美国国家半导体(现被TI收购)推出的精密温度传感,其信号输出为模拟量:电压值与温度(摄氏)呈正比。不仅体积非常小(常见TO-92封装),而且不需额外的校正,就能获得较高的精度。

其主要特性:

供电电压:4~35V

工作范围:与芯片有关,LM35A为-55~150°C 常见LM35D为0~100°C

测量范围:与封装和电路有关,常用TO-92为2 ~150°C

测量精度:与芯片有关,LM35A性能最优,这次实验用的LM35D最差,其典型值为±0.8°C,最大值±2°C

电压与温度的关系: Vout = Temperature × 10mV/°C

想了解更多,可以参考官方 DataSheet。接线方式如下:

电压转换方式:

Vin为输入(被测量)电压;Vref是参考电压,若不设置就是供电电压,Arduino Mega 2560为5V;resolution是模拟端口的ADC bit,Arduino Mega 2560模拟端口为10bit,Result为模拟端口的测量结果,数值为0~1023。程序如下:

/*

作者:Ardui.Co

效果:LM35 简单温度测量

版本:1.0

更新时间:2017年1月9日

*/

int LM35 = A0; //指定A0端口读取LM35

float Vin; //存储传感器电压

float temperature; //存储温度测量结果

void setup()

{

Serial.begin(9600); //初始化串口连接

}

void loop()

{

Vin = analogRead(LM35) * 5.0 / 1024; //计算出A0的电压,单位为V

temperature = Vin * 1000.0 / 10.0; //将A0电压要转换成mV,根据LM35转换系数10mV/°C,除以10,得出温度

Serial.print("Temperature: "); //在串口监视器输出结果

Serial.print(temperature);

Serial.println(" *C");

delay(500); //延时0.5s

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

/*

作者:Ardui.Co

效果:LM35 简单温度测量

版本:1.0

更新时间:2017年1月9日

*/

intLM35=A0;//指定A0端口读取LM35

floatVin;//存储传感器电压

floattemperature;//存储温度测量结果

voidsetup()

{

Serial.begin(9600);//初始化串口连接

}

voidloop()

{

Vin=analogRead(LM35)*5.0/1024;//计算出A0的电压,单位为V

temperature=Vin*1000.0/10.0;//将A0电压要转换成mV,根据LM35转换系数10mV/°C,除以10,得出温度

Serial.print("Temperature: ");//在串口监视器输出结果

Serial.print(temperature);

Serial.println(" *C");

delay(500);//延时0.5s

}

ADC测量精度问题:

对于5V参考电压来说,每级为5V / 1024 = 4.88mV,转化为温度,每级分辨率就是0.488 °C。如果环境温度为T,Arduino Mega 2560的测量结果是0.488 Result,但Result是0 ~ 1023的正整数,误差τ就是

τ = T mod 0.488 (mod为求余运算)

Arduino Mega 2560内置了1.1v参考电压,使用这个参考电压,每级为1.1V / 1024  = 1.07mV,每级分辨率提高到0.107°C。

如果环境温度为10°C,取5V参考电压的分辨率为0.24°C,取1.1V参考电压则为0.049°C;如果环境温度为25°C,取5V参考电压的误差为0.112°C,取1.1V参考电压则为0.069°C。

接线不变,调整一下程序,引入Arduino的内部参考电压:

/*

作者:Ardui.Co

效果:LM35 使用1.1内部参考电压提高分辨率

版本:1.0

更新时间:2017年1月9日

*/

int LM35 = A0; //指定A0端口读取LM35

float Vin; //存储传感器电压

float temperature; //存储温度测量结果

void setup()

{

analogReference(INTERNAL); //使用内部参考电压

Serial.begin(9600);

}

void loop()

{

Vin = analogRead(LM35) * 1.1 / 1024; //计算出A0的电压,单位为V

temperature = Vin * 1000.0 / 10.0; //将A0电压要转换成mV,根据LM35转换系数10mV/°C,除以10,得出温度

Serial.print("Temperature: "); //在串口监视器输出结果

Serial.print(temperature);

Serial.println(" *C");

delay(500);

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

/*

作者:Ardui.Co

效果:LM35 使用1.1内部参考电压提高分辨率

版本:1.0

更新时间:2017年1月9日

*/

intLM35=A0;//指定A0端口读取LM35

floatVin;//存储传感器电压

floattemperature;//存储温度测量结果

voidsetup()

{

analogReference(INTERNAL);//使用内部参考电压

Serial.begin(9600);

}

voidloop()

{

Vin=analogRead(LM35)*1.1/1024;//计算出A0的电压,单位为V

temperature=Vin*1000.0/10.0;//将A0电压要转换成mV,根据LM35转换系数10mV/°C,除以10,得出温度

Serial.print("Temperature: ");//在串口监视器输出结果

Serial.print(temperature);

Serial.println(" *C");

delay(500);

}

参考电压稳定性:

由于参考电压跟Vin和温度成正比,实际中的电源电压往往十分不稳定,电池电压会随着电量变化(比如:单个锂离子放电电压约为4.25V ~ 2.95V),开关电源会有50 ~ 200mV纹波,常见的USB电源在不同负载上约有±4%的变化。

但别以为用Arduino Mega 2560内部参考电压就万事大吉,其误差更高达5%。因此,使用内部基准源在提高分辨能力的同时,也引入了额外的测量误差,所以要用稳定性高的参考电压。

其实,也有一个折中的方案。Arduino Mega 2560内部提供了一块LDO(低压差稳压IC),为3.3V端口供电。LDO一般为德州仪器的 LP2985-33DBVR,其误差小于1.5%,用它来做外部参考电压,相对5V来说分辨率更高,相对1.1V内部参考电压来说,测量误差更小。

要使用外部参考电压,将Aref连接到3.3V端口:

我们将3.3V的端口跟Aref链接,并在内部程序中声明:

/*

作者:Ardui.Co

效果:LM35 使用3.3外部参考电压提高分辨率

版本:1.0

更新时间:2017年1月10日

*/

int LM35 = A0; //指定A0端口读取LM35

float Vin; //存储传感器电压

float temperature; //存储温度测量结果

void setup()

{

analogReference(EXTERNAL); //使用内部参考电压

Serial.begin(9600);

}

void loop()

{

Vin = analogRead(LM35) * 3.3 / 1024; //计算出A0的电压,单位为V

temperature = Vin * 1000.0 / 10.0; //将A0电压要转换成mV,根据LM35转换系数10mV/°C,除以10,得出温度

Serial.print("Temperature: "); //在串口监视器输出结果

Serial.print(temperature);

Serial.println(" *C");

delay(500);

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

/*

作者:Ardui.Co

效果:LM35 使用3.3外部参考电压提高分辨率

版本:1.0

更新时间:2017年1月10日

*/

intLM35=A0;//指定A0端口读取LM35

floatVin;//存储传感器电压

floattemperature;//存储温度测量结果

voidsetup()

{

analogReference(EXTERNAL);//使用内部参考电压

Serial.begin(9600);

}

voidloop()

{

Vin=analogRead(LM35)*3.3/1024;//计算出A0的电压,单位为V

temperature=Vin*1000.0/10.0;//将A0电压要转换成mV,根据LM35转换系数10mV/°C,除以10,得出温度

Serial.print("Temperature: ");//在串口监视器输出结果

Serial.print(temperature);

Serial.println(" *C");

delay(500);

}

我们还可以Aref连接到Arduino开发板之外的参考源上,以获取更精确的测量结果。

另外,要提高的分辨率,除了改变参考电压,也可以采用高位数的ADC芯片,不少精密ADC可达16bit以上分辨率。

参考链接

arduino最大电压_Arduino Mega 2560测量电压与ADC精度相关推荐

  1. Arduino - 利用电阻进行分压,测量12V电压

    Arduino针脚供电最大5V,电流最大40毫安左右. 如果直接接入12V电压,则可能烧毁. 所以,需要把12V电压,转变为Arduino可接受的电压和电流值才行. 所以,需要从电压和电流两方面来做限 ...

  2. Arduino mega 2560 上传项目总是出错最全解决方案以及串口测试教程

    一:串口识别和驱动安装需要保证准确无误 1.运行arduino mega 2560 首先需要安装串口驱动,这样我们用USB将板子和我们计算机连接的时候,使得我们的计算机能够识别连接的串口并且能够连接上 ...

  3. PCB 零件尺寸图:Arduino Mega 2560 尺寸

    Arduino Mega 2560 尺寸图

  4. Arduino MEGA 2560找不到驱动怎么办

    刚买了Arduino MEGA 2560(比Arduino UNO稍微高级一点的板子),按照视频一步一步操作(似乎插板子也不太一样,不管他,能插上去就完事了),但是到了代码烧录的时候,点击Tools- ...

  5. 单片机STM8S测量电压电路_单片机电路设计中的10个难点

    单片机是嵌入式系统的核心元件,使用单片机的电路要复杂得多,但在更改和添加新功能时,带有单片机的电路更加容易实现,这也正是电器设备使用单片机的原因.那么在单片机电路的设计中需要注意的难点有哪些? 嵌入式 ...

  6. STM32----重温ADC测量电压值

    ADC测量电压值 实现目标使用两个按键控制串口的输出和ADC的转换.使用DMA将ADC数据存放在内存中,然后计算对应的电压值.然后由串口1发送至上位机. 主要讲一下对于按键和串口的配置与之前都一样只是 ...

  7. 中移4G模块-ML302-OpenCpu开发-PCF8591测量电压

    B站:https://space.bilibili.com/309103931 中移4G模块-ML302专栏:https://blog.csdn.net/qq_33259323/category_10 ...

  8. 【电机控制】Arduino mega 2560控制42步进电机接线

    Arduino mega 2560控制42步进电机接线图 ****TB6600驱动器与42步进电机接线图**** 接线: 12V电源适配器正负极分别接驱动器VCC和GND 步进电机黑绿红蓝线分别接驱动 ...

  9. 钳形万用表使用方法,如何测量电压、电流、电阻?

    钳形电流表是由电流互感器和电流表组合而成.电流互感器的铁心在捏紧扳手时可以张开:被测电流所通过的导线可以不必切断就可穿过铁心张开的缺口,当放开扳手后铁心闭合. 钳形电流表是由电流互感器和电流表组合而成 ...

最新文章

  1. oracle00214,oracle添加控制文件,ORA-00214: 错误
  2. JSP 第一天:提交表单--获取表单中的数据值
  3. MySQL Index详解
  4. [python] 列表解析式的高效与简洁
  5. 【JUnit】BeforeClass、AfterClass、Before与After示例
  6. app测试-兼容性测试与云测试技术
  7. 何小鹏:雷军造车是我“怂恿的” 我一直建议小米要造车
  8. “小程序 · 云开发”重磅上线,让小程序开发更高效!
  9. html 将光标移动到某行,如何将QTextBrowser(其中包含html表)的光标移动到PyQt5中的特定行?...
  10. SIEMENS报到第一天
  11. DeepMind新建虚拟认识实验室,像研究人类一样研究AI(代码开源)
  12. OpenCV测试摄像头帧率
  13. UltraCompare v2022文本比较
  14. CVPR2021论文列表(中英对照)
  15. 如何解决MathPage.wll文件找不到问题
  16. ​LeetCode刷题实战623:在二叉树中增加一行
  17. 计算机轴测图绘图实验报告,Auto_CAD实验报告_轴测图.doc
  18. 竞品分析:阿里云 VS 腾讯云,AT的短兵相接
  19. JS - 笛卡尔积算法
  20. 堆垛实训报告总结_叉车实训总结

热门文章

  1. AP Autosar平台设计 5 EM 6SM
  2. 2022留学生落户上海能通过年终奖提高社保基数吗?
  3. Exploratory Social Network Analysis with Pajek(第三版)6-1
  4. 预测和健康管理原则(PHM)
  5. Windows 安全基础
  6. 课题——无线遥控实现
  7. mips平台下使用jiffies_to_msecs差值计算rtt不准确问题
  8. web页面常见的错误
  9. html转义和反转义
  10. AXI4_full协议详解