ADS1115概述

ADS1115是德州仪器(TI)推出的一款16位高精度、低功耗模数转换器(ADC),支持I²C接口,适用于传感器信号采集、电池监测等场景。其特点包括可编程增益放大器(PGA)、内部参考电压和4个单端/2个差分输入通道。


主要特性

  • 分辨率:16位(最小可检测电压低至125μV)。
  • 采样速率:8SPS至860SPS(可编程)。
  • 输入范围:±6.144V(默认增益),支持±0.256V至±6.144V多档可调。
  • 接口:I²C兼容,地址可配置(默认0x48)。
  • 低功耗:连续模式下仅150μA,单次模式下可自动休眠。

硬件连接

典型电路连接

  • VDD:接3.3V或5V电源(需与逻辑电平匹配)。
  • GND:共地。
  • SCL/SDA:连接MCU的I²C时钟和数据线。
  • ALERT/RDY:可配置为中断引脚(可选)。
  • A0-A3:模拟输入通道(单端或差分模式)。

注意:若输入电压超过电源电压,需外部分压或保护电路。


寄存器配置

ADS1115通过配置寄存器控制工作模式,关键寄存器如下:

配置寄存器(0x01)
  • OS:单次转换启动位(写1开始转换)。
  • MUX:输入通道选择(如0x4000为A0单端)。
  • PGA:增益设置(如0x0200为±2.048V范围)。
  • MODE:0为连续模式,1为单次模式。
  • DR:数据速率(如0x0080为128SPS)。

电压计算

转换结果需根据PGA设置转换为实际电压:
Voltage=ADC_Reading×PGA_Range32768 \text{Voltage} = \frac{\text{ADC\_Reading} \times \text{PGA\_Range}}{32768} Voltage=32768ADC_Reading×PGA_Range
例如,PGA范围为±2.048V时,若读数为16384,则电压为:
16384×2.04832768=1.024V \frac{16384 \times 2.048}{32768} = 1.024V 3276816384×2.048=1.024V


基于STM32的代码示例

代码由本人亲自编写并测试通过,其IIC部分使用的是正点原子的驱动代码。
以下为头文件代码示例


#define ADS_ADDRESS					0x90		//地址

#define ADS_CMD_W					0x00		//写命令
#define ADS_CMD_R					0x01 		//读命令

//功能寄存地址
#define POINTER_REG_CONVERSION		0x00		//转换寄存器
#define POINTER_REG_CONFIG			0x01		//配置寄存器
#define POINTER_LO_THRESH			0x02		//低阀值寄存器
#define POINTER_HI_THRESH			0x03		//高阀值寄存器


//配置寄存器的相关标志位(16位)
//运行状态
#define OS_BIT_0					0x00		//写0无效;读为0时当前正在执行转换
#define OS_BIT_1					0x80		//写入1时开始启动单次转换(在断电状态下);读为1时则当前末执行转换

//转换通道配置
#define MUX_CONFIG_AINP0N1			0x00		//AINp=AIN0, AINn=AIN1
#define MUX_CONFIG_AINP0N3 			0x10    	//AINp=AIN0, AINn=AIN3
#define MUX_CONFIG_AINP1N3			0x20    	//AINp=AIN1, AINn=AIN3
#define MUX_CONFIG_AINP2N3			0x30    	//AINp=AIN2, AINn=AIN3
#define MUX_CONFIG_AINP0NG			0x40    	//AINp=AIN0, AINn=GND
#define MUX_CONFIG_AINP1NG			0x50    	//AINp=AIN1, AINn=GND
#define MUX_CONFIG_AINP2NG			0x60    	//AINp=AIN2, AINn=GND
#define MUX_CONFIG_AINP3NG			0x70    	//AINp=AIN3, AINn=GND  更改通道需要更改mux的值

//增益放大器配置,可提供从±256mV到±6.144V 的输入范围
#define FSR_CONFIG_6144				0x00		//FSR=±6.144V
#define FSR_CONFIG_4096				0x20      	//FSR=±4.096V
#define FSR_CONFIG_2048				0x40     	//FSR=±2.048V
#define FSR_CONFIG_1024				0x60     	//FSR=±1.024V
#define FSR_CONFIG_512 				0x80     	//FSR=±0.512V
#define FSR_CONFIG_256 				0xA0     	//FSR=±0.256V
//#define FSR_CONFIG_256 			0xC0     	//FSR=±0.256V
//#define FSR_CONFIG_256 			0xE0     	//FSR=±0.256V

//转换模式配置
#define MODE_CONFIG_CM 				0x00		//连续转换模式
#define MODE_CONFIG_SM				0x01		//单次转换模式,一次转换后自动断电

//转换速率配置
#define DR_CONFIG_8   				0x00   		//每秒8个样本
#define DR_CONFIG_16   				0x20   		//每秒16个样本
#define DR_CONFIG_32  				0x40   		//每秒32个样本
#define DR_CONFIG_64   				0x60   		//每秒64个样本
#define DR_CONFIG_128  				0x80   		//每秒128个样本
#define DR_CONFIG_250   			0xA0   		//每秒250个样本
#define DR_CONFIG_475  				0xC0   		//每秒475个样本
#define DR_CONFIG_860   			0xE0   		//每秒860个样本
 
//比较器模式
#define COMP_MODE_TC				0x00		//传统比较器(默认)模式
#define COMP_MODE_WC				0x10		//窗口比较器模式

//比较器极性
#define COMP_POL_LOW				0x00		//低电平有效(默认)
#define COMP_POL_HIGH				0x08		//高电平有效

//锁存比较器
#define COMP_LAT_NC					0x00		//非锁存比较器(默认)
#define COMP_LAT_LC					0x40		//锁存比较器

//比较器置位和禁用
#define COMP_QUE_ONE_CV				0x00		//一次转换后断言
#define COMP_QUE_TWO_CV				0x01		//两次转换后置位
#define COMP_QUE_FOUR_CV			0x02		//四次转换后置位
#define COMP_QUE_DISABLE			0x03		//禁用比较器并将ALERT/RDY引脚设置为高阻抗(默认)

C文件代码示例

/************************************************
 *   ADDR---> GND
 *   VDD ---> 3.3V
 *   SCL ---> PB11
 *   SDA ---> PB10
 *   AINp=AIN3, AINn=GND
 *   输入在A0通道,测量A0与GND的电压,通过更改mux的值来改变
 *	 注意若要在程序中切换通道,中间必须延时5毫秒,否则采集值不准
*************************************************/
void ADS1115_Init(void)
{
	IIC_Init();
}

void ADS1115_Write_Reg(uint8_t RegAdd,uint8_t VALUE_H,uint8_t VALUE_L)
{
	IIC_Start();
	IIC_Send_Byte(ADS_ADDRESS|ADS_CMD_W);		//配置寄存器
	IIC_Wait_Ack();
	IIC_Send_Byte(RegAdd);						//写入配置寄存命令
	IIC_Wait_Ack();
	IIC_Send_Byte(VALUE_H);						//写入配置寄存器的高8位
	IIC_Wait_Ack();
	IIC_Send_Byte(VALUE_L);						//写入配置寄存器的低8位
	IIC_Wait_Ack();
	IIC_Stop();
}

uint16_t ADS1115_Read_Reg(uint8_t RegAdd)
{
	uint16_t ValueH,ValueL;
	
	IIC_Start();
	IIC_Send_Byte(ADS_ADDRESS|ADS_CMD_W);
	IIC_Wait_Ack();
	IIC_Send_Byte(RegAdd);
	IIC_Wait_Ack();
	
	IIC_Start();
	IIC_Send_Byte(ADS_ADDRESS|ADS_CMD_R);
	IIC_Wait_Ack();
	ValueH = IIC_Read_Byte(1);	
	ValueL = IIC_Read_Byte(1);
	
	IIC_Stop();
	
	return (ValueH<<8)|ValueL;
}


void ADS1115_Test(void)
{
	uint8_t VALUE_H,VALUE_L;
	
	VALUE_H = OS_BIT_1|MUX_CONFIG_AINP0NG|FSR_CONFIG_6144|MODE_CONFIG_CM;				//配置通道0与GND,使用分辨率为6144			
	VALUE_L = DR_CONFIG_128|COMP_MODE_TC|COMP_POL_LOW|COMP_LAT_NC|COMP_QUE_DISABLE;		//转换速率为860Hz
	
	ADS1115_Write_Reg(POINTER_REG_CONFIG,VALUE_H,VALUE_L);
}


// 冒泡排序函数
void Bubble_Sort(uint16_t *arr, uint16_t len) 
{
    uint16_t i,j,temp;
	
	for (i = 0; i < len - 1; i++) 
	{
        for (j = 0; j < len - 1 - i; j++) 
		{
            if (arr[j] > arr[j + 1]) // 交换元素位置
			{
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

uint16_t ADS1115_Read_AvgValue(void)
{
	uint8_t i;
	uint16_t Value[10];
	uint32_t SumValue=0;

	for(i=0;i<10;i++)
	{
		Value[i] = ADS1115_Read_Reg(POINTER_REG_CONVERSION);		//读取转换值
	}
	Bubble_Sort(Value,10);											//对读取的数值进行排序
	
	for(i=1;i<9;i++)
	{
		SumValue += Value[i];
	}
	SumValue = SumValue/8;
	
	return SumValue;
}

uint16_t ADS1115_Read_Voltage(void)
{
	uint16_t Value;
	
	Value = ADS1115_Read_AvgValue();
	
	if(Value>=0x8000) 								//数值超过0x8000(32768)则为负值电压
	{		
		return ((0xFFFF-Value)*6144/32768);			//单位mV
	}
	else
	{
		return (Value*6144/32768);					//选择的量程(当前是6.144)/ 0x8000 = 分辨率(0.0001875),只需要读到的数据 * 分辨率(0.0001875)= 电压值
	}
}

常见问题

  • I²C地址冲突:通过ADDR引脚可修改地址(0x48-0x4B)。
  • 噪声抑制:增加电源去耦电容(0.1μF靠近VDD)。
  • 负电压测量:需使用差分输入模式或电平移位电路。

应用场景

  • 精密温度测量(如热电偶)。
  • 电池电压/电流监控。
  • 应变片或压力传感器信号采集。

通过合理配置,ADS1115可满足多数低功耗、高精度模拟信号采集需求。

**

附件部分:下载的资源为完整的项目工程代码。

**

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐