ADS1115--已调通(附源码)

本文详细介绍了ADS1115这款16位∑-Δ型ADC,包括其工作原理、输入多路复用器、可编程增益放大器、IIC通信方式以及工作流程。通过配置寄存器Configregister实现不同功能,并提供了STM32的工程源码示例。文章还涵盖了读写时序逻辑以及阈值寄存器的使用,帮助读者理解和应用ADS1115。
摘要由CSDN通过智能技术生成

前言

最近做项目用到了ADS1115,一款常用的16位ADC,下面说说本人的理解

简介


对于用户来说我们能从上面这张框图GET到以下几点:

  1. adc类型为16位∑-Δ型,意味着精度还是比较高了

  2. MUX为输入多路复用器,作用可以理解为对输入方式进行选择,比如是用差分还是单端输入

  3. PGA为可编程增益放大器,根据需要负责把模拟量进行放大

  4. 此款adc采用了IIC通信,与IIC相关的引脚为SCL,SDA,ADDR,其中ADDR为从机地址选择引脚
    在这里插入图片描述
    本文ADDR直接接地,所以从机地址为0x90

  5. Comparator为可编程比较器,作用是在配置好相应的寄存机阈值后进行报警输出(本文未涉及)

工作流程

在这里插入图片描述
上图是ADS1115读的时序逻辑:主机发送开始信号->主机发送从机地址->等待从机应答->主机发送需要操作的寄存器(这里是 Conversion register 里面装着转换好的数字量)->等待从机应答->主机发送停止信号->主机发送开始信号->主机发送从机地址->等待从机应答->主机读取高八位数字量->等待从机应答->主机读取低八位数字量->等待从机应答->主机发送停止信号

在这里插入图片描述
上图是ADS1115写的时序逻辑:主机发送开始信号->主机发送从机地址->等待从机应答->主机发送需要操作的寄存器(这里是 Config register 配置ADS1115的一些参数,后面会分析)->等待从机应答->主机发送配置数据的高八位->等待从机应答->主机发送配置数据的低八位->等待从机应答->主机发送停止信号

寄存器讲解

在这里插入图片描述

ADS1115有4个寄存器,分别是前面提到的Conversion register(16位)、Config register(16位)与两个设置阈值的寄存器(使能比较模式时用)

宏定义四个寄存器的地址

#define REG_Conversion   0x00
#define REG_config		 0x01
#define REG_L_thresh 	 0x02
#define REG_H_thresh 	 0x03

下面详细说说Config register
在这里插入图片描述
在这里插入图片描述

/*****************Config Register**********/
#define OS 		1 		//Operational status or single-shot conversion start
#define MUX 	0x04 	//[2:0]Input multiplexer configuration
#define PGA 	0x01	//Programmable gain amplifier configuration
#define MODE  0x00	//Device operating mode

#define DR				0x04//Data rate
#define	COMP_MODE	0 	// Comparator mode
#define COMP_POL 	0		//Comparator polarity
#define COMP_LAT	0 	//Latching comparator
#define COMP_QUE	0x3	//Comparator queue and disable

#define config_MSB (OS << 7)|(MUX << 4)|(PGA << 1)|(MODE)//0xC2
#define config_LSB (DR << 5)|(COMP_MODE << 4)|(COMP_POL << 3)|(COMP_LAT << 2)|(COMP_QUE)//

第15位:OS读操作可以知道当前设备的工作状态,写操作可以设置单次转换(必须为断电模式下,当对OS写1时,设备会进入上电模式并完成一次数据转换,然后会自动将OS置0)下面是数据手册的解释
在这里插入图片描述
第14-12位:MUX2为输入多路复用器,对输入模式进行选择,如上图有八种输入模式,分别是四种差分与四种单端输入,本文配置为A0单端输入(0x04)
第11-9位:PGA为可编程增益放大器,设置FSR(满刻度的范围),本文配置为-4.096V-4.096V(0x01)后面电压计算公式与这个有关
第8位:MODE选择持续转换模式与单拍模式(单排模式需要OS位触发),本文配置为连续转换模式(0x00)
第7-5位:DR配置data rate数据传输速率,本文配置为128SPS(0x04)
第4-2位:对比较器的配置(由于本文未涉及,在这就不多说了)
第1-0位:本位配置为关闭比较器并将ALERT/RDY引脚设置为高阻抗模式(0x3)

源码

//ads1115.h
#ifndef ADS1115_H
#define ADS1115_H
#include "i2c.h"
/*******************************************************************************
ADDR--GND
SLAVE ADDRESS 0X90
*******************************************************************************/  

/*****************Pointer Register*************/
#define REG_Conversion   0x00
#define REG_config		 0x01
#define REG_L_thresh 	 0x02
#define REG_H_thresh 	 0x03

/*****************Conversion Register**********/
//存放着16位结果

/*****************Config Register**********/
#define OS 		1 		//Operational status or single-shot conversion start
#define MUX 	0x04 	//[2:0]Input multiplexer configuration
#define PGA 	0x01	//Programmable gain amplifier configuration
#define MODE  0x00	//Device operating mode

 

#define DR				0x04//Data rate
#define	COMP_MODE	0 	// Comparator mode
#define COMP_POL 	0		//Comparator polarity
#define COMP_LAT	0 	//Latching comparator
#define COMP_QUE	0x3	//Comparator queue and disable

#define config_MSB (OS << 7)|(MUX << 4)|(PGA << 1)|(MODE)//0xC2
#define config_LSB (DR << 5)|(COMP_MODE << 4)|(COMP_POL << 3)|(COMP_LAT << 2)|(COMP_QUE)//0x83

/*****************Lo_thresh Register**********/
#define Lo_thresh	0x8000	// Low threshold value
#define Hi_thresh 0x7FFF	// High threshold value

void ADS1115_Write(u8 Reg , u8 reg_MSB , u8 reg_LSB);
float ADS1115_ReadAD(void);
void ADS115_config(void);
#endif


//ads1115.c
#include "ads1115.h"
#include "SysTick.h"

void ADS1115_Write(u8 Reg , u8 reg_MSB , u8 reg_LSB)
{	
	I2C_Start();
	I2C_SendByte(0x90+0);//0x90地址+0写位
	while(I2C_WaitAck());
	I2C_SendByte(Reg);
	while(I2C_WaitAck());
	I2C_SendByte(reg_MSB);
	while(I2C_WaitAck());
	I2C_SendByte(reg_LSB);
	while(I2C_WaitAck());
	I2C_Stop();
}
float ADS1115_ReadAD()
{
	float ret;
	
	uint16_t data;
	I2C_Start();
	I2C_SendByte(0x90+0);//0x90地址+0写位
	while(I2C_WaitAck());
	I2C_SendByte(REG_Conversion);
	while(I2C_WaitAck());
	I2C_Stop();
	delay_us(5);
	I2C_Start();
	I2C_SendByte(0x90+1);//0x90地址+1读位
	while(I2C_WaitAck());
	data = I2C_ReadByte(1);
	data = (data <<	8)&0xff00;//前8位
	data+=	I2C_ReadByte(1);//后8位
	I2C_Stop();
	//数值计算取决于PGA配置
	if(data>0x8000)
		ret=((float)(0xffff-data)/32768.0)*4.096;
	else
		ret=((float)data/32768.0)*4.096;
	
	return ret;
	
}

void ADS115_config()
{

	ADS1115_Write(REG_config, config_MSB ,config_LSB);
}

源码讲解

代码中主要有void ADS115_config()与float ADS1115_ReadAD()两个函数
其中ADS115_config()配置函数的功能是对Config register寄存器进行配置,写入的值为0xC2(config_MSB )0x83(config_LSB)
ADS1115_ReadAD()函数返回的值为转换好的电压值
这两个函数的逻辑完全是按照上方的工作流程来写

资源链接

链接:https://pan.baidu.com/s/1OzdbtXzelk2rutXFWvmooA
提取码:5iqt

  • 34
    点赞
  • 135
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值