分享

Arduino使用ADS1115 ADC读差分电压

 新用户5228KeDY 2021-10-10

以前用Arduino碰到过负电压,例如某个电阻一端接地,而其上电流在某个时刻反向了,还要测量电阻两端的电压,这个时候就会遇到负电压。Arduino本身没有办法测量负电压,所以遇到的几次,都是在GND前面加上3.3V或者用其他的电压撑起来,之后再在代码里面减去,挺笨拙地解决了,直到发现ADS1115。ADS1115可以直接测量负电压。ADS1115是16位分辨率的高精度ADC,51、Arduino、树莓派等都能使用它,精度高,成本低,资料多(其实也不多)。

1. ADS1115ADC引脚

下面的模块是最常见的。它需要寻址。ADDR不同地址不同解码方式。有四个地址可用。

以下模块不太常见。地址预设为0x48。不包括警报/就绪信号。在大多数应用中,也不需要此信号。

2. ADS1115ADC模块寻址

ADS1115的四个地址是通过将ADDR引脚连接到SCL、SDA、GND或VDD来设置的。下图说明了这些连接是如何建立的,并提供了这些连接的地址号。

3.ADS1115精度与范围

ADS1115的输出是有符号整数,第一个位用于表达正负号,因此用于AD转换的数值,只有个,首位0,最后一位32767。

默认模式下,ADS1115测量范围为,即32767表示6.144V,这样,ADS1115的分辨率就是

这是远大于Arduino ADC的5 mV/bit的分辨率的。

4.Arduino ADS1115单端应用

先需要下载Adafruit发布的ADS1X15的库,地址https://github.com/adafruit/Adafruit_ADS1X15。

作为Demo,我们要测量Arduino的3.3V电压。注意接线图ADDR与GND连接。

使用以下代码,注意“Adafruit_ADS1115 ads(0x48);”的地址0x48,目前这个构造函数在新的库里面,是不需要显式声明地址的,这可以在库示例里面看到。另外,0.1875 mV因子也是默认的。实际A0、A1、A2、A3是可以同时采集电压的。

#include <Wire.h>
#include <Adafruit_ADS1015.h>

Adafruit_ADS1115 ads(0x48);
float Voltage = 0.0;

void setup(void)
{
Serial.begin(9600);
ads.begin();
}

void loop(void)
{
int16_t adc0; // we read from the ADC, we have a sixteen bit integer as a result

adc0 = ads.readADC_SingleEnded(0);
Voltage = (adc0 * 0.1875)/1000;

Serial.print("AIN0: ");
Serial.print(adc0);
Serial.print("\tVoltage: ");
Serial.println(Voltage, 7);
Serial.println();

delay(1000);
}

5.ADS1115 Arduino差分测量

我们前面提到负电压,即低于GND的电势Arduino无法直接测量,实际上对差分来说,即使两端均非GND,也是可以直接测量的,这正是差分测量的好处。

下面的示例,是在ADS1115的A0与A1之间测量差分电压,如果A1电势高,就会得到正的示数,反之则为负数。接线图如图,注意A0、A1是ADS1115上面的,别找到Arduino板子上去。Arduino一般默认即高阻态,18650即使接到A0与A1之间,也不会有什么危险,但不会得到正确的示数。

使用的代码。库文件里面也有示例。

#include <Wire.h>
#include <Adafruit_ADS1015.h>

Adafruit_ADS1115 ads; // Declare an instance of the ADS1115

int16_t rawADCvalue; // The is where we store the value we receive from the ADS1115
float scalefactor = 0.1875F; // This is the scale factor for the default +/- 6.144 Volt Range we will use
float volts = 0.0; // The result of applying the scale factor to the raw value

void setup(void)
{
Serial.begin(9600);
ads.begin();
}

void loop(void)
{

rawADCvalue = ads.readADC_Differential_0_1();
volts = (rawADCvalue * scalefactor)/1000.0;

Serial.print("Raw ADC Value = ");
Serial.print(rawADCvalue);
Serial.print("\tVoltage Measured = ");
Serial.println(volts,6);
Serial.println();


delay(1000);
}

实物图,左右两个图里,电源正负极换了一下位置。

当电压为负时,串口得到。我们的稳压电源监视器则显示电压为3.33V。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多