搜索
bottom↓
回复: 5

请教ADXL345加速度

[复制链接]

出0入0汤圆

发表于 2012-4-10 16:45:57 | 显示全部楼层 |阅读模式
      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[6];
        u8 status = 0;
        GetAcceFIFOStatus(&status);
        if(status&0x3f)                         
        {
                IIC_ReadAccData(ACCELERATE_ADDR,0x32,AcceData,6);
                AccRawData.x = (int) ( AcceData[1]<<8|AcceData[0]);
                AccRawData.y = (int) ( AcceData[3]<<8|AcceData[2]);
                AccRawData.z = (int) ( AcceData[5]<<8|AcceData[4]);
//                printf("B %d, %d ",AcceData[5],AcceData[4]);
                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[m]=-asin(AccRawData.x/310.0)*90/1.14;

                AngleAcc_tmpy[m]=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);
        }
}


阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2012-4-10 19:51:32 | 显示全部楼层
而且我直接输出DATAZ1寄存器的值总是在2 3 4之间变化 都没出现负的

出0入0汤圆

发表于 2012-4-10 20:53:02 | 显示全部楼层
没有必要补码转源码,可以直接运算

出0入0汤圆

 楼主| 发表于 2012-4-10 21:49:36 | 显示全部楼层
caopeng32 发表于 2012-4-10 20:53
没有必要补码转源码,可以直接运算

直接怎么用呢?

出0入0汤圆

发表于 2012-4-11 10:12:42 | 显示全部楼层
省略补码转原码(不确定你这个转换对不对,但是可以肯定的是没有必要)的过程,直接进行运算(直接加减乘除),

出0入0汤圆

发表于 2012-8-31 17:06:56 | 显示全部楼层
我用的FIFO中断,一开始中断怎么都进不去,快疯了,后来进去了,这东西必须读一次数据寄存器,然后中断才能触发,就是狗日的,手册上说的模模糊糊,我读出来四个FIFO的数据,然后取平均值,数据就不怎么对了,跳的厉害,加速度有时候跳到几个G,有没有什么办法啊
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 23:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表