0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

51驱动ADS1115 AD采集

jf_88434166 来源:jf_88434166 2026-04-11 16:48 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、ADS1115简介

ADS1115是高精度模数转换器(adc),具有16位分辨率。数据通过兼容lIC的串行接口传输,可以选择四个IIC从地址,ads1115单电源工作范围为2.0V至5.5V。ADS1115可以以每秒860个采样的速率执行转换。ADS1115上提供板载PGA,提供从电源到低至±256mV的输入范围,允许大小信号都具有输入多路复用器(MUX),提供两个差分或四个单端输入。

在这里插入图片描述

二、引脚功能

在这里插入图片描述

ADDRIIC地址选择
ALERT/RDY比较器输出高低或转换就绪
GND电源地
AIN0-AIN3模拟量输入
VDD电源正
SDAIIC时钟线
SCLIIC数据线

ADS1115引脚ADDR用于设置器件的IIC地址, 该引脚可以连接到GND、VDD、SDA、SCL,从而选择四个不同的IIC地址。本文使用的模块ADDR引脚接在GND上,故从机地址为0x90/0x91。
在这里插入图片描述

三、功能介绍

1.MULTIPLEXER

ADS1115包含一个输入多路复用器,可以测量四个单端或两个差分信号。另外,AIN0和AlN1与AIN3的测量值可能存在差异。多路复用器由配置寄存器中的3位配置。当测量单端信号时,ADC的负输入通过多路复用器内的开关连接到GND。
在这里插入图片描述

2.量程

量程由配置寄存器 PGA[2:0]位控制
在这里插入图片描述

3.数字比较器

ADS1115和ADS1114具有一个可编程的数字比较器,ALERT/RDY引脚可以发出警报。Config寄存器中的COMP_MODE位将比较器配置为传统比较器或窗口比较器。在传统的比较器模式中,当转换数据超过高阈值寄存器(Hi_thresh)中设置的限制时,ALERT/RDY引脚置为有效(默认情况下激活低电平)。然后,只有当转换数据低于低阈值寄存器(Lo_thresh)中设置的限制时,比较器才会解除操作。在窗口比较器模式下,当转换数据超过Hi_thresh寄存器值或低于Lo_thresh寄存器值时,ALERT/RDY引脚会断言。在窗口模式或传统比较器模式中,比较器都可以配置为在Config寄存器中的COMP_LAT位断言之后锁存。这种设置使引脚电平保持不变,即使输入信号没有超出阈值寄存器的界限。这个锁存引脚电平只能通过发出SMBus警报响应或读取转换寄存器来清除。ALERT/RDY引脚可以通过配置寄存器中的COMP_POL位配置为高电平或低电平。比较器还可以配置为仅在一组连续读数超过阈值寄存器(Hi_thresh和Lo_thresh)中设置的阈值后才激活ALERT/RDY引脚。Config寄存器中的COMP_QUE[1:0]位配置比较器在激活ALERT/RDY引脚之前等待超过阈值的一个、两个或四个读数。COMP_QUE[1:0]位也可以禁用比较器功能,并将ALERT/RDY引脚置于高状态

提示:本次实验没有使用比较器,比较器的相关配置参考配置寄存器的低五位

4.寄存器写入或读取时序

为了从ADS111x访问一个特定的寄存器,主机必须首先写一个合适的值到地址指针寄存器中的地址指针位P[1:0]。地址指针寄存器被直接写入到从地址字节、低R / W位和成功的从机确认之后。写入地址指针寄存器后,从机应答,而主机发出STOP或重复的START条件。当从ADS111x读取时,先前写入位P[1:0]的值决定了要读取的寄存器。要改变读哪个寄存器,必须向P[1:0]写入一个新值。为了写一个新值到P[1:0],主机发出一个低R/W位的从地址字节,后面跟着地址指针寄存器字节。不需要传输额外的数据,主机可以发出STOP条件。主服务器现在可以发出START条件,并发送R/W位高的从服务器地址字节开始读取。
在这里插入图片描述
在这里插入图片描述

5.数据格式

ADS111x提供16位二进制补码格式的数据。正满量程(+FS)输入产生7FFFh的输出代码,负满量程(-FS)输入产生8000h的输出代码。对于超过满量程的信号,输出在这些代码处进行处理。下图总结了不同输入信号的理想输出码与显示了代码转换与输入电压的关系。
在这里插入图片描述

四、寄存器介绍

1.地址指针寄存器

ADS1115所有四个寄存器都是通过写入地址指针寄存器来访问的
在这里插入图片描述
在这里插入图片描述

2.转化数据存放寄存器

16位转换寄存器以二进制二进制的补码格式包含最后一次转换的结果。上电后,转换寄存器被清除为0,并保持0,直到第一次转换完成
在这里插入图片描述

3.配置寄存器

16位配置寄存器用于控制操作模式、输入选择、数据速率、满量程范围和比较器模式。
在这里插入图片描述

Bit字段类型复位值描述
15OSR/W1h运行状态或单次转换启动该位决定设备的运行状态。 操作系统只能在下电状态下写入,在转换过程中没有作用。写入:0:没有效果1:启动单次转换(在断电状态下)读时:0:设备当前正在执行转换1:设备当前未执行转换
14:12MUX[2:0]R/W0h输入多路复用配置000 : AINP = AIN0 and AINN = AIN1 (default) 001 : AINP = AIN0 and AINN = AIN3010 : AINP = AIN1 and AINN = AIN3 011 : AINP = AIN2 and AINN = AIN3100 : AINP = AIN0 and AINN = GND 101 : AINP = AIN1 and AINN = GND110 : AINP = AIN2 and AINN = GND 111 : AINP = AIN3 and AINN = GND
11:9PGA[2:0]R/W2h可编程增益放大器配置 这些位设置可编程增益放大器的FSR 000 : FSR = ±6.144 V001 : FSR = ±4.096 V010 : FSR = ±2.048 V (default)011 : FSR = ±1.024 V100 : FSR = ±0.512 V101 : FSR = ±0.256 V110 : FSR = ±0.256 V111 : FSR = ±0.256 V
8MODER/W1h设备运行方式这个位控制操作模式。0:连续转换模式1:单次模式或掉电状态(默认)
7:5DR[2:0]R/W4h数据速率这些位控制数据速率设置。000 : 8 SPS 001 : 16 SPS 010 : 32 SPS011 : 64 SPS 100 : 128 SPS (default) 101 : 250 SPS 110 : 475 SPS 111 : 860 SPS
4COMP_MODER/W0h比较器模式该位控制比较器工作0:传统比较器(默认)1:窗口比较器
3COMP_POLR/W0h比较器极性该位控制ALERT / RDY引脚的极性0:低电平有效(默认)1:高电平有效
2COMP_LATR/W0h锁存比较器该位控制ALERT / RDY引脚在被置为有效后锁存,还是在转换后处于上限和下限阈值范围之内清零。0:非锁存比较器。 置位后ALERT / RDY引脚不锁存(默认)1:锁存比较器。 置为有效的ALERT / RDY引脚保持锁存状态,直到转换数据由主服务器或适当的SMBus警报响应读取由主机发送。 设备以其地址响应,它是最低的当前声明ALERT / RDY总线的地址。
1:0COMP_QUE[1:0]R/W3h比较器置位和禁用这些位执行两个功能。 设置为11时,比较器被禁用,ALERT / RDY引脚被设置为高阻抗状态。 当设置为任何其他值时,将启用ALERT / RDY引脚和比较器功能,并且该设置值确定连续的转换次数超过在声明ALERT / RDY引脚之前所需的上限或下限阈值00:一次转换后断言01:两次转换后置位10:四次转换后置位11:禁用比较器并将ALERT / RDY引脚设置为高阻抗(默认)

4.比较器高低阈值寄存器

Lo_thresh (P[1:0] = 2h) [reset = 8000h]
Hi_thresh (P[1:0] = 3h) [reset = 7FFFh]
比较器使用的上限和下限阈值以二进制补码格式存储在两个16位寄存器中。所述比较器实现为数字比较器;因此,无论PGA设置何时更改,这些寄存器中的值都必须更新。通过将Hi_thresh寄存器MSB设置为1和Lo_thresh寄存器MSB设置为0,可以启用ALERT/RDY引脚的转换准备功能。要使用ALERT/RDY引脚的比较器函数,Hi_thresh寄存器值必须始终大于Lo_thresh寄存器值。当设置为RDY模式时,ALERT/RDY引脚在单镜头模式下输出OS位,并在连续转换模式下提供连续转换准备脉冲。
在这里插入图片描述

五、程序

ADS1115.C

#include < STC89C5xRC.H >
#include < IIC.H >
/*****************寄存器位置*************/
#define REG_Conversion 0x00
#define REG_config		 0x01
#define REG_L_thresh 	 0x02
#define REG_H_thresh 	 0x03
 
 
/*****************寄存器EG_Conversion**********/
//存放着16位结果


/*****************寄存器REG_config的位**********/
#define OS 				1 		//操作状态或单发转换启动  (1位)
#define MUX 			0x04 	//输入多路配置  通道0  (3位)
#define PGA 			0x00	//可编程增益放大器配置  量程 ±6.144  V  (3位)
#define MODE		  0x00	//设备运行方式  连续转换模式  (1位)
#define DR				0x03  //转换速率64SPS  (3位)
#define	COMP_MODE	0 		//比较器模式  传统比较器  (默认)(1位)
#define COMP_POL 	0			//比较器极性  低电平有效  (默认)(1位)
#define COMP_LAT	0 		//锁存比较器  非锁存比较器, 置位后ALERT / RDY引脚不锁存  (默认)(1位)
#define COMP_QUE	0x03 	//比较器置位和禁用  禁用 (默认)(2位)
 
#define config_MSB (OS < < 7)|(MUX < < 4)|(PGA < < 1)|(MODE)//OS移动到高8位 MUX移动到高7位 PGA移动到高四位 MODE高一位
#define config_LSB (DR < < 5)|(COMP_MODE < < 4)|(COMP_POL < < 3)|(COMP_LAT < < 2)|(COMP_QUE)//DR移动到低8位,COMP_MODE移动到低5位,COMP_POL移动到低4位,COMP_LAT移动到低3位,COMP_QUE最后两位
 
 
/*****************寄存器REG_L_thresh REG_H_thresh值**********/
#define Lo_thresh	0x8000  // 比较器低阈值
#define Hi_thresh 0x7FFF  // 比较器高阈值


void ADS1115_Write()
{
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_ReceiveAck();//没有对返回的 ACK 做处理
	IIC_SendByte(REG_config);
	IIC_ReceiveAck();
	IIC_SendByte(config_MSB);
	IIC_ReceiveAck();
	IIC_SendByte(config_LSB);
	IIC_ReceiveAck();
  IIC_Stop();
}

float ADS1115_Read()
{
	float ret=0;
	unsigned int ad=0;
	
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_ReceiveAck();//没有对返回的 ACK 做处理
	IIC_SendByte(REG_Conversion);
	IIC_ReceiveAck();

	IIC_Start();
	IIC_SendByte(0x90+1);
	IIC_ReceiveAck();
	ad = IIC_ReceiveByte();
	ad = (ad< < 8)|IIC_ReceiveByte();
	IIC_SendAck(1);
	IIC_Stop();
	
	if(ad >0x8000)//如果是负压
	{
		ret =(float)(((0xFFFF-ad)*6.144)/32768);//分辨率:6.144÷2^15  电压=分辨率*AD值
	}else
	{
		ret =(float)ad*(6.144/32768);
	}
	
	return ret;
}

main.C

#include < STC89C5xRC.H >
#include < IIC.H >
#include < uart.H >
#include < ADS1115.H >
#include < delay.H >

//整形数据转字符数组
void IntToString(unsigned char *str,unsigned int dat)//str 存放字符的数组,dat 整形数据
{
	unsigned char i = 0;
	unsigned int buf[8];
	do { //先转换成 低位在前的十进制数组 将低位高位互换
		buf[i++] = dat % 10;
		dat /= 10;
	} while (dat > 0);
	while (i-- > 0) //将数组值转换为 ASCII 码反向拷贝到接收指针上
	{
			*str++ = buf[i] + '0';
	}
	*str = '�';
}	

void main()
{
	unsigned int voltage=0;
	unsigned char arr[8];
	char * P = arr;
	
	uart_init();//2400
	ADS1115_Write();
	Delay_x_ms(1000);
	while(1)
	{
		voltage = (unsigned int)(ADS1115_Read()*1000);
		IntToString(P,voltage);
		UART_Send(P);
		UART_Send("mV");
		Delay_x_ms(1000);
	}
}

六、实验现象

AIN0引脚分别输入 1.8V 3.3V 5V模拟信号
在这里插入图片描述

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模数转换器
    +关注

    关注

    26

    文章

    4099

    浏览量

    130249
  • AD采集
    +关注

    关注

    1

    文章

    27

    浏览量

    14669
  • ADC
    ADC
    +关注

    关注

    0

    文章

    227

    浏览量

    16845
  • ads1115
    +关注

    关注

    0

    文章

    19

    浏览量

    13402
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    ADS1115的采样时间要多久?

    最近在用ADS1115这颗芯片,需要反复交替检测2路AD信号,交替方法是改变ADS1115内部MUX寄存器来改变AINx口,发现如果不改变MUX设置(只检测1路AD信号)的情况下,AD采样值很稳定
    发表于 01-15 08:29

    ads111551版程序,谢谢各位大神了

    ads111551版程序,谢谢各位大神了
    发表于 07-18 00:48

    ADS1115驱动的问题

    这几天一直在搞ADS1115,可是不管怎么参考别人的程序,输出的总是65535,有没有大神可以帮帮我的?
    发表于 05-05 19:30

    ADS1115的使用

    请问有谁用过ADS1115做双通道的AD采集么,我想了解一下读写的时序和寄存器的配置,谢谢!
    发表于 05-12 09:03

    跪求ads1115驱动!!

    急需ads1115驱动,大神们帮帮忙!!!
    发表于 02-23 09:33

    ADS1115采集不准的原因

    大家好,我现在在用ADS1115采集电压信号,但是采集到的电压不稳而且还不准,前端用AD623进行信号放大,用万用表测量信号电压应为1.145,但是采到的在1.10到1.12之间跳动,不知为什么,调了好久,希望各位大神帮帮我
    发表于 11-22 09:16

    ADS1115是什么意思呢

    基于MSP430F5529单片机的ADS1115今天给大家带来还是TI公司出品的芯片——ads1115。再看本篇之前最好先备好ads1115的datasheet。(一)、芯片简介ADS1115
    发表于 11-29 08:11

    ADS1115是什么?怎样去使用ADS1115

    ADS1115是什么?ADS1115有哪些特性?怎样去使用ADS1115呢?
    发表于 12-14 08:08

    TI公司IIC接口16位AD模块ADS1115

    TI公司16位的AD模块ADS1115,IIC接口,四通道,本程序是基于msp430利用两个IO口模拟IIC来驱动ADS1115
    发表于 07-20 17:21 66次下载

    ads1115电压测量范围

     ADS1115 是具有16 位分辨率的高精度模数转换器(ADC),采用超小型的无引线QFN-10 封装或MSOP-10 封装。ADS1115 在设计时考虑到了精度、功耗和实现的简易性
    发表于 10-23 08:42 1.8w次阅读

    基于51ads1115详细程序介绍

     ADS1115 是具有16 位分辨率的高精度模数转换器(ADC),采用超小型的无引线QFN-10 封装或MSOP-10 封装。以下将是基于51ads1115详细程序介绍:
    发表于 10-23 09:25 1.7w次阅读

    ads1115使用方法

    ADS1113.ADS1114 和ADS1115 是具有16 位分旁粹率的高精度模数转换器(ADC),采用超小型的无引线QFN-10 封装或MSOP-10 封装。ADS1113/4/5 在设计时
    发表于 10-23 10:15 4.5w次阅读

    基于MSP430F5529单片机的ADS1115

    基于MSP430F5529单片机的ADS1115今天给大家带来还是TI公司出品的芯片——ads1115。再看本篇之前最好先备好ads1115的datasheet。(一)、芯片简介ADS1115
    发表于 11-19 18:21 20次下载
    基于MSP430F5529单片机的<b class='flag-5'>ADS1115</b>

    基于STM32的ADS1115使用例程

    基于STM32的ADS1115使用例程
    发表于 12-02 20:51 132次下载
    基于STM32的<b class='flag-5'>ADS1115</b>使用例程

    ADS1115使用及其驱动电路

    ADS1115有QFP封装和SOC封装,使用非常方便,而且有4个通道,大大节约了电路控件,因此使用非常方便,ADS1115.H文件#ifndef __ADS
    发表于 12-22 19:01 54次下载
    <b class='flag-5'>ADS1115</b>使用及其<b class='flag-5'>驱动</b>电路