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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6007|回復: 1
收起左側

STM32F429開發-空間姿態檢測系統

[復制鏈接]
ID:127084 發表于 2016-6-17 12:27 | 顯示全部樓層 |閱讀模式
臨近期末,學校剛剛考完試,弄了一個基于STM32F429的姿態檢測系統,也就是俗稱的AHRS,被很多人用來做四軸飛行器的,不過本人對四軸飛行器不是很感興趣,主要用來檢測人體姿態和仿生控制的。采用MPU6050進行數據融合,得到空間姿態信息,從而完成手勢檢測,動作檢測,人體姿態檢測。基于MEMS的三軸陀螺儀,加速度計。目前AHRS內部采用的多傳感器數據融合進行的航姿解算單元為卡爾曼濾波器。
   特點:高精度360 度全方位位置姿態輸出,數據融合算法快速動態響應與長時間穩定性(無漂移,無積累誤差)
   輸出:三維全姿態數據(四元數 / 歐拉角 / 旋轉矩陣/原始數據)三維加速度 / 三維角速度

   不多說了上圖!相關原理請自己谷歌一下

58a0574b86023741dfc90243535b5163.jpg
  1. /*-----------------------------------------------------------------------------------
  2.                                                                                                 STM32F429ZI+MPU6050+AHRS
  3.         
  4.         簡介:
  5.         
  6.                         1) 如何計算積分
  7.                          對角速度積分得到角度,但是會累積誤差,dt為積分時間s秒,最好放在中斷運行.中斷每隔
  8.                          dt秒進入一次中斷并進行計算,必須確保在1個中斷周期內能夠完成全部計算.
  9.                         
  10.                          Example:                        
  11.                          Axis.GyroY = getGyroY();                        //獲取Y軸角速度,單位為度
  12.                          Angle += Axis.GyroY * dt;    //離散信號的積分即為求黎曼和.
  13.                
  14.                 2) 互補濾波器
  15.                          原理是取當前傾角和加速度,做差獲得傾角差值并進行放大,然后與陀螺儀角速度
  16.                          疊加后再積分,從而使傾角跟蹤為加速度獲得的角度.
  17.                          2為放大倍數,可調節補償度;0.01為系統周期10ms.
  18.                         
  19.                          Example:                        
  20.                          FilterAngle = FilterAngle + (((Gesture.Angle_FY - FilterAngle)*2 + Axis.GyroY)*0.01);
  21.                
  22.                 3) 卡爾曼濾波器
  23.                          原理請百度
  24.                         
  25.                          Example:                        
  26.                          Kalman_Filter(Gesture.Angle_FY,Axis.GyroY,&FilterAngle);
  27.                         
  28.                 4) AHRS數據融合
  29.                          通過四元數矩陣運算把加速度計和陀螺儀的數據進行融合計算出歐拉角.
  30.                  
  31.         
  32. +------------------------+-----------------------+----------------------------+
  33. +                                               LCD GPIO分配表                                   +
  34. +------------------------+-----------------------+----------------------------+
  35. |  LCD_TFT R2 <-> PC10   |  LCD_TFT G2 <-> PA6   |  LCD_TFT B2 <-> PD6        |
  36. |  LCD_TFT R3 <-> PB0    |  LCD_TFT G3 <-> PG10  |  LCD_TFT B3 <-> PG11       |
  37. |  LCD_TFT R4 <-> PA11   |  LCD_TFT G4 <-> PB10  |  LCD_TFT B4 <-> PG12       |
  38. |  LCD_TFT R5 <-> PA12   |  LCD_TFT G5 <-> PB11  |  LCD_TFT B5 <-> PA3        |
  39. |  LCD_TFT R6 <-> PB1    |  LCD_TFT G6 <-> PC7   |  LCD_TFT B6 <-> PB8        |
  40. |  LCD_TFT R7 <-> PG6    |  LCD_TFT G7 <-> PD3   |  LCD_TFT B7 <-> PB9        |
  41. -------------------------------------------------------------------------------
  42.           |  LCD_TFT HSYNC <-> PC6   | LCDTFT VSYNC <->  PA4   |
  43.           |  LCD_TFT CLK   <-> PG7   | LCD_TFT DE   <->  PF10  |
  44.            -----------------------------------------------------

  45. +-------------------+--------------------+--------------------+--------------------+
  46. +                                               SDRAM GPIO 分配表                                     +
  47. +-------------------+--------------------+--------------------+--------------------+
  48. | PD0  <-> FMC_D2   | PE0  <-> FMC_NBL0  | PF0  <-> FMC_A0    | PG0  <-> FMC_A10   |
  49. | PD1  <-> FMC_D3   | PE1  <-> FMC_NBL1  | PF1  <-> FMC_A1    | PG1  <-> FMC_A11   |
  50. | PD8  <-> FMC_D13  | PE7  <-> FMC_D4    | PF2  <-> FMC_A2    | PG8  <-> FMC_SDCLK |
  51. | PD9  <-> FMC_D14  | PE8  <-> FMC_D5    | PF3  <-> FMC_A3    | PG15 <-> FMC_NCAS  |
  52. | PD10 <-> FMC_D15  | PE9  <-> FMC_D6    | PF4  <-> FMC_A4    |--------------------+
  53. | PD14 <-> FMC_D0   | PE10 <-> FMC_D7    | PF5  <-> FMC_A5    |   
  54. | PD15 <-> FMC_D1   | PE11 <-> FMC_D8    | PF11 <-> FMC_NRAS  |
  55. +-------------------| PE12 <-> FMC_D9    | PF12 <-> FMC_A6    |
  56.                      | PE13 <-> FMC_D10   | PF13 <-> FMC_A7    |   
  57.                      | PE14 <-> FMC_D11   | PF14 <-> FMC_A8    |
  58.                      | PE15 <-> FMC_D12   | PF15 <-> FMC_A9    |
  59. +-------------------+--------------------+--------------------+
  60. | PB5 <-> FMC_SDCKE1|
  61. | PB6 <-> FMC_SDNE1 |
  62. | PC0 <-> FMC_SDNWE |
  63. +-------------------+  
  64.   
  65.         作者: BoX
  66.         版本: V1.0
  67.         平臺: STM32F429I-Discovery Board
  68.         日期: 2014年7月11日
  69. ------------------------------------------------------------------------------------*/
  70. #include "LED.h"
  71. #include "stm32f4_tft.h"
  72. #include "stm32f4_delay.h"
  73. #include "stm32f4_usart1.h"
  74. #include "stm32f4_timer.h"
  75. #include "stm32f4_ahrs.h"
  76. #include "stm32f4_mpu6050.h"
  77. #include "iic_analog.h"
  78. #include "kalman_filter.h"
  79. #include "stm32f4xx.h"
  80. /*------------------------------------------
  81.                                                                 條件編譯
  82.         DATA_TYPE
  83.         0 - 輸出處理后的數據,加速度單位為g,角速度
  84.                   單位為deg/s
  85.         1 - 輸出數據融合后的歐拉角.
  86.         2 - 輸出卡爾曼濾波后的角度.
  87.         
  88.         DATA_DISPLAY
  89.         0 - 數據不顯示在LCD上
  90.         1 - 數據顯示在LCD上
  91. ------------------------------------------*/
  92. #define USAR_DELAY    (800)
  93. #define DATA_TYPE                        (1)
  94. #define DATA_DISPLAY  (1)
  95. /*------------------------------------------
  96.                                                                 全局變量
  97. ------------------------------------------*/
  98. extern MPU6050_AxisTypeDef    Axis;
  99. extern AHRS_EulerAngleTypeDef EulerAngle;

  100. uint8_t LCD_Buffer[240];
  101. /*------------------------------------------
  102.                                                                 主函數
  103. ------------------------------------------*/
  104. int main(void)
  105. {
  106.         DelayInit();
  107.         LED_Init();
  108.         USART1_Config();
  109.         printf(" AHRS OK!");
  110.         MPU6050_Init();
  111.         TIM2_Config(2000,89);  //每2ms溢出中斷為AHRS_Update提供定時
  112.         LCD_Init();
  113.         LCD_LayerInit();
  114.         LTDC_Cmd(ENABLE);
  115.         LCD_SetLayer(LCD_FOREGROUND_LAYER);
  116.         LCD_Clear(LCD_COLOR_BLACK);
  117.         LCD_SetColors(LCD_COLOR_GREEN,LCD_COLOR_BLACK);
  118.         
  119.         while (1)
  120.         {
  121. #if DATA_TYPE         == 0
  122.                 Axis.AccX  = getAccX();
  123.                 Axis.AccY  = getAccY();
  124.                 Axis.AccZ  = getAccZ();
  125.                 Axis.GyroX = getGyroX();
  126.                 Axis.GyroY = getGyroY();
  127.                 Axis.GyroZ = getGyroZ();
  128.                 printf("AX:%3.2f AY:%3.2f AZ:%3.2f GX:%4.0f GY:%4.0f GZ:%4.0f",
  129.                                                                                                                                                                                                                  Axis.AccX,
  130.                                                                                                                                                                                                                  Axis.AccY,
  131.                                                                                                                                                                                                                  Axis.AccZ,
  132.                                                                                                                                                                                                                  Axis.GyroX,
  133.                                                                                                                                                                                                                  Axis.GyroY,
  134.                                                                                                                                                                                                                  Axis.GyroZ);
  135.         #if DATA_DISPLAY == 1               
  136.                 sprintf(LCD_Buffer,"AX:%3.2f AY:%3.2f AZ:%3.2f  ",
  137.                                                                                                                                                                                                                  Axis.AccX,
  138.                                                                                                                                                                                                                  Axis.AccY,
  139.                                                                                                                                                                                                                  Axis.AccZ);
  140.                 LCD_DisplayStringLine(1,LCD_Buffer);
  141.                
  142.                 sprintf(LCD_Buffer,"GX:%4.0f GY:%4.0f GZ:%4.0f  ",
  143.                                                                                                                                                                                                                  Axis.GyroX,
  144.                                                                                                                                                                                                                  Axis.GyroY,
  145.                                                                                                                                                                                                                  Axis.GyroZ);
  146.                 LCD_DisplayStringLine(21,LCD_Buffer);
  147.         #endif
  148.         
  149. #elif DATA_TYPE         == 1
  150.                 printf("Pitch:%3.0f Roll:%3.0f Yaw:%3.0f",
  151.                                                                                                                                                                                                         EulerAngle.Pitch,
  152.                                                                                                                                                                                                         EulerAngle.Roll,
  153.                                                                                                                                                                                                         EulerAngle.Yaw);
  154.         #if DATA_DISPLAY == 1
  155.                 sprintf(LCD_Buffer,"Pitch:%3.0f Roll:%3.0f Yaw:%3.0f  ",
  156.                                                                                                                                                                                                                                         EulerAngle.Pitch,
  157.                                                                                                                                                                                                                                         EulerAngle.Roll,
  158.                                                                                                                                                                                                                                         EulerAngle.Yaw);
  159.                 LCD_DisplayStringLine(1,LCD_Buffer);
  160.         #endif
  161.         
  162. #elif DATA_TYPE         == 2
  163.                 Gesture.Angle_FY = getFuYangAngle();
  164.                 Axis.GyroY       = getGyroY();
  165.                 Kalman_Filter(Gesture.Angle_FY,Axis.GyroY,&FilterAngle);
  166.                 printf("FY1:%3.1f FY2:%3.1f",Gesture.Angle_FY,FilterAngle);
  167.                
  168.         #if DATA_DISPLAY == 1
  169.                 sprintf(LCD_Buffer,"FY1:%3.1f FY2:%3.1f",Gesture.Angle_FY,FilterAngle);
  170.                 LCD_DisplayStringLine(1,LCD_Buffer);
  171.         #endif
  172.         
  173. #endif                        
  174.                 GPIOG->ODR ^= GPIO_Pin_14;
  175.                 delayms(30);
  176.         }
  177. }
復制代碼

0.png
空間姿態檢測.zip (611.82 KB, 下載次數: 58)

回復

使用道具 舉報

ID:94995 發表于 2019-4-2 14:28 | 顯示全部樓層
不錯。學學
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 福利精品在线观看 | 久久高清亚洲 | 91精品国产91久久久久久吃药 | 国产精品永久久久久久久www | 一区二区三区国产精品 | 一区免费 | 亚洲精品专区 | 国产97在线 | 日韩 | 欧美在线观看一区二区 | 久久伊人影院 | 91久久精品 | 免费的一级视频 | 国产午夜亚洲精品不卡 | 国产福利一区二区 | 在线播放日韩 | 国产精品视频一二三区 | 五月婷六月丁香 | 亚洲国产网站 | 天天操天天干天天爽 | 国产激情视频在线观看 | 久久久久成人精品 | 精品www| 四虎最新 | 日韩一区二区三区在线视频 | 中文字幕av在线 | 国产一区久久久 | 欧美日韩视频在线第一区 | 人人做人人澡人人爽欧美 | 一区二区欧美在线 | 久久国产视频网站 | 在线观看深夜视频 | 色爽女 | 国产亚洲一级 | 久久精品一级 | 好姑娘高清在线观看电影 | 久草视频观看 | 欧美成人激情 | 午夜专区 | 亚洲国产成人精品女人久久久野战 | 日韩欧美亚洲一区 | 免费看a |