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

在应用中传感器输出的是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;
}
}
分享到: 更多
版权申明:

本站保留所有原创文章的版权,本站地址:奔跑的博客[http://www.elecbench.com]

原创文章转载时请注明出处,并添加文章所在页面的链接:http://www.elecbench.com/%e5%af%b9%e4%ba%8e%e4%bc%a0%e6%84%9f%e5%99%a8%e8%be%93%e5%87%ba%e7%9a%84%e6%9c%89%e7%ac%a6%e5%8f%b7%e6%95%b0%e6%8d%ae%e7%9a%84%e4%bd%bf%e7%94%a8%e5%92%8c%e5%a4%84%e7%90%86/

本站所有 2010年3月4日 以后发表、未标明为“转载”的文章均是本站原创。

发表评论


(设置自己的个性头像)

*

申请属于你的免费顶级域名