问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

基于STM32的ADS1115-16位ADC电压读取

创作时间:
作者:
@小白创作中心

基于STM32的ADS1115-16位ADC电压读取

引用
CSDN
1.
https://blog.csdn.net/qq_52280273/article/details/144849305

本文主要介绍基于STM32的ADS1115-16位ADC电压读取,重点讲解了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
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号