在加速度测定中,若MMA7455输出的值为负数,要进行二补码转换,为什么呢?负数在存储单元中存储不就是二补码形式吗?
void I2C_MMA_Test(MMA_Dat* MMA_Value)
{
u8 temp;
/*MMA进入 2g 量程测试模式*/
I2C_MMA_ByteWrite(0x05,MMA_MCTL_Addr);
/*DRDY标置位,等待测试完毕*/
while(!(I2C_MMA_ByteRead(MMA_STATUS_Addr)&0x01));
/*读取测得的数据*/
MMA_Value->Out = I2C_MMA_ByteRead(MMA_Value->Addr);
if((MMA_Value->Out&0x80) ==0x00) /*读出的原始值为正数 */
{
temp = MMA_Value->Out;
/*将原始值转换为加速度,2g量程,64LSB/g; 乘以 -1 为方向处理*/
MMA_Value->Acc = (float)(-1)*temp *ACC_Gravity/64;
/*将原始值转换为角度*/
if(temp >=64)
/*加速度值大于 1g */
MMA_Value->Angle = 90.0;
else
/*加速度小于1 g, Angle = asin(Acc/9.8)*57.32; 弧度制转换57.32 = 180/3.14*/
MMA_Value->Angle = asin((float)temp/64)*57.32;
}
/*读出的原始值为负数 */
else
{
temp = MMA_Value->Out;
/*二补码转换*/
temp -= 1;
temp = ~temp;
/*将原始值转换为加速度*/
MMA_Value->Acc = (float) temp *ACC_Gravity/64;
/*将原始值转换为角度,乘以 -1 为方向处理*/
if(temp>=64)
MMA_Value->Angle = -90.0;
else
/* Angle = asin(Acc/9.8)*57.32 ; 弧度制转换57.32 = 180/3.14*/
MMA_Value->Angle = (-1)*asin((float)temp/64)*57.32;
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
1、你读到的值,是放在sensor的data寄存器里面的,假如是1字节也就是8bit。这个没问题吧。
2、sensor资料里面注明:这个data寄存器是以原码方式存储数据的。你得到真实的数据,就应该以原码的方式来解析,以获得真实值。
3、sensor资料里面注明:这个data寄存器是以补码方式存储数据的。你得到真实的数据,就应该以补码的方式来解析,以获得真实值。
所以你的问题很奇怪,谁告诉你负数在sensor的data寄存器中就必须以反码形式存储的?
一周热门 更多>