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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5940|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

STM32F429開發(fā)-空間姿態(tài)檢測系統(tǒng)

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

   不多說了上圖!相關(guān)原理請自己谷歌一下

  1. /*-----------------------------------------------------------------------------------
  2.                                                                                                 STM32F429ZI+MPU6050+AHRS
  3.         
  4.         簡介:
  5.         
  6.                         1) 如何計算積分
  7.                          對角速度積分得到角度,但是會累積誤差,dt為積分時間s秒,最好放在中斷運(yùn)行.中斷每隔
  8.                          dt秒進(jìn)入一次中斷并進(jìn)行計算,必須確保在1個中斷周期內(nèi)能夠完成全部計算.
  9.                         
  10.                          Example:                        
  11.                          Axis.GyroY = getGyroY();                        //獲取Y軸角速度,單位為度
  12.                          Angle += Axis.GyroY * dt;    //離散信號的積分即為求黎曼和.
  13.                
  14.                 2) 互補(bǔ)濾波器
  15.                          原理是取當(dāng)前傾角和加速度,做差獲得傾角差值并進(jìn)行放大,然后與陀螺儀角速度
  16.                          疊加后再積分,從而使傾角跟蹤為加速度獲得的角度.
  17.                          2為放大倍數(shù),可調(diào)節(jié)補(bǔ)償度;0.01為系統(tǒng)周期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數(shù)據(jù)融合
  29.                          通過四元數(shù)矩陣運(yùn)算把加速度計和陀螺儀的數(shù)據(jù)進(jìn)行融合計算出歐拉角.
  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 - 輸出處理后的數(shù)據(jù),加速度單位為g,角速度
  84.                   單位為deg/s
  85.         1 - 輸出數(shù)據(jù)融合后的歐拉角.
  86.         2 - 輸出卡爾曼濾波后的角度.
  87.         
  88.         DATA_DISPLAY
  89.         0 - 數(shù)據(jù)不顯示在LCD上
  90.         1 - 數(shù)據(jù)顯示在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.                                                                 主函數(shù)
  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. }
復(fù)制代碼


空間姿態(tài)檢測.zip (611.82 KB, 下載次數(shù): 58)

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

使用道具 舉報

沙發(fā)
ID:94995 發(fā)表于 2019-4-2 14:28 | 只看該作者
不錯。學(xué)學(xué)
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久草视频网站 | 久久婷婷香蕉热狠狠综合 | 成人欧美一区二区三区色青冈 | 国产乱码精品一区二区三区忘忧草 | 久久久国产网站 | 美女天天操 | 日韩视频精品在线 | 精品免费视频 | 91精品午夜窝窝看片 | 91精品国产综合久久久动漫日韩 | 欧美黄色绿像 | 一级少妇女片 | 红桃视频一区二区三区免费 | 一区二区在线 | 欧美一级久久 | 国产福利在线视频 | 欧美激情区 | 欧美久久一区二区三区 | 99久久精品视频免费 | 国产欧美日韩在线一区 | www.国产.com | 国产片一区二区三区 | 中午字幕在线观看 | 性网址| 久久久女女女女999久久 | 国产一区二区视频免费在线观看 | 自拍偷拍在线视频 | 国产美女福利在线观看 | 红色av社区| 一区二区手机在线 | 一区二区欧美在线 | 国产一区二区三区四区三区四 | 久久99精品国产自在现线小黄鸭 | 国产精品一区二区福利视频 | 日韩一区二区福利视频 | 伊人久久综合 | 国产精品国产a级 | 国产激情在线 | 在线观看黄免费 | 日韩一级二级片 | 国产精品日韩欧美一区二区三区 |