久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 20028|回復: 16
打印 上一主題 下一主題
收起左側

MPU6050 DMP直接輸出姿態角,無需卡爾曼 MSP430主控

  [復制鏈接]
跳轉到指定樓層
樓主

用了6050,我得說明幾點,,一 ,關于姿態角解算,你可以卡爾曼,也可以直接算i四元數再結算,其中區別請看源程序,
二、dmp、dmp很簡單、但是、需要具有iic的 接口 、能懂嗎? 需要有推挽輸出能力的iic接口、不是模擬iic、我被這個氣死了 !!!!!!!!!!!!!!
三、我懶得去整理  、直接打包上傳的三個文件  有點亂、時間緊迫也沒有去美化、你們可以看到我的這三種用法、如果自己用時哪里有問題  、請注意分析源代碼 的計算原理、強調一點、iic 沒成功是因為 149沒有iic 、對于這個我也是日了狗、我的設置是全部可以參考的



這個是別人的資料:
平衡車全套資料.zip (15.25 MB, 下載次數: 223)
mpu6050DMP.zip (1.24 MB, 下載次數: 177)

這個是430的MPU6050-DMP.zip (1.33 MB, 下載次數: 154)






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, 下載次數: 80)

四元數算.zip (493.84 KB, 下載次數: 85)

dmp需要iic里面149錯誤的其他設置完全是對的.zip (143.94 KB, 下載次數: 78)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏13 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 涩涩操| 久久久久久久99 | 欧美一级视频 | 草草视频在线观看 | 久久不卡区 | 草久久久| 欧美精品三区 | 九九热在线精品视频 | 免费成人高清在线视频 | 亚洲成人福利视频 | 国产成人jvid在线播放 | 日韩在线精品视频 | 欧美激情欧美激情在线五月 | 国产精品久久久av | 国产精品色综合 | 亚洲电影专区 | 91久久夜色精品国产网站 | 99精品久久| 日韩av在线一区 | 一级毛片视频在线观看 | 亚洲国产精品一区二区第一页 | 国产亚洲精品久久久久动 | 少妇黄色 | www.日本三级| 亚洲区一区二 | 国产精品久久久久久久白浊 | 欧洲视频一区二区 | 国产精品美女一区二区三区 | 国产欧美一区二区在线观看 | 男女免费观看在线爽爽爽视频 | 欧美小视频在线观看 | 国产精品黄色 | 国产精品久久久久免费 | 亚洲成人精品免费 | 99久久久无码国产精品 | 久久国产综合 | 久久精品视频网站 | 成人一区二区在线 | 午夜免费福利片 | 国产精品久久久久久久久久 | 一呦二呦三呦国产精品 |