行业资讯

首页-大摩娱乐-大摩平台-东莞会展大摩注册登录

2022-10-12 13:46:29 yqs888 0

首页-大摩娱乐-大摩平台-东莞会展大摩注册登录报道,24位的ADC,比如ADS1256,每次转换会返回3个字节的原始数据,每个字节8位,整好24位。这3个字节如何合成我们需要的转换电压呢?

ADC输出的原始数据

ADC的说明书会给出这3个字节的顺序。仍以ADS1256为例,RDATA指令读取数据的时序如图1所示。

傲世皇朝平台

图1. RDATA指令的时序

从上往下看:DRDY引脚拉低后,DIN引脚送入读取数据指令,等待t6(~7μs),DOUT引脚开始输出3个字节的转换结果。排序是MSB->Mid-Byte->LSB,也就是高字节优先。

明白了字节的输出顺序,合成数据就容易了。可以用一个uint8_t rawData[3]数组接收ADC的转换数据(Bittle endian格式)。然后将3个字节通过移位存入一个int32_t data即可。这里有两个问题:

  • 为什么用32位?因为c语言中没有24位的数据类型。

  • 为什么用int?因为信号是有符号的,转换电压有可能是负值。

符号问题如何解决?

ADC返回的3个字节是按2的补码规则来表示符号的。MSB的最高位是符号位,此位为0,表示数是正的;此位为1,表示数是负的。由于转换得到的是24位,为了表示符号扩展为32时多出来的一个字节的8个位都要与MSB最高位相同。在c语言中实现起来很简单,移位就行啦。示例代码如下:

data = (rawData[0]<<24)|(rawData[1]<<16)|(rawData[2]<<8);

data >>= 8; //expand to 32-bit 2's complement

思路是这样:先把原始数据从MSB到LSB依次顶格左移入int型的变量data,然后再整体向右移8位,这样高位字节会自动以MSB的最高位填充。符号问题就解决了。

是不是很简单?其他语言中(MATLAB)也可以类似处理,不过没有C语言简单明了。


首页
产品
新闻
联系