重力加速度MMA7455 二补码转换的疑惑

2019-12-09 20:00发布

在加速度测定中,若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;     
                 }         
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。