ads1115使用方法


ADS1115高精度模数转换器使用指南
一、 ADS1115简介:高精度模数转换的理想选择
ADS1115是一款由德州仪器(Texas Instruments)公司推出的16位高精度、低功耗、带可编程增益放大器(PGA)的模数转换器(ADC)。它的设计初衷是为那些需要对模拟信号进行高精度测量的应用提供一个简单且可靠的解决方案。在现代电子设计中,许多传感器都输出微弱的模拟电压信号,例如温度传感器、压力传感器或应变片。这些信号往往需要被精确地数字化,才能被微控制器(MCU)等数字处理单元理解和处理。然而,许多微控制器自带的ADC功能通常精度有限(如10位或12位),且缺少可编程增益放大器,这使得它们在测量微弱信号时力不从心。ADS1115的出现正好弥补了这一不足。它拥有高达16位的有效分辨率,这意味着它可以将模拟电压的微小变化都捕捉下来,提供极高的测量精度。此外,其内置的可编程增益放大器(PGA)能够在转换前对输入信号进行放大,这对于测量毫伏(mV)甚至微伏(μV)级别的微弱信号至关重要,极大地提高了系统的灵敏度。ADS1115还集成了I2C兼容接口,使得它与微控制器的连接和通信变得异常简单,只需要两根信号线(SDA和SCL)即可实现数据传输。其小巧的封装和极低的功耗使其在电池供电的便携式设备中也大放异彩。综合来看,ADS1115凭借其高精度、高集成度和易用性的特点,成为了众多需要精确模拟量测量的项目中的首选芯片。
二、 核心概念:深入理解ADS1115的工作原理
在使用ADS1115之前,了解几个核心概念至关重要。这些概念是理解其工作方式和正确配置芯片的基础,它们直接决定了测量结果的准确性和适用性。首先是模数转换器(ADC)这一基本概念。ADC的作用是将连续变化的模拟电压信号转换为离散的数字值。ADS1115作为一款16位ADC,意味着它可以将一个完整的测量范围(例如0到5V)划分为
另一个ADS1115的关键特性是可编程增益放大器(PGA)。PGA是一个集成在芯片内部的放大器,它可以在进行模数转换之前对输入信号进行放大。增益值是可编程的,你可以根据输入信号的幅度选择不同的增益,从而使得微弱的信号也能被放大到ADC的有效测量范围内,最大限度地利用其16位分辨率。例如,如果你的传感器输出的电压范围是0到0.1V,而ADC的满量程范围是0到4.096V,那么直接转换会浪费大量的分辨率。通过将PGA增益设置为16,信号就会被放大到0到1.6V的范围,使得ADC能够更精确地捕捉到微小的电压变化。与之紧密相关的概念是满量程范围(Full-Scale Range,FSR),它代表了ADC在特定PGA增益下能够测量的最大和最小电压范围。ADS1115提供了多个可选的PGA增益设置,每个增益对应一个特定的FSR,你需要根据实际的输入信号范围来选择最合适的增益。
ADS1115支持两种主要的测量模式:单端测量(Single-ended)和差分测量(Differential)。在单端测量模式下,ADC测量的是一个输入引脚(如AIN0)相对于地(GND)的电压。这种模式适用于测量相对于地的正电压信号。而在差分测量模式下,ADC测量的是两个输入引脚之间的电压差(如AIN0和AIN1之间的电压差)。这种模式在需要消除共模噪声干扰的场合非常有用,比如在电桥电路或远距离信号传输中,由于环境噪声可能同时叠加在两条信号线上,差分测量可以有效地将这种共模噪声抵消,从而得到更纯净的信号。ADS1115提供了四个独立的模拟输入引脚(AIN0-AIN3),可以灵活配置为四路单端输入或两路差分输入,这为应用提供了极大的灵活性。
最后,采样速率(Sample Rate)也是一个重要的参数。它指的是ADC每秒可以完成多少次转换。ADS1115支持从8SPS(每秒采样8次)到860SPS的多种可编程采样速率。更高的采样速率意味着可以捕捉到更快的信号变化,但通常也会伴随着更高的功耗和更小的分辨率(某些模式下)。因此,在实际应用中,需要根据信号变化的快慢和对功耗的要求来权衡选择合适的采样速率。
三、 硬件引脚与I2C地址配置
ADS1115的硬件设计非常简洁,其引脚功能清晰明了。它通常采用小尺寸的MSOP-10或VSSOP-10封装,方便集成到紧凑的电路板上。理解每个引脚的功能是正确连接和使用ADS1115的第一步。
VDD: 电源引脚。ADS1115的工作电压范围为2.0V至5.5V,这使其与3.3V和5V的微控制器系统都能良好兼容。为了保证测量的稳定性,VDD引脚需要连接一个高质量的电源,并且在引脚附近放置一个去耦电容(通常为0.1uF)以滤除电源噪声。
GND: 地引脚。这是电路的参考地。为了保证测量的准确性,模拟地和数字地应保持良好连接,并且尽量保持干净无噪声。
SDA: I2C总线的数据线。该引脚用于在ADS1115和主设备之间传输数据。
SCL: I2C总线的时钟线。该引脚用于同步数据传输。
AIN0, AIN1, AIN2, AIN3: 模拟输入引脚。这些是ADS1115的四个模拟输入通道。它们可以被配置为单端输入(测量相对于GND的电压)或差分输入(测量两两引脚之间的电压差)。
ALERT/RDY: 警报/就绪引脚。这是一个多功能输出引脚,可以作为转换完成的指示器,也可以作为比较器功能的警报输出。当被配置为比较器警报时,一旦转换结果超出预设的阈值范围,该引脚就会被拉低。
ADDR: I2C地址引脚。这是ADS1115的一大特色,通过改变该引脚的连接方式,可以更改芯片的I2C地址,从而在同一条I2C总线上连接多个ADS1115芯片。
ADS1115的I2C地址配置非常灵活。芯片的默认7位I2C地址是1001000b
。这个地址的最后一位是可编程的,由ADDR引脚的连接状态决定。具体配置如下:
ADDR接到GND: I2C地址为
1001000b
(即十六进制0x48
)。ADDR接到VDD: I2C地址为
1001001b
(即十六进制0x49
)。ADDR接到SDA: I2C地址为
1001010b
(即十六进制0x4A
)。ADDR接到SCL: I2C地址为
1001011b
(即十六进制0x4B
)。
通过这种方式,你可以轻松地在同一个项目中集成最多四片ADS1115芯片,从而将模拟输入通道扩展到16个,而无需增加额外的I2C总线。
四、 寄存器详解:ADS1115的灵魂所在
ADS1115的功能主要通过其内部的几个寄存器来控制和配置。这些寄存器是芯片的“大脑”,你通过I2C总线向它们写入不同的数值,来告诉芯片如何进行模数转换。理解这些寄存器的每一个位(bit)的含义,是使用ADS1115的关键。ADS1115主要有四个寄存器,它们通过一个8位的寄存器指针(Register Pointer)来访问。
转换寄存器(Conversion Register,地址
0x00
):这是一个16位的只读寄存器,用于存放ADC转换的最终结果。当你启动一次转换后,转换结果会自动存入这个寄存器。要读取转换结果,只需将寄存器指针设置为0x00
,然后通过I2C总线进行一次16位的读取操作。读取到的数字值是一个补码形式的整数,你需要将其转换为实际的电压值。转换公式通常是电压值 = 转换结果 * (FSR / 32768)
,其中FSR
是当前配置的满量程范围。配置寄存器(Config Register,地址
0x01
):这是一个16位的读写寄存器,它是ADS1115最核心的控制中心。你通过向这个寄存器写入数据来配置转换模式、增益、通道选择、采样速率等所有参数。配置寄存器的结构和每个位的含义如下:这用于设置连续几次转换超出阈值后才触发警报。
00b
:在一次转换超出阈值后就触发警报。01b
:在两次连续转换超出阈值后触发警报。10b
:在四次连续转换超出阈值后触发警报。11b
:禁用比较器功能。0
:非锁存模式。一旦警报条件解除(转换结果回到阈值内),ALERT/RDY引脚会自动恢复。1
:锁存模式。ALERT/RDY引脚保持警报状态,直到你通过I2C读取转换寄存器来清除它。0
:ALERT/RDY引脚在警报时被拉低(默认)。1
:ALERT/RDY引脚在警报时被拉高。0
:传统比较器模式。当转换结果超出阈值范围时,ALERT/RDY引脚会被拉低。1
:窗口比较器模式。当转换结果位于高低阈值之间时,ALERT/RDY引脚保持高电平。这三个位用于设置ADC的采样速率。
000b
:8 SPS001b
:16 SPS010b
:32 SPS011b
:64 SPS100b
:128 SPS (默认)101b
:250 SPS110b
:475 SPS111b
:860 SPS0
:连续转换模式(Continuous-conversion mode)。一旦启动,ADS1115会持续不断地进行转换,并将结果存入转换寄存器。1
:单次转换模式(Single-shot mode)。每次转换都需要你主动设置OS位来启动。转换完成后,芯片会进入低功耗待机状态。这三个位用于设置内置PGA的增益,从而决定ADC的满量程范围(FSR)。
000b
:FSR = ±6.144V001b
:FSR = ±4.096V010b
:FSR = ±2.048V (默认)011b
:FSR = ±1.024V100b
:FSR = ±0.512V101b
:FSR = ±0.256V110b
:FSR = ±0.256V111b
:FSR = ±0.256V这三个位用于选择模拟输入通道和测量模式。
100b
:AIN0相对于GND(单端)101b
:AIN1相对于GND(单端)110b
:AIN2相对于GND(单端)111b
:AIN3相对于GND(单端)000b
:AIN0相对于AIN1(差分)001b
:AIN0相对于AIN3(差分)010b
:AIN1相对于AIN3(差分)011b
:AIN2相对于AIN3(差分)在写操作时,设置为
1
表示启动一次单次转换(Single-shot Conversion)。在读操作时,
0
表示转换正在进行中,1
表示转换已完成。如果你将ADS1115配置为连续转换模式,这个位在写操作时没有意义,始终保持
0
。在读操作时,它始终为1
,因为转换结果会不断更新。OS(Operation Status)位(Bit 15):
MUX(Multiplexer)位(Bit 14-12):
PGA(Programmable Gain Amplifier)位(Bit 11-9):
MODE(Operating Mode)位(Bit 8):
DR(Data Rate)位(Bit 7-5):
COMP_MODE(Comparator Mode)位(Bit 4):
COMP_POL(Comparator Polarity)位(Bit 3):
COMP_LAT(Comparator Latch)位(Bit 2):
COMP_QUE(Comparator Queue)位(Bit 1-0):
低阈值寄存器(Lo_thresh Register,地址
0x02
):这是一个16位的读写寄存器,用于设置比较器功能的低阈值。当转换结果低于这个值时,会触发警报。高阈值寄存器(Hi_thresh Register,地址
0x03
):这是一个16位的读写寄存器,用于设置比较器功能的高阈值。当转换结果高于这个值时,会触发警报。
五、 I2C通信协议的实现细节
与ADS1115的通信完全依赖于I2C总线。你需要遵循标准的I2C协议流程来读写ADS1115的寄存器。整个通信过程可以概括为以下几个步骤:
启动信号(START Condition):主设备通过将SDA线在SCL线为高电平时从高电平拉低来发送启动信号。
发送从设备地址(Slave Address):主设备发送ADS1115的7位I2C地址,然后跟一个读/写位(R/W)。
0
表示写操作(主设备向从设备发送数据),1
表示读操作(主设备从从设备接收数据)。ADS1115根据ADDR引脚配置的不同,会响应不同的地址。从设备应答(ACK):如果从设备成功接收到地址,它会将SDA线拉低一个时钟周期来发送应答信号。如果没有应答,主设备会认为该从设备不存在,并停止通信。
发送寄存器指针(Register Pointer):在写操作模式下,主设备接下来需要发送一个8位的寄存器指针,来告诉ADS1115它想要访问哪个寄存器(
0x00
,0x01
,0x02
,0x03
)。这个步骤至关重要,它决定了后续数据是写入配置寄存器还是阈值寄存器。数据传输:
写操作: 在发送完寄存器指针后,主设备会发送16位数据。这16位数据会被写入到由寄存器指针指定的寄存器中。例如,要配置ADS1115,你需要将16位的配置字发送到
0x01
地址。读操作: 要从ADS1115读取数据,你需要先进行一次写操作,将寄存器指针设置为你想要读取的寄存器的地址(例如
0x00
)。然后,你再次发送一个启动信号和从设备地址,但这次读/写位设置为1
。ADS1115就会自动从指定的寄存器中发送16位数据。停止信号(STOP Condition):当数据传输完成后,主设备通过将SCL线为高电平时SDA线从低电平拉高来发送停止信号,结束本次通信。
六、 软件编程示例:使用微控制器驱动ADS1115
为了更好地理解ADS1115的使用,我们通过几个具体的编程实例来详细讲解。这里我们以一个通用的微控制器平台为例,使用C语言风格的伪代码来描述操作流程。你需要根据你实际使用的微控制器平台(如Arduino、STM32等)和对应的I2C库函数来编写代码。
例一:单端测量AIN0通道电压
这个例子将演示如何配置ADS1115以单次转换模式测量AIN0相对于地(GND)的电压。
// 假设这是你的I2C库函数
// i2c_start();
// i2c_write(uint8_t data);
// i2c_read(uint8_t *data, uint8_t size);
// i2c_stop();
// ADS1115的I2C地址,假设ADDR接GND
#define ADS1115_ADDRESS 0x48
// ADS1115的寄存器地址
#define CONVERSION_REG 0x00
#define CONFIG_REG 0x01
// 配置字的各个部分
#define OS_SINGLE 0x8000 // Bit 15: 启动单次转换
#define MUX_AIN0_GND 0x4000 // Bit 14-12: AIN0单端
#define PGA_4_096V 0x0200 // Bit 11-9: PGA增益,FSR=±4.096V
#define MODE_SINGLE 0x0100 // Bit 8: 单次转换模式
#define DR_128SPS 0x0080 // Bit 7-5: 128 SPS
#define COMP_DISABLE 0x0003 // Bit 4-0: 禁用比较器
// 完整的配置字
#define ADS1115_CONFIG_WORD (OS_SINGLE | MUX_AIN0_GND | PGA_4_096V | MODE_SINGLE | DR_128SPS | COMP_DISABLE)
// 转换结果到电压的转换参数
#define FSR_VOLTAGE 4.096
#define ADC_MAX_VAL 32767 // 16位ADC,有符号,最大值是2^15-1
float readVoltage() {
uint8_t msb, lsb;
int16_t adc_value;
float voltage;
// 步骤1:配置ADS1115并启动转换
// 发送I2C启动信号
i2c_start();
// 发送ADS1115地址(写模式)
i2c_write((ADS1115_ADDRESS << 1) | 0);
// 发送寄存器指针,指向配置寄存器
i2c_write(CONFIG_REG);
// 发送配置字的高8位
i2c_write((ADS1115_CONFIG_WORD >> 8) & 0xFF);
// 发送配置字的低8位
i2c_write(ADS1115_CONFIG_WORD & 0xFF);
// 发送I2C停止信号
i2c_stop();
// 步骤2:等待转换完成
// 你可以使用ALERT/RDY引脚中断,或者简单地延时等待
// 对于128SPS,转换时间大约是1/128秒,即7.8ms
delay(10);
// 步骤3:读取转换结果
// 发送I2C启动信号
i2c_start();
// 发送ADS1115地址(写模式)
i2c_write((ADS1115_ADDRESS << 1) | 0);
// 发送寄存器指针,指向转换寄存器
i2c_write(CONVERSION_REG);
// 发送I2C停止信号
i2c_stop();
// 重新发送启动信号,并切换到读模式
i2c_start();
i2c_write((ADS1115_ADDRESS << 1) | 1);
// 从ADS1115读取16位数据
i2c_read(&msb, 1);
i2c_read(&lsb, 1);
// 发送I2C停止信号
i2c_stop();
// 步骤4:处理数据
// 将两个8位数据组合成一个16位有符号整数
adc_value = (msb << 8) | lsb;
// 将ADC值转换为电压
voltage = (float)adc_value * FSR_VOLTAGE / ADC_MAX_VAL;
return voltage;
}
这段代码详细地展示了从配置芯片、等待转换、读取数据到最终计算电压值的完整流程。配置字中的每一个位都是根据我们前面介绍的寄存器结构精心设计的,通过按位或(|
)运算将它们组合在一起。在实际编程中,强烈建议使用库函数来封装这些I2C操作,这样代码会更加清晰易读。
例二:差分测量AIN0与AIN1之间的电压差
差分测量是ADS1115的又一强大功能,它能有效地抑制共模噪声。这个例子将展示如何配置芯片进行AIN0和AIN1之间的差分测量。
// 假设I2C库函数和宏定义与上例相同
#define MUX_AIN0_AIN1 0x0000 // Bit 14-12: AIN0与AIN1差分
// 新的完整配置字,只需改变MUX部分
#define ADS1115_DIFF_CONFIG_WORD (OS_SINGLE | MUX_AIN0_AIN1 | PGA_4_096V | MODE_SINGLE | DR_128SPS
| COMP_DISABLE)
float readDifferentialVoltage() {
uint8_t msb, lsb;
int16_t adc_value;
float voltage;
// 步骤1:配置ADS1115并启动差分转换
// I2C通信过程与单端测量类似,只是配置字不同
i2c_start();
i2c_write((ADS1115_ADDRESS << 1) | 0);
i2c_write(CONFIG_REG);
i2c_write((ADS1115_DIFF_CONFIG_WORD >> 8) & 0xFF);
i2c_write(ADS1115_DIFF_CONFIG_WORD & 0xFF);
i2c_stop();
// 步骤2:等待转换完成
delay(10);
// 步骤3:读取转换结果
i2c_start();
i2c_write((ADS1115_ADDRESS << 1) | 0);
i2c_write(CONVERSION_REG);
i2c_stop();
i2c_start();
i2c_write((ADS1115_ADDRESS << 1) | 1);
i2c_read(&msb, 1);
i2c_read(&lsb, 1);
i2c_stop();
// 步骤4:处理数据并计算电压
adc_value = (msb << 8) | lsb;
voltage = (float)adc_value * FSR_VOLTAGE / ADC_MAX_VAL;
return voltage;
}
可以看到,差分测量的代码逻辑与单端测量几乎完全相同,唯一的区别在于配置字中的MUX
位设置。这体现了ADS1115的配置灵活性和易用性。通过修改配置字中的几个位,你就可以轻松地在不同的测量模式、通道和增益之间切换。
例三:使用比较器功能
ADS1115的比较器功能非常实用,它可以用于创建电压监控或警报系统,而无需微控制器时刻轮询读取ADC值。当ADC值超出预设范围时,ALERT/RDY引脚会自动触发,从而产生一个硬件中断,通知微控制器采取行动。
// 假设I2C库函数和宏定义与上例相同
#define ALERT_PIN 2 // 假设ADS1115的ALERT/RDY引脚连接到微控制器的GPIO引脚2
// 配置字中的比较器部分
#define COMP_MODE_TRADITIONAL 0x0010 // Bit 4: 传统比较器模式
#define COMP_POL_LOW 0x0000 // Bit 3: 警报时拉低
#define COMP_LAT_NON_LATCHING 0x0000 // Bit 2: 非锁存模式
#define COMP_QUE_ONE 0x0000 // Bit 1-0: 一次超出就警报
// 完整的配置字(以AIN0单端测量为例)
#define ADS1115_COMP_CONFIG_WORD (OS_SINGLE | MUX_AIN0_GND | PGA_4_096V | MODE_SINGLE | DR_128SPS
| COMP_MODE_TRADITIONAL | COMP_POL_LOW | COMP_LAT_NON_LATCHING | COMP_QUE_ONE)
// 阈值寄存器地址
#define LOW_THRESH_REG 0x02
#define HIGH_THRESH_REG 0x03
void setupComparator() {
// 假设我们希望在电压低于0.5V或高于3.0V时触发警报
// 先将电压转换为ADC值
int16_t low_thresh_adc = (int16_t)(0.5 * ADC_MAX_VAL / FSR_VOLTAGE);
int16_t high_thresh_adc = (int16_t)(3.0 * ADC_MAX_VAL / FSR_VOLTAGE);
// 步骤1:配置高低阈值寄存器
i2c_start();
i2c_write((ADS1115_ADDRESS << 1) | 0);
i2c_write(LOW_THRESH_REG); // 指向低阈值寄存器
i2c_write((low_thresh_adc >> 8) & 0xFF);
i2c_write(low_thresh_adc & 0xFF);
i2c_stop();
i2c_start();
i2c_write((ADS1115_ADDRESS << 1) | 0);
i2c_write(HIGH_THRESH_REG); // 指向高阈值寄存器
i2c_write((high_thresh_adc >> 8) & 0xFF);
i2c_write(high_thresh_adc & 0xFF);
i2c_stop();
// 步骤2:配置ADS1115以启用比较器
i2c_start();
i2c_write((ADS1115_ADDRESS << 1) | 0);
i2c_write(CONFIG_REG);
i2c_write((ADS1115_COMP_CONFIG_WORD >> 8) & 0xFF);
i2c_write(ADS1115_COMP_CONFIG_WORD & 0xFF);
i2c_stop();
// 现在,只要电压超出阈值,ALERT/RDY引脚就会被拉低
// 你可以在微控制器中配置一个外部中断,当该引脚电平变化时触发
// 例如:attachInterrupt(digitalPinToInterrupt(ALERT_PIN), handleAlert, FALLING);
}
这个例子展示了比较器功能的设置过程。首先,你需要将你希望的电压阈值转换为ADC值,并写入高低阈值寄存器。然后,你需要配置主配置寄存器中的比较器相关位,来启用该功能并设置其工作模式。一旦设置完成,ADS1115就会在后台自主监控电压,从而极大地减轻了微控制器的处理负担。
七、 深入探索:高级应用与技巧
掌握了ADS1115的基本使用方法后,我们可以进一步探讨一些高级的应用技巧,以期在更复杂的项目中充分发挥其潜力。这些技巧包括如何优化测量精度、如何降低功耗以及如何管理多个ADS1115芯片。
1. 噪声抑制与过采样ADS1115的16位分辨率已经非常高,但在实际应用中,测量结果仍然可能受到各种噪声的干扰,例如电源噪声、电磁干扰(EMI)或传感器自身的噪声。为了进一步提高测量的信噪比(SNR),我们可以采用一些软件算法,其中最常用的是过采样与滤波。过采样是指以高于奈奎斯特频率(Nyquist frequency)的频率进行采样。尽管ADS1115的采样率有上限,但我们可以通过软件方法来实现类似的效果。一种简单而有效的方法是在短时间内连续读取多次ADC转换结果,然后对这些结果进行平均。这种方法可以有效地平滑掉随机噪声,得到一个更稳定的读数。ADS1115的内部数据速率(DR)设置也提供了多种选择,通常较低的采样速率(如8SPS)会带来更好的噪声性能,因为它在转换时会进行更长时间的积分,从而更好地抑制工频干扰(50Hz/60Hz)。在配置ADS1115时,如果你的信号变化缓慢,选择较低的采样率可以获得更高的精度。
2. 功耗管理与低功耗模式在电池供电的应用中,功耗是一个需要优先考虑的关键因素。ADS1115提供了单次转换模式和连续转换模式。在单次转换模式下,每次转换完成后,ADS1115会自动进入低功耗待机模式,此时功耗会大大降低。只有当你再次向配置寄存器写入启动转换的命令时,芯片才会再次唤醒。这种模式非常适合那些只需要定期进行一次测量的应用,例如每隔几秒钟测量一次温度。而在连续转换模式下,芯片会持续不断地进行转换,保持在工作状态,功耗相对较高。对于那些需要连续实时监控的场景,这种模式是必要的。因此,在设计功耗敏感的应用时,应优先考虑单次转换模式,并通过微控制器的定时器定期唤醒ADS1115进行测量。
3. 多芯片共存与地址扩展前面我们已经提到,通过配置ADDR引脚,可以在同一条I2C总线上连接多达四片ADS1115芯片。这使得在一个项目中扩展模拟输入通道变得非常方便。在编程时,你只需要为每片ADS1115定义不同的I2C地址,然后通过在I2C通信时使用不同的地址来与特定的芯片进行通信。例如,如果你有两片ADS1115,一片的ADDR引脚接GND(地址0x48
),另一片的ADDR引脚接VDD(地址0x49
)。当你想读取第一片芯片的AIN0通道时,I2C通信的地址就是0x48
。当你想读取第二片芯片的AIN0通道时,I2C通信的地址就变为0x49
。这种设计极大地简化了硬件布线,并提高了系统的可扩展性。
4. 硬件与软件校准尽管ADS1115本身具有很高的精度,但在某些极端高要求的应用中,进行校准仍然是必要的。校准主要分为两个方面:零点校准(Offset Calibration)和增益校准(Gain Calibration)。
零点校准: 零点校准的目的是消除ADC的固有零点偏移。你可以将一个已知为0V的信号连接到ADS1115的输入端,例如将AIN0和GND短接,然后进行一次模数转换。读取到的ADC值理论上应该是0,但实际上可能存在一个微小的偏差。你可以将这个偏差记录下来,并在后续的所有测量结果中减去这个偏差值。
增益校准: 增益校准的目的是修正ADC的增益误差。你可以将一个已知精确电压源(例如1.000V)连接到ADS1115的输入端,然后进行一次转换。将读取到的ADC值与理论值进行比较,计算出增益误差。在后续的计算中,你可以通过乘以一个校准系数来修正这个增益误差。 校准可以显著提高ADS1115的绝对测量精度,特别是在测量范围很小的情况下。
八、 常见问题与排查
在使用ADS1115的过程中,可能会遇到一些常见的问题。了解这些问题的原因和解决方案可以帮助你快速排除故障,保证项目的顺利进行。
1. 无法进行I2C通信:
问题原因: 最常见的原因是硬件连接错误或I2C地址错误。
排查方法:
检查ADS1115的VDD和GND引脚是否正确连接,电源电压是否在2.0V至5.5V的范围内。
检查SDA和SCL引脚是否与微控制器的I2C引脚正确连接。
I2C上拉电阻: 检查SDA和SCL线上是否都连接了上拉电阻(通常为4.7kΩ)。I2C协议要求这两条线在空闲时为高电平。
检查ADDR引脚的连接状态,确保你在程序中使用的I2C地址与实际硬件连接相匹配。
2. 读数不稳定或跳动剧烈:
问题原因: 读数不稳定通常是由噪声引起的。
排查方法:
电源噪声: 检查电源是否干净。在VDD和GND之间放置一个0.1uF的陶瓷电容,可以有效地滤除高频噪声。
输入信号噪声: 如果你的输入信号本身就存在噪声,可以尝试在ADS1115的输入引脚前添加一个简单的RC低通滤波器来滤除高频噪声。
地线噪声: 确保ADS1115的GND引脚和输入信号的地线都有一个干净、低阻抗的连接。
采样速率: 尝试使用较低的采样速率(如8SPS),这通常能提供更好的噪声抑制效果。
3. 测量结果不准确:
问题原因: 测量结果不准确可能与满量程范围(FSR)、增益设置或ADC的零点偏移有关。
排查方法:
增益与FSR: 检查你在配置寄存器中设置的PGA增益是否与你的输入信号范围相匹配。如果你的输入电压超过了当前设置的FSR,ADC的输出会饱和,导致读数不准确。
参考电压: 检查ADS1115的参考电压(ADS1115使用内部基准,但其输出结果与增益和FSR相关)和电源电压是否稳定。
校准: 如果你有高精度的电压表,可以尝试进行简单的零点和增益校准,以提高测量的绝对精度。
4. 比较器功能不工作:
问题原因: 比较器功能不工作通常是由于配置错误或ALERT/RDY引脚没有正确连接。
排查方法:
配置字: 检查配置寄存器中的
COMP_MODE
、COMP_POL
、COMP_LAT
和COMP_QUE
位是否正确设置。特别是COMP_QUE
位,如果设置为11b
,则比较器功能被禁用。阈值设置: 检查你写入高低阈值寄存器的ADC值是否正确。
硬件连接: 确保ALERT/RDY引脚与微控制器的GPIO引脚正确连接,并且如果你的微控制器使用了中断,确保中断服务函数被正确注册。
总结
ADS1115是一款功能强大、易于使用的高精度模数转换器。它凭借其16位分辨率、可编程增益放大器、多通道输入和灵活的I2C接口,成为了从初学者到专业工程师都喜爱的芯片。掌握其核心概念、寄存器配置和通信协议是成功应用它的关键。通过仔细阅读数据手册、理解每个寄存器位的作用,并结合实际的编程实践,你将能够充分利用ADS1115的强大功能,为你的项目提供精确、可靠的模拟量测量。希望这篇详尽的指南能帮助你更好地理解和应用ADS1115,让你的电子设计之旅更加顺畅。
责任编辑:David
【免责声明】
1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。
2、本文的引用仅供读者交流学习使用,不涉及商业目的。
3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。
4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。
拍明芯城拥有对此声明的最终解释权。