ADC这个东西好神奇,作为模拟到数字的枢纽,值得研究。我昨天写了MCP,今天是TI的,其实手头还有别的,但是没有必要了,再写一个SPI的就全了。
之前水平不高,写的东西不太行,这篇其实是对之前的一个补充,其实15bit也没有错,因为有些条件会丢失一位。
后面有一段计算,详细的去看数据手册。
以ADS1115的框图开始
增加增益还可以降低输入参考噪声,这在测量低电平信号时特别有用。调节PGA。
配置的时候需要三个字节,在编程的时候需要注意
在从机发送模式下,主机发送的第一个字节是 7 位从机地址,后跟高 R/ W位。
该字节将从设备置于发送模式并指示正在读取 ADS111x。
从机发送的下一个字节是寄存器的最高有效字节,由寄存器地址指针位 P[1:0] 指示。
该字节后面是来自主机的确认。然后,从机发送剩余的最低有效字节,随后是主机的确认。主设备可以在任何字节之后通过不确认或发出 START 或 STOP 条件来终止传输。
A0 和 A1 的值由 ADDR 引脚决定
看我标红的地方,以前一直不理解为什么有高有低,现在我理解了,是因为这个地方两个状态都有可能,要看外部的设置。
后面的两位就是不确定的数据位
这些都是
中间是范围,周围两个是溢出的
看换算
后面两个位是要配置的
前面的位都不管,后面的位是两位,是写明要操作的寄存器
这个读取的时候是很简单的,就是16个位
这个寄存器有点复杂
这个是第一个OS,可写可读,上面已经说明作用了
这个是1115才有的多功能MUX
就是个多功能的开关
一个极接地,另外一个接输入,也就是构成了单端的输入,因为一段已经是确定的。
这个是PGA的功能,他的粒度是比MCP的小的
在这里
还是得TI,16位干到了和MCP18位一样的效果
这个是一个转换速率,通过这个合理的选择可以抑制不少噪音
后面的我觉得没有什么作用,好像我没有想到有什么应用。
其实也不是完全没有用,就是这里可以作为一个中断的引脚来节省资源
真实的连接可能是这样的
在MCP里面也是
单端输入不准是负数
那就是这个,注意,不是直接接地
这个地我也说不明白
二极管的电流处理能力有限,并且长时间超出电源轨约 300 mV 的模拟输入电压可能会永久损坏 ADS111x。防止过压的一种方法是在输入线上放置限流电阻。ADS111x 模拟输入可承受高达 10 mA 的连续电流。
噪音什么的,我就不细说了。
噪声分量的幅度通常小于实际传感器信号。使用截止频率设置为输出数据速率或高 10 倍的一阶 RC 滤波器作为系统设计的一般良好起点。
高端的型号有引脚没有全部使用,怎么办?
写入配置寄存器以将 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。这个函数接收三个参数:
驱动一个ADC,重要的事情是,IIC硬件的驱动,地址的确认,相关寄存器的操作,这个就是句柄了。
需要的配置的和读取的都这样设计好
分配内存空间,创建一个ADS1115_Handle_t类型的指针pConfig
注意最后的config,因为指针是需要传出去的。其次就是结构体是倒着看,hi2c给了等号左边的元素。
释放一块内存
接下来我们组装一个函数
这个是更新配置
我写程序的时候使用了中断
上面的封装可以让人很方便进行配置
中断的时候需要在it文件的里面打开
没配图了,俺看电影去了!!!
猜猜啥电影
https://github.com/MrHause/ADS1115_Library
联系客服