找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 18487|回复: 16
打印 上一主题 下一主题
收起左侧

MPU6050 DMP直接输出姿态角,无需卡尔曼 MSP430主控

  [复制链接]
跳转到指定楼层
楼主

用了6050,我得说明几点,,一 ,关于姿态角解算,你可以卡尔曼,也可以直接算i四元数再结算,其中区别请看源程序,
二、dmp、dmp很简单、但是、需要具有iic的 接口 、能懂吗? 需要有推挽输出能力的iic接口、不是模拟iic、我被这个气死了 !!!!!!!!!!!!!!
三、我懒得去整理  、直接打包上传的三个文件  有点乱、时间紧迫也没有去美化、你们可以看到我的这三种用法、如果自己用时哪里有问题  、请注意分析源代码 的计算原理、强调一点、iic 没成功是因为 149没有iic 、对于这个我也是日了狗、我的设置是全部可以参考的



这个是别人的资料:
平衡车全套资料.zip (15.25 MB, 下载次数: 222)
mpu6050DMP.zip (1.24 MB, 下载次数: 176)

这个是430的MPU6050-DMP.zip (1.33 MB, 下载次数: 153)






MSP430单片机主程序:
  1. #include <msp430f149.h>
  2. #include <math.h>
  3. #include "Config.h"
  4. #include "1602.c"
  5. #include "mpu6050.c"
  6. #include "mpu60500.h"
  7. #include "mpu60500.c"
  8. #include "mpuiic.h"
  9. #include "mpuiic.c"
  10. #include "IOI2C.h"
  11. #include "IOI2C.c"
  12. #include "dmpKey.h"
  13. #include "dmpmap.h"
  14. #include "inv_mpu.h"
  15. #include "inv_mpu.c"
  16. #include "inv_mpu_dmp_motion_driver.h"
  17. #include "inv_mpu_dmp_motion_driver.c"
  18. #include "kaerman.c"


  19. struct quaternion{
  20.   float w;
  21.   float x;
  22.   float y;
  23.   float z;
  24. }quaternion;

  25. float gyr[3],acc[3];
  26. float Pitch=1.0,Roll,Yaw ;
  27. //q30格式,long转float时的除数.
  28. #define q30  1073741824.0f

  29. void mix_gyrAcc_crossMethod(struct quaternion *attitude,const float gyr[3],const float acc[3],float interval);
  30. void quaternion_normalize(struct quaternion*q);

  31. void main()
  32. {  
  33.   WDT_Init();                         //看门狗设置
  34.   Clock_Init();                       //系统时钟设置
  35.   Port_init();                        //系统初始化,设置IO口属性
  36.   delay_ms(100);                      //延时100ms
  37.   LCD_init();                         //液晶参数初始化设置
  38.   LCD_clear();                        //清屏
  39.   //InitMPU6050();
  40.   uchar e=mpu_dmp_init();
  41.   float yy=e*1.0;
  42.   delay_ms(300);
  43.   /*
  44.   P1DIR|=0x01;       
  45.   P1OUT&=0XFE;
  46.   TA0CCTL1=OUTMOD_7+CCIE;
  47.   TACTL=TASSEL_2+MC_1+TAIE;
  48.   TA0CCR0=655;
  49.   TA0CCR1=654;
  50.   
  51.   */
  52. //float aaa=0.0,bbb=0.0,ccc=0.0;
  53.   quaternion.w=1;
  54.   quaternion.x=0;
  55.   quaternion.y=0;
  56.   quaternion.z=0;
  57.   
  58.   
  59.   _EINT();
  60.   while(1)
  61.   {
  62.    
  63.     Disp(yy,0,0);
  64.    
  65.     /*
  66.     gyr[0]=-GetData(GYRO_XOUT_H)/16.4;
  67.     gyr[1]=-GetData(GYRO_YOUT_H)/16.4;
  68.     gyr[2]=-GetData(GYRO_ZOUT_H)/16.4;
  69.     acc[0]=GetData(ACCEL_XOUT_H)/16384;
  70.     acc[1]=GetData(ACCEL_YOUT_H)/16384;
  71.     acc[2]=GetData(ACCEL_ZOUT_H)/16384;
  72.    
  73.     Disp(Pitch,0,0);
  74.     Disp(Roll,7,0);
  75.     Disp(Yaw,0,1);
  76.     Disp(quaternion.z,7,1);
  77.     mpu_dmp_get_data(&aaa,&bbb,&ccc);
  78.     Disp(aaa,0,0);
  79.     Display10BitData(GetData(ACCEL_XOUT_H),0,0);        //显示X轴加速度
  80.     Display10BitData(GetData(ACCEL_YOUT_H),5,0);        //显示Y轴加速度
  81.     Display10BitData(GetData(ACCEL_ZOUT_H),10,0);        //显示Z轴加速度
  82.     Display10BitData(GetData(GYRO_XOUT_H),0,1);                //显示X轴角速度
  83.     Display10BitData(GetData(GYRO_YOUT_H),5,1);                //显示Y轴角速度
  84.     Display10BitData(GetData(GYRO_ZOUT_H),10,1);                //显示Z轴角速度 */
  85.   }
  86. }
  87. /*
  88. #pragma vector=TIMERA1_VECTOR
  89. __interrupt void P1(void)
  90. {
  91.   P1OUT|=0X01;
  92.   if(TAIV==2)
  93.   {_NOP();}
  94.    
  95.   
  96.   mix_gyrAcc_crossMethod(&quaternion,gyr,acc,0.01);
  97. }



  98. */

  99. void mix_gyrAcc_crossMethod(struct quaternion *attitude,const float gyr[3],const float acc[3],float interval)
  100. {
  101.   const static float FACTOR = 0.001;//取接近0的数
  102.   //
  103.   float w_q = attitude->w;
  104.   float x_q = attitude->x;
  105.   float y_q = attitude->y;
  106.   float z_q = attitude->z;
  107.   float x_q_2 = x_q * 2;
  108.   float y_q_2 = y_q * 2;
  109.   float z_q_2 = z_q * 2;
  110.   //
  111.   // 加速度计的读数,单位化。
  112.   float a_rsqrt = sqrt(acc[0]*acc[0]+acc[1]*acc[1]+acc[2]*acc[2]);
  113.   float x_aa = acc[0] * a_rsqrt;
  114.   float y_aa = acc[1] * a_rsqrt;
  115.   float z_aa = acc[2] * a_rsqrt;   //加速度计测量出的加速度向量(载体坐标系下)
  116.   //
  117.   // 载体坐标下的重力加速度向量,单位化。
  118.   float x_ac = x_q*z_q_2 - w_q*y_q_2;
  119.   float y_ac = y_q*z_q_2 + w_q*x_q_2; //通过四元数旋转矩阵与地理坐标系下的重力加速度向量[0 0 0 1]叉乘得到载体坐标系下的重力加速度向量
  120.   float z_ac = 1 - x_q*x_q_2 - y_q*y_q_2;//(主要)角速度计测出的四元数表示的载体坐标系下的重力加速度向量(这里已转换成载体坐标系下)
  121.   //
  122.   // 测量值与常量的叉积。
  123.   float x_ca = y_aa * z_ac - z_aa * y_ac;
  124.   float y_ca = z_aa * x_ac - x_aa * z_ac;
  125.   float z_ca = x_aa * y_ac - y_aa * x_ac;//角速度计测出的角度误差,叠加的FACTOR大小可以实验试凑
  126.   //
  127.   // 构造增量旋转。
  128.   float delta_x = gyr[0] * interval / 2 + x_ca * FACTOR;
  129.   float delta_y = gyr[1] * interval / 2 + y_ca * FACTOR;
  130.   float delta_z = gyr[2] * interval / 2 + z_ca * FACTOR;
  131.   //
  132.   // 融合,四元数乘法。
  133.   attitude->w = w_q         - x_q*delta_x - y_q*delta_y - z_q*delta_z;
  134.   attitude->x = w_q*delta_x + x_q         + y_q*delta_z - z_q*delta_y;
  135.   attitude->y = w_q*delta_y - x_q*delta_z + y_q         + z_q*delta_x;
  136.   attitude->z = w_q*delta_z + x_q*delta_y - y_q*delta_x + z_q;
  137.   quaternion_normalize(attitude);//归一化
  138.   float q0=0.0,q1=0.0,q2=0.0,q3=0.0;
  139.   q0=attitude->w;
  140.   q1=attitude->x;
  141.   q2=attitude->y;
  142.   q3=attitude->z;
  143.   Pitch = asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3;        // pitch
  144.   Roll = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; // roll                 
  145.   Yaw = atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3;
  146. }


  147. void quaternion_normalize(struct quaternion*q)
  148. {
  149.   float qlength_inv = 1.0/(sqrt(q->w*q->w + q->x*q->x + q->y*q->y + q->z*q->z));
  150.   //这里只应该开根号x*x+y*y+z*z
  151.   // now normalize
  152.   q->w=q->w*qlength_inv;  
  153.   q->x=q->x*qlength_inv;
  154.   q->y=q->y*qlength_inv;
  155.   q->z=q->z*qlength_inv;
  156.   
  157. }
复制代码


自己做的程序:
卡尔曼重要设置已保留.zip (3.17 KB, 下载次数: 78)

四元数算.zip (493.84 KB, 下载次数: 83)

dmp需要iic里面149错误的其他设置完全是对的.zip (143.94 KB, 下载次数: 76)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏12 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:211507 发表于 2017-6-15 13:27 | 只看该作者
厉害了,,,,
回复

使用道具 举报

板凳
ID:162204 发表于 2017-7-22 11:03 | 只看该作者
贼强...............................
回复

使用道具 举报

地板
ID:221145 发表于 2017-10-15 22:17 | 只看该作者
正在研究了,借鉴一下。
回复

使用道具 举报

5#
ID:250324 发表于 2017-11-17 09:53 | 只看该作者
我找了很久的资料,谢谢了
回复

使用道具 举报

6#
ID:316023 发表于 2018-4-25 10:40 | 只看该作者
正好需要 下载看看  谢谢
回复

使用道具 举报

7#
ID:316022 发表于 2018-4-25 17:31 | 只看该作者
资料很好啊, 谢谢分享
回复

使用道具 举报

8#
ID:327342 发表于 2018-5-11 09:39 | 只看该作者
不好意思,本人小白,请问模拟IIC是什么啊
回复

使用道具 举报

9#
ID:366161 发表于 2018-7-6 10:51 | 只看该作者
怎么下载啊?
回复

使用道具 举报

10#
ID:332484 发表于 2018-7-19 15:08 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

11#
ID:175687 发表于 2018-9-20 20:08 | 只看该作者
四元素算法,由于迭代导致欧拉角一直更新,换句话说欧拉角经过一定时间才会稳定,楼主是怎样使用的呢
回复

使用道具 举报

12#
ID:420518 发表于 2019-3-8 22:12 | 只看该作者
我也想知道四元数和卡尔曼滤波的问题。。。
还有那个iic,现在有点晕乎乎的
回复

使用道具 举报

13#
ID:379758 发表于 2019-3-20 14:34 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

14#
ID:421308 发表于 2019-7-26 15:20 | 只看该作者
厉害了
回复

使用道具 举报

15#
ID:563554 发表于 2019-8-27 10:45 | 只看该作者
哇,楼主好人啊。感谢感谢
回复

使用道具 举报

16#
ID:185372 发表于 2019-9-29 13:34 | 只看该作者
这个好高大上呢,正在计算,不过都能采集出来了,线支持一下。
回复

使用道具 举报

17#
ID:228360 发表于 2021-4-9 10:50 | 只看该作者
多谢分享,最近正在学习相关的知识。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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