ADS1256读取到的24位有符号数据处理

ADS1256通过SPI读取到的数据为24位有符号数据[0,23],第23位为符号位,1为负,0为正。

但是在STM32中,我们常用int32或者uint32来存放这个数据,如果直接赋值赋过去就会出现意想不到的后果,如下:

这就是直接赋值之后绘出来的图,因此我们需要将24为有符号变量转换为32位有符号变量,但在此处很容易绕晕,具体分析如下

24位有符号数据当大于0x80 0000(8388608)时说明当前数据为负数,为什么这么说呢,因为24位的有符号数存在int32的数据中,其已经变成了一个正数

举个栗子(假设有int24这种类型)

int24_t numA = -1;其转换为hex则为0x80 0001(1000 0000 0000 0000 0000 0001),最高位代表了符号位。

但实际的应用过程中并没有int24_t,只有int32_t,再举个栗子

// int32_t  numB = -1;其转换为hex则为0x8000 0001(1000 0000 0000 0000 0000 0000 0000 0001)

int32_t   numB = 0;其转换为hex则为0x0000 0000(0000 0000 0000 0000 0000 0000 0000 0000)

当numB赋值给numA时其numB发生了如下变化

numB变成了0x0080 0001也就是8388609,此时这个数突然发现变成了正数,与我们原来的-1完全不一样,因此需要转换一下

如果numB是负数,也就是当numB的第23位为1(也就是numB大于0x80 0000【8388608】)时为负数,做出如下计算

该计算就是正常的流程:[取反] — [符号位及高位置0] — [加一] — [加负号] (PS:大学数电应该都学过

MATLAB:

复制代码
copy
if(numB >= 8388608)
    %取反
    numB  = bitcmp(numB);
    %24到32位置零(MATLAB的索引好像是从1开始的)
    for j = 24:32
        numB  = bitset(numB,j,0);
    end  
    numB = numB + 1;
    numB = -numB;
end    
复制代码

C语言:

copy
if(numB& 0x800000){
    numB= ~(unsigned long)numB;
    numB&= 0x7fffff;
    numB+= 1;
    numB= -numB;
}

最后正常图如下:

 

本文作者:千樊

本文链接:https://www.cnblogs.com/lesterbor/p/18001859

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

转载请注明出处

改编代码请注明原作者

posted @   千樊  阅读(212)  评论(0编辑  收藏  举报
 
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起