找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4587|回复: 2
收起左侧

飞控STM32程序 参考了匿名等程序

[复制链接]
ID:200281 发表于 2017-5-15 13:10 | 显示全部楼层 |阅读模式
分享一套基于32的程序,参考了匿名等程序
0.png
编译,下载,运行,连接飞控串口和FTDI串口,串口波特率500K,上位机打开高级收码,在上位机飞控状态标签可以看到变化的传感器数据,3D显示可以跟随roll和pitch的变化而变化,因为没有写yaw的上传,所以yaw保持零度...此时打开飞控波形按钮,打开波形显示页面,并打开相应波形开关,1到3为加速度,4到6为陀螺仪,10和11为roll和pitch,就可以看到变化的波形.

单片机源程序如下:
  1. #include "imu.h"
  2. #include "bsp/MPU6050.h"
  3. #include "math.h"

  4. #define RtA                 57.324841                                //弧度到角度
  5. #define AtR            0.0174533                                //度到角度
  6. #define Acc_G         0.0011963                                //加速度变成G
  7. #define Gyro_G         0.0152672                                //角速度变成度
  8. #define Gyro_Gr        0.0002663                                
  9. #define FILTER_NUM 20

  10. S_INT16_XYZ ACC_AVG;                        //平均值滤波后的ACC
  11. S_FLOAT_XYZ GYRO_I;                                //陀螺仪积分
  12. S_FLOAT_XYZ EXP_ANGLE;                //期望角度
  13. S_FLOAT_XYZ DIF_ANGLE;                //期望角度与实际角度差
  14. S_FLOAT_XYZ Q_ANGLE;                        //四元数计算出的角度

  15. int16_t        ACC_X_BUF[FILTER_NUM],ACC_Y_BUF[FILTER_NUM],ACC_Z_BUF[FILTER_NUM];        //加速度滑动窗口滤波数组

  16. void Prepare_Data(void)
  17. {
  18.         static uint8_t filter_cnt=0;
  19.         int32_t temp1=0,temp2=0,temp3=0;
  20.         uint8_t i;
  21.         
  22.         MPU6050_Read();
  23.         MPU6050_Dataanl();
  24.         
  25.         ACC_X_BUF[filter_cnt] = MPU6050_ACC_LAST.X;//更新滑动窗口数组
  26.         ACC_Y_BUF[filter_cnt] = MPU6050_ACC_LAST.Y;
  27.         ACC_Z_BUF[filter_cnt] = MPU6050_ACC_LAST.Z;
  28.         for(i=0;i<FILTER_NUM;i++)
  29.         {
  30.                 temp1 += ACC_X_BUF[i];
  31.                 temp2 += ACC_Y_BUF[i];
  32.                 temp3 += ACC_Z_BUF[i];
  33.         }
  34.         ACC_AVG.X = temp1 / FILTER_NUM;
  35.         ACC_AVG.Y = temp2 / FILTER_NUM;
  36.         ACC_AVG.Z = temp3 / FILTER_NUM;
  37.         filter_cnt++;
  38.         if(filter_cnt==FILTER_NUM)        filter_cnt=0;
  39.         
  40.         GYRO_I.X += MPU6050_GYRO_LAST.X*Gyro_G*0.0001;//0.0001是时间间隔,两次prepare的执行周期
  41.         GYRO_I.Y += MPU6050_GYRO_LAST.Y*Gyro_G*0.0001;
  42.         GYRO_I.Z += MPU6050_GYRO_LAST.Z*Gyro_G*0.0001;
  43. }

  44. void Get_Attitude(void)
  45. {
  46.         IMUupdate(MPU6050_GYRO_LAST.X*Gyro_Gr,
  47.                                                 MPU6050_GYRO_LAST.Y*Gyro_Gr,
  48.                                                 MPU6050_GYRO_LAST.Z*Gyro_Gr,
  49.                                                 ACC_AVG.X,ACC_AVG.Y,ACC_AVG.Z);        //*0.0174转成弧度
  50. }
  51. ////////////////////////////////////////////////////////////////////////////////
  52. #define Kp 10.0f                        // proportional gain governs rate of convergence to accelerometer/magnetometer
  53. #define Ki 0.008f                          // integral gain governs rate of convergence of gyroscope biases
  54. #define halfT 0.001f                   // half the sample period采样周期的一半

  55. float q0 = 1, q1 = 0, q2 = 0, q3 = 0;    // quaternion elements representing the estimated orientation
  56. float exInt = 0, eyInt = 0, ezInt = 0;    // scaled integral error
  57. void IMUupdate(float gx, float gy, float gz, float ax, float ay, float az)
  58. {
  59.   float norm;
  60. //  float hx, hy, hz, bx, bz;
  61.   float vx, vy, vz;// wx, wy, wz;
  62.   float ex, ey, ez;

  63.   // 先把这些用得到的值算好
  64.   float q0q0 = q0*q0;
  65.   float q0q1 = q0*q1;
  66.   float q0q2 = q0*q2;
  67. //  float q0q3 = q0*q3;
  68.   float q1q1 = q1*q1;
  69. //  float q1q2 = q1*q2;
  70.   float q1q3 = q1*q3;
  71.   float q2q2 = q2*q2;
  72.   float q2q3 = q2*q3;
  73.   float q3q3 = q3*q3;
  74.         
  75.         if(ax*ay*az==0)
  76.                  return;
  77.                
  78.   norm = sqrt(ax*ax + ay*ay + az*az);       //acc数据归一化
  79.   ax = ax /norm;
  80.   ay = ay / norm;
  81.   az = az / norm;

  82.   // estimated direction of gravity and flux (v and w)              估计重力方向和流量/变迁
  83.   vx = 2*(q1q3 - q0q2);                                                                                                //四元素中xyz的表示
  84.   vy = 2*(q0q1 + q2q3);
  85.   vz = q0q0 - q1q1 - q2q2 + q3q3 ;

  86.   // error is sum of cross product between reference direction of fields and direction measured by sensors
  87.   ex = (ay*vz - az*vy) ;                                                                    //向量外积在相减得到差分就是误差
  88.   ey = (az*vx - ax*vz) ;
  89.   ez = (ax*vy - ay*vx) ;

  90.   exInt = exInt + ex * Ki;                                                                  //对误差进行积分
  91.   eyInt = eyInt + ey * Ki;
  92.   ezInt = ezInt + ez * Ki;

  93.   // adjusted gyroscope measurements
  94.   gx = gx + Kp*ex + exInt;                                                                                                   //将误差PI后补偿到陀螺仪,即补偿零点漂移
  95.   gy = gy + Kp*ey + eyInt;
  96.   gz = gz + Kp*ez + ezInt;                                                                                           //这里的gz由于没有观测者进行矫正会产生漂移,表现出来的就是积分自增或自减

  97.   // integrate quaternion rate and normalise                                                   //四元素的微分方程
  98.   q0 = q0 + (-q1*gx - q2*gy - q3*gz)*halfT;
  99.   q1 = q1 + (q0*gx + q2*gz - q3*gy)*halfT;
  100.   q2 = q2 + (q0*gy - q1*gz + q3*gx)*halfT;
  101. ……………………

  102. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
飞控程序.7z (259.85 KB, 下载次数: 63)
回复

使用道具 举报

ID:238803 发表于 2017-10-12 10:38 来自手机 | 显示全部楼层
谢谢楼主
回复

使用道具 举报

ID:293977 发表于 2018-3-29 11:07 | 显示全部楼层
先马克一下,到时候回来下载
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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