搜索
bottom↓
回复: 7

请教一个MEMS计算角度的问题

[复制链接]

出0入0汤圆

发表于 2015-11-2 23:15:16 | 显示全部楼层 |阅读模式
在论坛上看到计算角度的一段程序,里面有个arctan 的计算,不知道怎么算这个??


/*角度计算*/
void Angle_Calcu(void)         
{

//范围为2g时,换算关系:16384 LSB/g
//deg = rad*180/3.14

/*利用z轴上的重力加速度计算出,芯片与水平面的夹角*/
                        
           Accel_x=ACCE_Data_X(ACCEL_XOUT_H);//x轴
//        Accel_y=ACCE_Data_Y(ACCEL_YOUT_H);//y轴
        Accel_z=ACCE_Data_Z(ACCEL_ZOUT_H);//z轴

        Gyro_y = GYRO_Data_Y(GYRO_YOUT_H);//GetData合成的原始数据


        if(Accel_x<32764)
        {
                x=Accel_x/16384;
        }
        else
        {
                x=1-(Accel_x-49152)/16384;
        }

//        if(Accel_y<32764)
//        {
//                y=Accel_y/16384;
//        }
//        else
//        {
//                y=1-(Accel_y-49152)/16384;
//        }

        if(Accel_z<32764)
        {
                z=Accel_z/16384;
        }
        else
        {
                z=(Accel_z-49152)/16384;
        }

        Angle_az=(atan(x/z))*180/3.14;

/*角度的正负号*/                                                                                       
        if(Accel_x<32764)
        {
        Angle_az=+Angle_az;
        }
        if(Accel_x>32764)
        {
        Angle_az=-Angle_az;
        }

    /*角速度*/
        if(Gyro_y<32768)//向前运动
        {
        Gyro_y=-(Gyro_y/16.4);//范围为1000deg/s时,换算关系:16.4 LSB/(deg/s)
        }
        if(Gyro_y>32768)//向后运动
        {
        Gyro_y=+(65535-Gyro_y)/16.4;
        }
       
        //Angle_gy = Angle_gy + Gyro_y*0.025;  //角速度积分得到倾斜角度.越大积分出来的角度越大       
                
        //-------卡尔曼滤波融合-----------------------

        Kalman_Filter(Angle_az,Gyro_y);       //卡尔曼滤波计算倾角
                                                                                                                          
}

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

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2015-11-3 08:30:14 | 显示全部楼层
楼主,把你卡尔曼滤波的那块贴出来把。

出0入0汤圆

 楼主| 发表于 2015-11-3 09:02:20 | 显示全部楼层
void Kalman_Filter(float angle_m,float gyro_m)                        //gyro_m:gyro_measure
{
        angle += (gyro_m-q_bias) * dt;
       
        Pdot[0] = Q_angle - P[0][1] - P[1][0];
        Pdot[1] =- P[1][1];
        Pdot[2] =- P[1][1];
        Pdot[3] = Q_gyro;
       
        P[0][0] += Pdot[0] * dt;
        P[0][1] += Pdot[1] * dt;
        P[1][0] += Pdot[2] * dt;
        P[1][1] += Pdot[3] * dt;
       
        angle_err = angle_m - angle;
       
        PCt_0 = C_0 * P[0][0];
        PCt_1 = C_0 * P[1][0];
       
        E = R_angle + C_0 * PCt_0;
       
        K_0 = PCt_0 / E;
        K_1 = PCt_1 / E;
       
        t_0 = PCt_0;
        t_1 = C_0 * P[0][1];

        P[0][0] -= K_0 * t_0;
        P[0][1] -= K_0 * t_1;
        P[1][0] -= K_1 * t_0;
        P[1][1] -= K_1 * t_1;
       
        angle        += K_0 * angle_err;
        q_bias        += K_1 * angle_err;
        angle_dot = gyro_m-q_bias;
}

出0入0汤圆

 楼主| 发表于 2015-11-3 09:03:12 | 显示全部楼层
卡尔曼都是网上的看的,还不是太理解,边用边琢磨吧

出0入0汤圆

 楼主| 发表于 2015-11-3 09:03:56 | 显示全部楼层
通过加速度速度去计算角度,要用到ATAN,不知道大伙这里是怎么计算的?

出0入0汤圆

 楼主| 发表于 2015-11-3 09:05:28 | 显示全部楼层
卡尔曼的输入是角度和角速度,要根据MEMS的数据换算出来

出0入0汤圆

 楼主| 发表于 2015-11-3 09:06:27 | 显示全部楼层
这个过程还没有搞清楚啊,有人说用积分,不太理解,请大家指点一下,谢谢!

出0入0汤圆

 楼主| 发表于 2015-11-3 10:07:33 | 显示全部楼层
我找到了,里面调用了C的一个MATH.h 的文件,我的IAR是32K的限制版,用不了那个文件。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-28 01:26

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

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