找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STM32F429开发-空间姿态检测系统

[复制链接]
跳转到指定楼层
楼主
临近期末,学校刚刚考完试,弄了一个基于STM32F429的姿态检测系统,也就是俗称的AHRS,被很多人用来做四轴飞行器的,不过本人对四轴飞行器不是很感兴趣,主要用来检测人体姿态和仿生控制的。采用MPU6050进行数据融合,得到空间姿态信息,从而完成手势检测,动作检测,人体姿态检测。基于MEMS的三轴陀螺仪,加速度计。目前AHRS内部采用的多传感器数据融合进行的航姿解算单元为卡尔曼滤波器。
   特点:高精度360 度全方位位置姿态输出,数据融合算法快速动态响应与长时间稳定性(无漂移,无积累误差)
   输出:三维全姿态数据(四元数 / 欧拉角 / 旋转矩阵/原始数据)三维加速度 / 三维角速度

   不多说了上图!相关原理请自己谷歌一下

  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. }
复制代码


空间姿态检测.zip (611.82 KB, 下载次数: 58)

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

使用道具 举报

沙发
ID:94995 发表于 2019-4-2 14:28 | 只看该作者
不错。学学
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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