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:
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语言:
if(numB& 0x800000){ numB= ~(unsigned long)numB; numB&= 0x7fffff; numB+= 1; numB= -numB; }
最后正常图如下:
本文作者:千樊
本文链接:https://www.cnblogs.com/lesterbor/p/18001859
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
转载请注明出处
改编代码请注明原作者
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步