文章目录
一、ADS1115简介
ADS1115是高精度模数转换器(adc),具有16位分辨率。数据通过兼容lIC的串行接口传输,可以选择四个IIC从地址,ads1115单电源工作范围为2.0V至5.5V。ADS1115可以以每秒860个采样的速率执行转换。ADS1115上提供板载PGA,提供从电源到低至±256mV的输入范围,允许大小信号都具有输入多路复用器(MUX),提供两个差分或四个单端输入。
二、引脚功能
ADDR | IIC地址选择 |
---|---|
ALERT/RDY | 比较器输出高低或转换就绪 |
GND | 电源地 |
AIN0-AIN3 | 模拟量输入 |
VDD | 电源正 |
SDA | IIC时钟线 |
SCL | IIC数据线 |
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 | 字段 | 类型 | 复位值 | 描述 |
---|---|---|---|---|
15 | OS | R/W | 1h | 运行状态或单次转换启动该位决定设备的运行状态。 操作系统只能在下电状态下写入,在转换过程中没有作用。 写入: 0:没有效果 1:启动单次转换(在断电状态下) 读时: 0:设备当前正在执行转换 1:设备当前未执行转换 |
14:12 | MUX[2:0] | R/W | 0h | 输入多路复用配置 000 : AINP = AIN0 and AINN = AIN1 (default) 001 : AINP = AIN0 and AINN = AIN3 010 : AINP = AIN1 and AINN = AIN3 011 : AINP = AIN2 and AINN = AIN3 100 : AINP = AIN0 and AINN = GND 101 : AINP = AIN1 and AINN = GND 110 : AINP = AIN2 and AINN = GND 111 : AINP = AIN3 and AINN = GND |
11:9 | PGA[2:0] | R/W | 2h | 可编程增益放大器配置 这些位设置可编程增益放大器的FSR 000 : FSR = ±6.144 V 001 : FSR = ±4.096 V 010 : FSR = ±2.048 V (default) 011 : FSR = ±1.024 V 100 : FSR = ±0.512 V 101 : FSR = ±0.256 V 110 : FSR = ±0.256 V 111 : FSR = ±0.256 V |
8 | MODE | R/W | 1h | 设备运行方式 这个位控制操作模式。 0:连续转换模式 1:单次模式或掉电状态(默认) |
7:5 | DR[2:0] | R/W | 4h | 数据速率 这些位控制数据速率设置。 000 : 8 SPS 001 : 16 SPS 010 : 32 SPS 011 : 64 SPS 100 : 128 SPS (default) 101 : 250 SPS 110 : 475 SPS 111 : 860 SPS |
4 | COMP_MODE | R/W | 0h | 比较器模式 该位控制比较器工作 0:传统比较器(默认) 1:窗口比较器 |
3 | COMP_POL | R/W | 0h | 比较器极性 该位控制ALERT / RDY引脚的极性 0:低电平有效(默认) 1:高电平有效 |
2 | COMP_LAT | R/W | 0h | 锁存比较器 该位控制ALERT / RDY引脚在被置为有效后锁存,还是在转换后处于上限和下限阈值范围之内清零。 0:非锁存比较器。 置位后ALERT / RDY引脚不锁存(默认) 1:锁存比较器。 置为有效的ALERT / RDY引脚保持锁存状态,直到转换数据由主服务器或适当的SMBus警报响应读取由主机发送。 设备以其地址响应,它是最低的当前声明ALERT / RDY总线的地址。 |
1:0 | COMP_QUE[1:0] | R/W | 3h | 比较器置位和禁用 这些位执行两个功能。 设置为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 = '\0';
}
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模拟信号