对于传感器输出的有符号数据的使用和处理

在应用中传感器输出的是16bit的 2’s complement (即补码)形式表示的数据,这是带符号的数据,定义一个16位int变量保存该数据即可。
但是在单片机中通常我们使用无符号数据进行运算,所以,获得传感器的值后需要转换为无符号型数据,在需要把这些数据进行发送或保存时再把数据转换成有符号型数据。
现在以一款传感器的输出数据来具体说明数据转换过程。输出的数据格式是补码形式表示的数据,范围从0xF800到0x07FF,如果超出量程则输出-4096.
把传感器数据转换为无符号型数据,即-2048到2047转换为0到4095,假定数组XYZ[]存放的是传感器数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for(i=0;i<3;i++)
{
if((XYZ[i]&amp;0xF800)==0xF800) //是负数、且在量程范围内
{
XYZ[i]=((~XYZ[i])+1); //补码取反加一,得到其原码
XYZ[i]=(2048-XYZ[i]);
}
else if(XYZ[i]==0xf000) //量程溢出
{
;
}
else if(XYZ[i]<0x800) //是正数,且在量程范围内
{
XYZ[i]=XYZ[i]+2048;
}
}

把无符号的数据转换为有符号的正常数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for(i=0;i<3;i++)
{
if(XYZ[i]<2048) //原来是负数
{
XYZ[i]=(XYZ[i]|0xf800); //应该减2048,即+(-2048)=+(0xF800)
}
else if(XYZ[i]<4096) //原来是正数
{
XYZ[i]=(XYZ[i]-2048);
}
else //溢出
{
XYZ[i]=0xF000;
}
}

发表评论

邮箱地址不会被公开。 必填项已用*标注