python将AD7606B原始补码数据数组转换成原码数据数组并进行处理为电压值
首先,我们应该先理解一下,补码跟原码之间是如何转换的,
- 正数的补码等于原码
- 负数的补码等于符号位不变,其它位取反,再加1
十制数 | 原码 | 补码 |
---|---|---|
+15 | 0b 0000 1111 | 0b 0000 1111 |
-15 | 0b 1000 0000 | 0b 1111 0001 |
也就是说,给一个16位的AD补码值,首先我们可以根据首位是否为1来判断该AD值的正负,
- 符号位等于0(正数),原码=补码
- 符号位等于1(负数),补码符号位不变,其余位取反,再整体加1,就是该补码的原码的绝对值,注意此时还要对计算出来的原码加负号,才是最终的AD值
根据AD7606数据手册,
我们可以知道,AD7606B并行数据为16位,即数据范围为0b 1000 0000 0000 0000 ~ 0b 0111 1111 1111 1111,以正负5V范围为例,
import numpy as np
int_number_array = np.array([0xFFFF,0x1FFF,0X0FEE,0x15AC,0x159E,0x3C55,0x0001,0x0010])#含8个数据的数组,代表AD7606B八通道读取的补码数据
index = np.argwhere(int_number_array & 0b1000000000000000 == 0b1000000000000000)#查找数组中符号位为1(负数),返回索引数组
int_number_array[index] = -((int_number_array[index] ^ 0b1111111111111111) + 1)#进行补码转换成原码(按位异或相当于按位取反)正数不变,负数进行取反加1,最后加负号
number_array = int_number_array / 32768 * 5 #将十六进制原码数据转换电压值
print(number_array)
最后计算结果为
[-1.52587891e-04 1.24984741e+00 6.22253418e-01 8.46557617e-01 8.44421387e-01 2.35671997e+00 1.52587891e-04 2.44140625e-03]
分别代表每个通道的某个时刻的电压值,若连续处理一段时间的AD采样值,则可以绘制出8通道的波形图。