从ADS1115单次读取转换数据-详细位运算解读版

乐活   2025-02-08 13:04   内蒙古  

如果学了前文看这个就容易了,这个操作来自于ADS1115的转换数据读取。

可以看到是一个16bit的结果,所以就要接收和拼接

这个就是转换的代码

读取ADC数据:
  1. 通过I2C通信与ADC设备交互,读取转换结果。
  2. 返回一个16位的有符号整数(int16_t),表示ADC的转换结果。
工作流程:
  1. 配置ADC寄存器以启动转换。
  2. 等待转换完成(如果是单次转换模式)。
  3. 读取转换结果并返回。
regValue = 1 << 15 | registerMap[CONFIG_ADDRESS];

regValue 的第15位设置为1,同时保留reg的当前配置。

意思是说,单次转换启动

寄存器的地址在这里

TI的设计是,把寄存器的数量先定义好

然后在控制的时候,先定位到数组

就是后面

| 是按位或操作,用于合并位。也可以说前面1<<15其实是位掩码。一计算就把配置寄存器的值修改了。

调用 sendI2CData 函数,将 regData 写入ADC的配置寄存器(CONFIG_ADDRESS)。
如果I2C通信失败(retStatus != false),函数返回0。

看这个,&,这个读取一个寄存器的位

在这里

这里就判断单次转换模式是不是启用

do-while 循环:
这是一个后测试循环,先执行循环体,再检查条件。
循环会一直执行,直到条件 !(regData[0] & 0x80) 为假(即 regData[0] & 0x80 为真)。
receiveI2CData(CONFIG_ADDRESS, regData, 2):
通过I2C通信从ADC的配置寄存器(CONFIG_ADDRESS)读取2字节数据,并存储到 regData 数组中。
regData[0] 是配置寄存器的高8位,regData[1] 是低8位。
if (retStatus != false):
如果I2C通信失败(retStatus 不为0),函数返回0,表示读取失败。
!(regData[0] & 0x80):
regData[0] & 0x80 是一个按位与操作,用于检查 regData[0] 的第7位(最高位)是否为1。

0x80 的二进制表示为 10000000,掩码用于提取第7位。
  1. 如果第7位为1,表示转换完成。
  2. 如果第7位为0,表示转换未完成。
!(regData[0] & 0x80) 表示“如果第7位为0,则继续循环”。
代码里面一把都有转换完成标志:
  1. 通常是一个特定的位(如第7位),用于指示转换是否完成。
  2. 通过按位与操作(&)提取该位并检查其值。
因为我们不知道什么时候会完成转换所以有轮询机制:
  1. 使用 do-while 循环不断读取配置寄存器,直到转换完成。
  2. 如果I2C通信失败,函数返回0。

调用 readSingleRegister 函数,从ADC的转换结果寄存器(CONVERSION_ADDRESS)读取数据。

这里面有个合并函数,因为读取回来两个字节

相信你认真学习我的文章一定学会了

将读取的值存储在 registerMap[CONVERSION_ADDRESS] 中。
将结果强制转换为 int16_t 并返回。

也就是说,读取了寄存器的单次结果,括号里面是地址。接着把这个数据存到寄存器MAP的转换寄存器的位置。
最后就是把寄存器了里面,转换寄存器的数据强壮的转换,这就是完整的ADC读取数据的过程。
很多人可能会问,这么复杂有什么用?
TI也推出了自己的精密转换库,学会一个:

就相当于学会多,这个投资值了,很新的库

云深之无迹
纵是相见,亦如不见,潇湘泪雨,执念何苦。
 最新文章