友情提示:380元/半年,儿童学编程,就上码丁实验室。
我是潘,曾经是个工程师。这是为 Ardui.Co 制作的 “Arduino 公开课” 系列的入门教程。在第7课,我们利用 Arduino 的 ADC功能测量电池电压,但是精度只有区区的10bits,这次用 I2C 来接一块精度高达 16bits 的 ADS1115:串口通信。有任何疑问请在评论区提出,我会逐一回答。
ADS1115 是一块由 IT 开发、基于 I2C 协议的ADC,可以将电压转换成16bits的数字信号,与 Arduino 内置的ADC相比,分辨率提高数十倍,而且内置了 PGA (可编程增益放大器),可以设置测量范围(±0.256V ~ 6.144V),无需参考电压,因此精度相当之高,可达 7.8125uV(即:0.0078125mV),可以应用于精密电压测量、 示波器中。而且ADS1115 供了4组模拟输入,解决了 Arduino UNO 模拟端口被 I2C 占用后不够用的问题。
ADS1115 的设置比较复杂,可以先看看其 DataSheet 第25页,有5个表格说明了如何使用该模块。但别慌,Arduino 作为成为最流行的开源平台之一,优势在于有丰富的库。TI 开发的 ADS1XXX 系列芯片的库(Adafruit_ADS1X15-master)已经有不少,只要简单的设置,即可使用。
现在,我们需要先理解这块芯片的具体性能:
首先,ADS1115 内置的 PGA 可以设置测量范围,最高为 ±6.144V,但千万不要以为它可以测量6.144V 的电压,实际上,它最高耐压不能超过 VDD 的0.3V(VDD 为 5V,实际测量范围< 5.3 V),必须切记,否则可能会损坏芯片。
PGA 的默认值是 2/3x 增益,即 ±6.144V,其分辨率为 16bits,即:
±6.144V / (2∧16 – 1) = ±6.144V / 32767 = ±0.1875 mV
与 Arduino UNO 内置的 10bits ADC,每步 4.85mV 相比,精度提高了 25倍。如果PGA 设为1x 增益,即测量范围降至 4.096V,精度为 ±0.125mV,如果 PGA 设为16x 增益,测量范围降至 ±0.256V,精度可达 ±0.0078125mV。简单来说,PGA 增益越大,测量范围越小,精度越高。默认值为 ±6.144V。
ADS1115 的地址可以通过 ADDR 与SDA、SCL、GND 或 VDD 短接,实现修改。不设置的话,默认值为 0×48,如下图:
现在,我们将 VDD 连接 Arduino 的 5V 端口,然后,用 ADS1115 的 A0 测量Arduino的3.3V 端口,但千万不要反过来,因为测量电压不能超过 VDD 的 0.3V!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
/*
作者:Ardui.Co
效果:ADS1115 16bits ADC 测量电压
版本:1.0
更新时间:2017年5月3日
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0×27,16,2);//声明I2C地址和点阵的规格为16字符和2行
#include <Adafruit_ADS1015.h>
Adafruit_ADS1115 ads;
voidsetup(void)
{
lcd.begin();
// 切记,测量电压不能超过 VDD 的0.3V !
// PGA 默认值为2/3 增益
// ADS1015 ADS1115
// ——- ——-
// ads.setGain(GAIN_TWOTHIRDS); // 2/3x gain +/- 6.144V 1 bit = 3mV 0.1875mV (default)
// ads.setGain(GAIN_ONE); // 1x gain +/- 4.096V 1 bit = 2mV 0.125mV
// ads.setGain(GAIN_TWO); // 2x gain +/- 2.048V 1 bit = 1mV 0.0625mV
// ads.setGain(GAIN_FOUR); // 4x gain +/- 1.024V 1 bit = 0.5mV 0.03125mV
// ads.setGain(GAIN_EIGHT); // 8x gain +/- 0.512V 1 bit = 0.25mV 0.015625mV
// ads.setGain(GAIN_SIXTEEN); // 16x gain +/- 0.256V 1 bit = 0.125mV 0.0078125mV
ads.begin();
}
voidloop(void)
{
doubleadc0;
adc0=ads.readADC_SingleEnded(0);
lcd.setCursor(0,0);
lcd.print(“AIN0: “);lcd.print(adc0 *0.1875/1000);
delay(100);//刷新率有上限,具体请参考DataSheet
}
|
注意:这个库有一个bug,如果测量电压为 0 ,会显示 “-1”,实际应用中要避开。