ADC这个东西好神奇,作为模拟到数字的枢纽,值得研究。我昨天写了MCP,今天是TI的,其实手头还有别的,但是没有必要了,再写一个SPI的就全了。
Ti.ADS1115-15Bit差分ADC
MCP3421-18bit ADC 调试
之前水平不高,写的东西不太行,这篇其实是对之前的一个补充,其实15bit也没有错,因为有些条件会丢失一位。
后面有一段计算,详细的去看数据手册。
以ADS1115的框图开始
增加增益还可以降低输入参考噪声,这在测量低电平信号时特别有用。调节PGA。
配置的时候需要三个字节,在编程的时候需要注意
在从机发送模式下,主机发送的第一个字节是 7 位从机地址,后跟高 R/ W位。
该字节将从设备置于发送模式并指示正在读取 ADS111x。
从机发送的下一个字节是寄存器的最高有效字节,由寄存器地址指针位 P[1:0] 指示。
该字节后面是来自主机的确认。然后,从机发送剩余的最低有效字节,随后是主机的确认。主设备可以在任何字节之后通过不确认或发出 START 或 STOP 条件来终止传输。
A0 和 A1 的值由 ADDR 引脚决定
看我标红的地方,以前一直不理解为什么有高有低,现在我理解了,是因为这个地方两个状态都有可能,要看外部的设置。
后面的两位就是不确定的数据位
这些都是
中间是范围,周围两个是溢出的
看换算
后面两个位是要配置的
前面的位都不管,后面的位是两位,是写明要操作的寄存器
这个读取的时候是很简单的,就是16个位
这个寄存器有点复杂
这个是第一个OS,可写可读,上面已经说明作用了
这个是1115才有的多功能MUX
就是个多功能的开关
一个极接地,另外一个接输入,也就是构成了单端的输入,因为一段已经是确定的。
这个是PGA的功能,他的粒度是比MCP的小的
在这里
还是得TI,16位干到了和MCP18位一样的效果
这个是一个转换速率,通过这个合理的选择可以抑制不少噪音
后面的我觉得没有什么作用,好像我没有想到有什么应用。
其实也不是完全没有用,就是这里可以作为一个中断的引脚来节省资源
真实的连接可能是这样的
ADS111x 的全差分电压输入非常适合连接具有较低源阻抗的差分源,例如热电偶和热敏电阻。尽管 ADS111x 可以读取双极性差分信号,但这些器件不能接受任一输入上的负电压。
这句话有点拗口,意思可能是不可以直接接负电压。单端口的情况下不可以直接接负电压。
在MCP里面也是
单端输入不准是负数
ADS111x 在转换期间消耗瞬态电流。0.1μF 电源旁路电容器可提供电源所需的瞬时额外电流。
SDA 和 SCL 线上都需要上拉电阻,因为 I 2 C 总线驱动器是漏极开路的。这些电阻器的大小取决于总线运行速度和总线线路的电容。电阻值越高,功耗越低,但会增加总线上的转换时间,从而限制总线速度。较低阻值的电阻可实现更高的速度,但代价是功耗更高。长总线具有更高的电容,并且需要更小的上拉电阻来补偿。不要使用太小的电阻,因为总线驱动器可能无法将总线拉低。
单端信号范围从 0 V 到正电源或 FS,以较低者为准。
负电压不能施加到这些器件,因为 ADS111x 只能接受相对于地的正电压。
ADS111x 在输入范围内不会失去线性度。
比较好玩的是这个:通过适当设置 MUX[2:0] 位,ADS1115 还允许 AIN3 作为测量的公共点。
那就是这个,注意,不是直接接地
AIN0、AIN1 和 AIN2 都可以相对于 AIN3 进行测量。在此配置中,ADS1115 通过输入运行,其中 AIN3 作为公共点。此功能提高了单端配置的可用范围,因为当GND < V (AIN3) < VDD 时允许负差分电压;然而,不提供共模噪声衰减。
这个地我也说不明白
二极管的电流处理能力有限,并且长时间超出电源轨约 300 mV 的模拟输入电压可能会永久损坏 ADS111x。防止过压的一种方法是在输入线上放置限流电阻。ADS111x 模拟输入可承受高达 10 mA 的连续电流。
噪音什么的,我就不细说了。
噪声分量的幅度通常小于实际传感器信号。使用截止频率设置为输出数据速率或高 10 倍的一阶 RC 滤波器作为系统设计的一般良好起点。
高端的型号有引脚没有全部使用,怎么办?
浮动未使用的模拟输入,或将未使用的模拟输入连接到中间电源或 VDD。可以将未使用的模拟输入连接到 GND,但可能会产生比以前的选项更高的泄漏电流。
可以直接连到VDD
浮动 NC(未连接)引脚,或将 NC 引脚连接到 GND。如果未使用 ALERT/RDY 输出引脚,请将该引脚悬空或使用弱上拉电阻将该引脚连接至 VDD。
写入配置寄存器以将 ADS111x 设置为连续转换模式,然后读取转换结果,请按以下顺序发送以下字节。
基于电阻分流的电流测量解决方案广泛用于监测负载电流。低侧电流分流测量与总线电压无关,因为分流共模电压接近地。
负载电流通过测量分流电阻两端的电压来确定
计算
对接地参考信号进行电平转换,以允许在使用单极电源时进行双向电流测量。
分流电阻器 V SHUNT两端的电压由共模电压 V CM进行电平转换
也就是这样的
也就是前面是控制OP在正常的工作范围里面,后面是一个放大的同相
最后面加入ADC之前是一个RC滤波,要求在ADC 差分输入电压,定义成Vcm-Vout。
分流电阻器 (R SHUNT ) 是与负载串联插入的精确电阻。
如果分流器两端的绝对压降 |V SHUNT | 占总线电压的百分比较大,则压降可能会降低整体效率和系统性能。
如果 |V分流| 太低,测量小电压降需要仔细设计并正确选择 ADC、运算放大器和精密电阻。
确保分流端子处的绝对电压不会导致违反运算放大器的输入共模电压范围要求。
由于电流流过分流电阻,分流电阻上的功耗会增加温度。为了最大限度地减少温度变化引起的测量误差,选择低漂移分流电阻。
为了最大限度地减少测量增益误差,选择具有低容差值的分流电阻。
要消除杂散接地电阻引起的误差,使用四线开尔文连接的分流电阻。
R 1 2 3 4来调节运放的共模电压
如果 Vout连接到 ADC 正输入 (AINP),且 Vcm连接到 ADC 负输入 (AINN),则 Vcm将作为 ADC 的共模电压出现。
如果 Vcm设置为中间电源 (Vdd / 2),则此配置允许伪差分测量并使用 ADC 的最大动态范围。
可以使用连接 VDD 和 GND 的电阻分压器(后接缓冲放大器)来生成 V CM。经典玩法
后面的滤波
还添加了两个共模滤波电容器(Ccm1和 Ccm2),以提供高频共模噪声分量的衰减。选择比这些共模电容器至少大一个数量级 (10 倍) 的差分电容器 Cdiff ,因为这些共模电容器的不匹配会将共模噪声转换为差分噪声。
看个RC就好了
自带的数字滤波器也是差不多
完美
地址最方便就是接地了,也就是0x48的地址
我们对最重要的配置寄存器来一些封装吧
最后的寄存器的样子就是这样
使用的时候可以这样写
函数定义,函数名为ADS1115_init。这个函数接收三个参数:
I2C_HandleTypeDef *hi2c:这是一个指向I2C句柄类型的指针,用于操作I2C设备。
uint16_t Addr:这是一个无符号16位整数,表示ADS1115设备的地址。
ADS1115_Config_t config:这是一个ADS1115配置结构体,包含了初始化ADS1115所需的配置信息。
函数返回一个指向ADS1115_Handle_t类型的指针,这个指针指向一个ADS1115设备实例。
通常来说,这个函数会创建一个新的ADS1115_Handle_t实例,然后使用传入的配置信息对其进行初始化,最后返回这个实例的指针。
驱动一个ADC,重要的事情是,IIC硬件的驱动,地址的确认,相关寄存器的操作,这个就是句柄了。
需要的配置的和读取的都这样设计好
分配内存空间,创建一个ADS1115_Handle_t类型的指针pConfig
注意最后的config,因为指针是需要传出去的。其次就是结构体是倒着看,hi2c给了等号左边的元素。
释放一块内存
接下来我们组装一个函数
channel:通道选择,通过左移6位后与config.channel进行按位或操作;
pgaConfig:增益配置,通过左移3位后与config.pgaConfig进行按位或操作;
operatingMode:工作模式,通过左移0位后与config.operatingMode进行按位或操作。
这个是更新配置
我写程序的时候使用了中断
上面的封装可以让人很方便进行配置
中断的时候需要在it文件的里面打开
没配图了,俺看电影去了!!!
猜猜啥电影
代码语言:javascript复制https://github.com/MrHause/ADS1115_Library