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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STM32F103ZE+mpu6050+hmc5883L通過卡爾曼濾波串口輸出姿態角,數據經過融合

  [復制鏈接]
跳轉到指定樓層
樓主
ID:125878 發表于 2019-7-10 10:44 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
基于STM32F103ZE+mpu6050+hmc5883L通過卡爾曼濾波串口輸出姿態角,數據經過融合,Z無漂移,絕對指向

單片機源程序如下:
  1. /* main.c file
  2. 功能:
  3. 1.初始化各個傳感器,
  4. 2.運行姿態解算和高度測量
  5. 3.將解算的姿態和各個傳感器的輸出上傳到 MiniIMU AHRS 測試軟件
  6. 4.響應 PC發送的命令
  7. ------------------------------------
  8. */

  9. #include "common.h"  //包含所有的驅動 頭文件

  10. //上傳數據的狀態機
  11. #define REIMU  0x01 //上傳解算的姿態數據
  12. #define REMOV  0x02        //上傳傳感器的輸出
  13. #define REHMC  0x03        //上傳磁力計的標定值

  14. #define Upload_Speed  15   //數據上傳速度  單位 Hz
  15. #define upload_time (1000000/Upload_Speed)/2  //計算上傳的時間。單位為us

  16. int16_t ax, ay, az;       
  17. int16_t gx, gy, gz;
  18. int16_t hx, hy, hz;
  19. int32_t Temperature = 0, Pressure = 0, Altitude = 0;
  20. uint32_t system_micrsecond;
  21. int16_t hmcvalue[3];
  22. u8 state= REIMU;  //發送特定幀 的狀態機
  23. /**************************實現函數********************************************
  24. *函數原型:                int main(void)
  25. *功  能:                主程序
  26. *******************************************************************************/
  27. int main(void)
  28. {
  29.         int16_t Math_hz=0;
  30.         unsigned char PC_comm; //PC 命令關鍵字節         
  31.         float ypr[3]; // yaw pitch roll
  32.         /* 配置系統時鐘為72M 使用外部8M晶體+PLL*/      
  33.     SystemInit();
  34.         delay_init(72);                //延時初始化
  35.     Initial_LED_GPIO();        //初始化STM32-SDK板子上的LED接口
  36.         Initial_PWMLED();
  37.         Initial_UART1(115200L);
  38.         Initial_UART2(115200L);
  39.         IIC_Init();         //初始化I2C接口
  40.         delay_ms(300);        //等待器件上電
  41.         //UART1_Put_String("Initialize...\r\n");
  42.         AHRS_init(); //初始化IMU和傳感器
  43.         system_micrsecond=micros();

  44.         while(1){        //主循環
  45.                
  46.         //delay_ms(1); //延時,不要算那么快。
  47.         AHRS_getYawPitchRoll(ypr); //姿態更新
  48.         printf("%f %f %f\r\n",ypr[1],ypr[2],ypr[0]);
  49.         Math_hz++; //解算次數 ++
  50.         BMP180_Routing(); //處理BMP018 事務 開啟轉換和讀取結果將在這個子程序中進行

  51. //-------------上位機------------------------------
  52.         //是否到了更新 上位機的時間了?
  53.         if((micros()-system_micrsecond)>upload_time){
  54.         switch(state){
  55.         case REIMU:
  56.         BMP180_getTemperat(&Temperature); //讀取最近的溫度值
  57.         BMP180_getPress(&Pressure);           //讀取最近的氣壓測量值
  58.         BMP180_getAlt(&Altitude);           //讀取相對高度
  59.         //UART1_ReportIMU((int16_t)(ypr[0]*10.0),(int16_t)(ypr[1]*10.0),
  60.         //(int16_t)(ypr[2]*10.0),Altitude/10,Temperature,Pressure/10,Math_hz*16);
  61.         //UART2_ReportIMU((int16_t)(ypr[0]*10.0),(int16_t)(ypr[1]*10.0),
  62.         //(int16_t)(ypr[2]*10.0),Altitude/10,Temperature,Pressure/10,Math_hz*Upload_Speed);
  63.        
  64.         Math_hz=0;
  65.         state = REMOV; //更改狀態。
  66.         break;
  67.         case REMOV:
  68.         MPU6050_getlastMotion6(&ax, &ay, &az, &gx, &gy, &gz);
  69.         HMC58X3_getlastValues(&hx,&hy,&hz);
  70.         //UART1_ReportMotion(ax,ay,az,gx,gy,gz,hx,hy,hz);
  71.         //UART2_ReportMotion(ax,ay,az,gx,gy,gz,hx,hy,hz);
  72.         state = REIMU;
  73.         break;
  74.         default:
  75.         state = REIMU;
  76.         break;
  77.         }//switch(state)                          
  78.         system_micrsecond=micros();         //取系統時間 單位 us
  79.         LED_Change();        //LED1改變亮度
  80.         }
  81. //--------------------------------------------------
  82.         //處理PC發送來的命令
  83.         if((PC_comm=UART2_CommandRoute())!=0xff)
  84.         {
  85.         switch(PC_comm){ //檢查命令標識
  86.         case Gyro_init:                        MPU6050_InitGyro_Offset(); break; //讀取陀螺儀零偏
  87.         case High_init:                        BMP180_ResetAlt(0);         break;                //氣壓高度 清零
  88.         }
  89.         }// 處理PC 發送的命令

  90.         }//主循環 while(1) 結束

  91. }  //main       

  92. //------------------End of File----------------------------
復制代碼

所有資料51hei提供下載:
Kalman_AHRS.7z (308.96 KB, 下載次數: 298)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:479281 發表于 2019-7-24 18:38 | 只看該作者
大神為什么我下載你的程序燒錄進32單片機讀取的YAW水平轉動沒變化的1,維持在135度左右,roll和pitch翻轉的時候正常變化,而YAW角度在翻轉的時候也才有變化
回復

使用道具 舉報

板凳
ID:479281 發表于 2019-7-24 18:39 | 只看該作者
樓主,為什么YAW水平轉動數據沒變化的?
回復

使用道具 舉報

地板
ID:479281 發表于 2019-7-25 10:07 | 只看該作者
wuhuojian 發表于 2019-7-24 18:39
樓主,為什么YAW水平轉動數據沒變化的?

找到問題了,指南針的線短路了,但旋轉時候發現水平方向的角度并不均勻,不知道是不是HMC5883沒校準的問題
回復

使用道具 舉報

5#
ID:479281 發表于 2019-7-25 17:18 | 只看該作者
YAW的數據還是會很緩慢地漂移,大概半個小時差一度左右,怎么解決呢,樓主
回復

使用道具 舉報

6#
ID:282431 發表于 2019-7-25 17:50 | 只看該作者
這個實用呀,好好學習。點贊點贊點贊
回復

使用道具 舉報

7#
ID:160072 發表于 2020-2-24 23:00 | 只看該作者
這個真的厲害 謝謝大神
回復

使用道具 舉報

8#
ID:457898 發表于 2020-5-13 12:21 | 只看該作者
請問這個程序中有原理圖呢?
回復

使用道具 舉報

9#
ID:457898 發表于 2020-5-13 12:37 | 只看該作者
請問里面有原理圖嗎?
回復

使用道具 舉報

10#
ID:538585 發表于 2020-5-14 16:20 | 只看該作者
可以姿態解算,但是不知道為什么,用起來完全不行。整個姿態角的誤差特別大。不知是什么原因?
回復

使用道具 舉報

11#
ID:726668 發表于 2020-7-12 16:47 | 只看該作者
這沒有看到用Kalman濾波啊,用的是互補濾波求解四元素,然后反求歐拉角。。。。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品粉嫩超白一线天av | 国产做爰 | 欧美一区二区在线播放 | 亚洲视频中文 | 国产在线一区观看 | 国产 欧美 日韩 一区 | 99这里只有精品视频 | 一区二区在线不卡 | 天天干天天操天天看 | 精品视频一区二区三区 | 欧美国产精品一区二区 | 日韩一区二区在线视频 | 午夜影院中文字幕 | 欧美一级免费 | 国产一区| 丁香五月缴情综合网 | 九九热精品在线视频 | 久久成人综合 | 国产成人综合一区二区三区 | 欧美啊v在线观看 | 中文字幕成人 | 亚洲免费人成在线视频观看 | 91欧美精品成人综合在线观看 | 欧美视频一区二区三区 | 欧美a在线观看 | 蜜桃日韩| 国产在线一区二 | 亚洲高清免费观看 | 草久久 | 精品美女视频在线观看免费软件 | 成人在线一区二区 | 国产欧美一区二区三区日本久久久 | 国产精品亚洲一区二区三区在线 | 欧美在线一区二区三区 | 国产色| 日本中文字幕日韩精品免费 | 色偷偷人人澡人人爽人人模 | 免费黄色片在线观看 | 日韩黄 | 羞羞视频网 | 亚洲高清在线免费观看 |