PS:截图源自立创商城,侵权必删
前言:本文主要介绍基于STM32HAL库的ADS1115使用方法,掘弃理论方面的介绍,同时给出该芯片的精简化驱动。
一、寄存器表解读
ADS111x系列芯片通过 I2C接口 提供了四个可访问的寄存器,它们通过地址指针寄存器(Address Pointer Register) 来选择访问目标。这些寄存器的功能分别是:
Conversion Register(转换寄存器):
保存最近一次模数转换(ADC)的结果。
用户可以通过读取该寄存器来获取数字化后的模拟信号值。
Config Register(配置寄存器):
用于更改ADS111x的工作模式。
可以查询设备的状态,比如是否完成转换等。
是设备操作的核心寄存器。
Lo_thresh Register(低阈值寄存器):
用于设置比较器的下限阈值。
当输入信号低于此值时,比较器会触发一个事件。
Hi_thresh Register(高阈值寄存器):
用于设置比较器的上限阈值。
当输入信号高于此值时,比较器会触发一个事件。
1. 地址指针寄存器(Address Pointer Register)
寄存器名称和作用:
地址指针寄存器 并不是一个实际存储数据的寄存器,而是一个控制机制,用于选择哪一个目标寄存器进行读写操作。通过向地址指针寄存器写入特定值,ADS111x芯片会将内部的读写焦点切换到指定的目标寄存器。
2.转换寄存器(Conversion Register)
Conversion Register(转换寄存器) 是一个 16位 的只读寄存器,用于存储最近一次完成的模数转换(ADC)结果。数据以二进制补码(Two’s Complement)格式存储。
电压跟读取到的数据的转换关系为:
V
i
n
=
O
u
t
p
u
t
C
o
d
e
2
15
×
F
.
S
.
R
.
Vin = \frac{Output \ Code}{2^{15}} \times F.S.R.
Vin=215Output Code×F.S.R.
F.S.R跟最小分辨率的对应关系是
3.配置寄存器(Config Register)
对于ADS1115有:
各个位的详细作用:
位段 | 字段名称 | 类型 | 复位值 | 功能描述 | 具体值说明 |
---|---|---|---|---|---|
15 | OS | R/W | 1b | 操作状态或单次转换启动 | |
- 写入时: | |||||
0b:无效果 | |||||
1b:在掉电模式下启动一次单次转换 | |||||
- 读取时: | |||||
0b:设备正在转换 | |||||
1b:设备处于空闲状态 | |||||
14:12 | MUX[2:0] | R/W | 000b | 输入多路复用器配置(仅ADS1115支持) | |
- 配置输入通道对: | |||||
ADS1113/1114固定为AIN0 - AIN1 | |||||
000b:AIN0 - AIN1(默认) | |||||
001b:AIN0 - AIN3 | |||||
010b:AIN1 - AIN3 | |||||
011b:AIN2 - AIN3 | |||||
100b:AIN0 GND | |||||
101b:AIN1 GND | |||||
110b:AIN2 GND | |||||
111b:AIN3 GND | |||||
11:9 | PGA[2:0] | R/W | 010b | 可编程增益放大器范围 | |
- 设置全量程范围(FSR): | |||||
000b:±6.144V | |||||
001b:±4.096V | |||||
010b:±2.048V(默认) | |||||
011b:±1.024V | |||||
100b:±0.512V | |||||
101b ~ 111b:±0.256V | |||||
8 | MODE | R/W | 1b | 设备工作模式 | |
- 控制设备转换模式: | |||||
0b:连续转换模式 | |||||
1b:单次转换模式或掉电状态(默认) | |||||
7:5 | DR[2:0] | R/W | 100b | 数据速率(SPS) | |
- 控制设备数据采样速率 | |||||
000b:8SPS | |||||
001b:16SPS | |||||
010b:32SPS | |||||
011b:64SPS | |||||
100b:128SPS(默认) | |||||
101b:250SPS | |||||
110b:475SPS | |||||
111b:860SPS | |||||
4 | COMP_MODE | R/W | 0b | 比较器模式(仅ADS1114/1115支持) | |
- 控制比较器的工作模式 | |||||
0b:传统比较器模式(默认) | |||||
1b:窗口比较器模式 | |||||
3 | COMP_POL | R/W | 0b | 比较器极性(仅ADS1114/1115支持) | |
- 控制ALERT/RDY引脚的极性 | |||||
0b:低电平有效(默认) | |||||
1b:高电平有效 | |||||
2 | COMP_LAT | R/W | 0b | 比较器锁存(仅ADS1114/1115支持) | |
- 控制ALERT/RDY引脚是否锁存 | |||||
0b:非锁存模式(默认) | |||||
1b:锁存模式 | |||||
1:0 | COMP_QUE[1:0] | R/W | 11b | 比较器队列和禁用(仅ADS1114/1115支持) | |
- 控制比较器功能及ALERT/RDY引脚行为 | |||||
00b:超过阈值1次触发 | |||||
01b:超过阈值2次触发 | |||||
10b:超过阈值4次触发 | |||||
11b:禁用比较器(默认) |
4.低阈值寄存器( Lo_thresh)和高阈值寄存器(Hi_thresh)
Lo_thresh 和 Hi_thresh 寄存器用于设置数字比较器的上下限阈值,阈值以16位二进制补码格式存储。为了确保比较器功能正确,必须在更改 PGA 设置时更新这些寄存器的值。通过设置 Hi_thresh 寄存器的最高位为 1b 和 Lo_thresh 寄存器的最高位为 0b,可以启用 ALERT/RDY 引脚的转换准备就绪功能。在单次转换模式下,ALERT/RDY 引脚输出 OS 位,而在连续转换模式下则提供连续的转换就绪脉冲。为了使比较器正常工作,Hi_thresh 寄存器的值必须大于 Lo_thresh 寄存器的值。
二、芯片使用配置流程
1.配置配置寄存器
根据配置寄存器各个位功能直接对配置寄存器进行配置即可
示例
- 15位: 1b(启动一次单次传唤)
- 14:12位: 100b (AIN0 - AGND)
- 11:19位: 001b (±4.096V)
- 8位: 1b (单次转换模式)
- 7:5位: 111b (860SPS)
- 4位: 0b(传统比较器模式)
- 3位: 1b(低电平有效)
- 2位: 0b(非锁存模式)
- 1:0位 00b(超过一次阈值触发)
综上:1000001111100000b = 0xC3E8
2.配置低阈值寄存器和高阈值寄存器
笔者在使用时使用到了多通道,因此将低阈值寄存器和高阈值寄存器两个寄存器配置成RDY引脚能在ADC电压转换结束后输出一个脉冲,检测脉冲的电平转换触发中断切换通道进行检测。要将ALERT/RDY引脚配置为转换完成就绪引脚,需要设置Hi_thresh寄存器的最高有效位(MSB)为1,并将Lo_thresh寄存器的最高有效位设置为0。这样设置启用引脚作为转换完成就绪信号的功能。
写入默认值即可
三、 硬件连线
按需选择地址引脚连接、电压采集输入引脚连接,添加IIC总线上拉电阻,电源去耦电容即可。
地址引脚选择
四、代码编写(已验证可以正常使用)
1.初始化
/**
* @brief ad1115初始化
* @param 无
* @retval 无
*/
void Ads1115_Init(void)
{
uint8_t txData[3];
uint8_t rxData[2];
txData[0] = 0xC3;
txData[1] = 0xE8;
txData[2] = HAL_I2C_Mem_Write(&ADS1115_IIC, ADS1115_ADDR, CONFIG_REGISTER, ADS1115_MEMADDSIZE, txData, 2, 0xFF); // 配置配置寄存器
HAL_Delay(1);
txData[0] = 0x80;
txData[1] = 0x00;
txData[2] = HAL_I2C_Mem_Write(&ADS1115_IIC, ADS1115_ADDR, HI_THRESH_REGISTER, ADS1115_MEMADDSIZE, txData, 2, 0xFF); // 配置高阈值寄存器
HAL_Delay(1);
txData[0] = 0x7F;
txData[1] = 0xFF;
txData[2] = HAL_I2C_Mem_Write(&ADS1115_IIC, ADS1115_ADDR, LO_THRESH_REGISTER, ADS1115_MEMADDSIZE, txData, 2, 0xFF); // 配置低阈值寄存器
}
2.电压读取
/**
* @brief ad1115电压读取
* @param 无
* @retval 电压值(单位V)
*/
float Ads1115_Voltage_Get(void)
{
uint8_t rxData[2];
float Voltage;
HAL_I2C_Mem_Read(&ADS1115_IIC, ADS1115_ADDR, CONVERSION_REGISTER, ADS1115_MEMADDSIZE, rxData, 2, 0xff);
Voltage = (((float)(rxData[0] << 8 | rxData[1])) / 32768.f) * 4.096f;
return Voltage;
}
附录(ads1115.h文件)
#ifndef __ADS1115_H_
#define __ADS1115_H_
#include "i2c.h"
#define ADS1115_IIC hi2c1
#define ADS1115_ADDR 0x48
#define ADS1115_MEMADDSIZE I2C_MEMADD_SIZE_8BIT
#define CONVERSION_REGISTER 0x00 // 转换寄存器
#define CONFIG_REGISTER 0x01 // 配置寄存器
#define LO_THRESH_REGISTER 0x02 // 低阈值寄存器
#define HI_THRESH_REGISTER 0x03 // 高阈值寄存器
#endif