基于STM32F103的ADS1115驱动代码
基于STM32F103的ADS1115驱动代码,完整项目代码
·
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可满足多数低功耗、高精度模拟信号采集需求。
**
附件部分:下载的资源为完整的项目工程代码。
**
更多推荐



所有评论(0)