fusion 发表于 2012-4-10 16:45:57

请教ADXL345加速度

      DATA_FORMAT寄存器我设置的是0x2B,即满分辨率,三轴的偏置都都是0,范围正负16g,右对齐,X轴和Y轴静止时几乎是-50左右,可是Z轴怎么读到的都是正的,1090左右,翻转180后读到的是512,按理应该是250左右才对吧?请问这是什么情况? 右对齐的话如果是负数,由补码求原码是-(8192-x)吗?
改来改去已经该晕了,大家还是直接看代码吧,有什么地方不对的请指教,非常感谢!我用的是IIC读的数据,定时器2ms读取一次

void Accelerate_Init()                         //加速度初始化
{
    u8 Device_Check_ID;
    IIC_WriteReg(ACCELERATE_ADDR,DATA_FORMAT,0x2B);        //满分辨率,范围正负16g,右对齐
    IIC_WriteReg(ACCELERATE_ADDR,BW_RATE,0x0C);                  //输出速率400HZ,带宽200HZ
    IIC_WriteReg(ACCELERATE_ADDR,OFSX,0x00);                                //偏置为0
    IIC_WriteReg(ACCELERATE_ADDR,OFSY,0x00);                          //偏置为0
    IIC_WriteReg(ACCELERATE_ADDR,OFSZ,0x00);                                //偏置为0
    IIC_WriteReg(ACCELERATE_ADDR,ACCE_FIFO_CTL,0x9F);
    IIC_WriteReg(ACCELERATE_ADDR,POWER_CTL,0x08);
    IIC_WriteReg(ACCELERATE_ADDR,INT_ENABLE,0x80);
        Device_Check_ID = CheckAcce();//检查加速度传感器,是否正确
    if(Device_Check_ID==0xE5)
    {
          printf("ACC_OK ");
    }
    else printf("ACC_ERROR ");

        Acc_Correct();                        //得到初始值
}


u8 Read_Accelerate()                      //读取加速度传感器
{
       
        int AcceData;
        u8 status = 0;
        GetAcceFIFOStatus(&status);
        if(status&0x3f)                       
        {
                IIC_ReadAccData(ACCELERATE_ADDR,0x32,AcceData,6);
                AccRawData.x = (int) ( AcceData<<8|AcceData);
                AccRawData.y = (int) ( AcceData<<8|AcceData);
                AccRawData.z = (int) ( AcceData<<8|AcceData);
//                printf("B %d, %d ",AcceData,AcceData);
                if(AccRawData.x&0x1000)                                                                           //补码变原码
                {       
                       
                        AccRawData.x = -(8192-AccRawData.x);
                       
                }
               
                if(AccRawData.y&0x1000)                                                                           //补码变原码
                {
                        AccRawData.y = -(8192-AccRawData.y);
                       
                }

                if(AccRawData.z&0x1000)                                                                           //补码变原码
                {
                        AccRawData.z = -(8192-AccRawData.z);                       
                }
                       
                return 1;
        }
        return 0;
}


void CalAccAngle(void)                                          //由加速度计算角度
{

        if(Read_Accelerate())
        {       
       
               
//                AccRawData.x-=AccBase.x;
//                AccRawData.y-=AccBase.y;
//                AccRawData.z-=AccBase.z;                                                               
               
/*
                AngleAcc.x=-asin(AccRawData.x/310.0)*90/1.14;

                AngleAcc.y=asin(AccRawData.y/310.0)*90/1.14;       

                AngleAcc.z=-AccRawData.z*90.0/320;
*/
                AngleAcc_tmpx=-asin(AccRawData.x/310.0)*90/1.14;

                AngleAcc_tmpy=asin(AccRawData.y/310.0)*90/1.14;       
               
                m++;

                if(m==NumAcc)
                {
                m=0;
                Acc_Filter(AngleAcc_tmpx,AngleAcc_tmpy);
                AngleAccLast.x=AngleAcc.x;
                AngleAccLast.y=AngleAcc.y;
                }
                else
                {
                AngleAcc.x=AngleAccLast.x;
                AngleAcc.y=AngleAccLast.y;
                }
        printf("B %d, %d, %d ",AccRawData.x,AccRawData.y,AccRawData.z);
//        printf("B %.3f, %.3f, ",AngleAcc.x,AngleAcc.y);
        }
}


fusion 发表于 2012-4-10 19:51:32

而且我直接输出DATAZ1寄存器的值总是在2 3 4之间变化 都没出现负的

caopeng32 发表于 2012-4-10 20:53:02

没有必要补码转源码,可以直接运算

fusion 发表于 2012-4-10 21:49:36

caopeng32 发表于 2012-4-10 20:53 static/image/common/back.gif
没有必要补码转源码,可以直接运算

直接怎么用呢?

caopeng32 发表于 2012-4-11 10:12:42

省略补码转原码(不确定你这个转换对不对,但是可以肯定的是没有必要)的过程,直接进行运算(直接加减乘除),

chenjiawei7 发表于 2012-8-31 17:06:56

我用的FIFO中断,一开始中断怎么都进不去,快疯了,后来进去了,这东西必须读一次数据寄存器,然后中断才能触发,就是狗日的,手册上说的模模糊糊,我读出来四个FIFO的数据,然后取平均值,数据就不怎么对了,跳的厉害,加速度有时候跳到几个G,有没有什么办法啊
页: [1]
查看完整版本: 请教ADXL345加速度