芯片解密|单片机解密|IC解密|芯片破解|芯片复制| PCB抄板|软件开发

飞芯科技-芯片解密|单片机解密|IC解密|芯片破解|芯片复制| PCB抄板|软件开发

IC解密平衡车卡尔曼滤波源码

  1. //IC解密 两轮自平衡车最终版控制程序(6轴MPU6050+互补滤波+PWM电机)
  2. // IC解密单片机STC12C5A60S2
  3. // IC解密晶振:20M
  4. ***********************************************************************/

  5. #include <REG52.H>       
  6. #include <math.h>     
  7. #include <stdio.h>   
  8. #include <INTRINS.H>

  9. typedef unsigned char  uchar;
  10. typedef unsigned short ushort;
  11. typedef unsigned int   uint;

  12. //******功能模块头文件*******

  13. #include "DELAY.H"                    //延时头文件
  14. #include "STC_ISP.H"            //程序烧录头文件
  15. #include "SET_SERIAL.H"                //串口头文件
  16. #include "SET_PWM.H"                //PWM头文件
  17. #include "MOTOR.H"                        //电机控制头文件
  18. #include "MPU6050.H"                //MPU6050头文件



  19. //******角度参数************

  20. float Gyro_y;        //Y轴陀螺仪数据暂存
  21. float Angle_gy;      //由角速度计算的倾斜角度
  22. float Accel_x;             //X轴加速度值暂存
  23. float Angle_ax;      //由加速度计算的倾斜角度
  24. float Angle;         //小车最终倾斜角度
  25. uchar value;                 //角度正负极性标记       

  26. //******PWM参数*************

  27. int   speed_mr;                 //右电机转速
  28. int   speed_ml;                 //左电机转速
  29. int   PWM_R;         //右轮PWM值计算
  30. int   PWM_L;         //左轮PWM值计算
  31. float PWM;           //综合PWM计算
  32. float PWMI;                         //PWM积分值

  33. //******电机参数*************

  34. float speed_r_l;        //电机转速
  35. float speed;        //电机转速滤波
  36. float position;            //位移

  37. //******蓝牙遥控参数*************
  38. uchar remote_char;
  39. char  turn_need;
  40. char  speed_need;

  41. //*********************************************************
  42. //定时器100Hz数据更新中断
  43. //*********************************************************

  44. void Init_Timer1(void)        //10毫秒@20MHz,100Hz刷新频率
  45. {
  46.         AUXR &= 0xBF;                //定时器时钟12T模式
  47.         TMOD &= 0x0F;                //设置定时器模式
  48.         TMOD |= 0x10;                //设置定时器模式
  49.         TL1 = 0xE5;                    //设置定时初值
  50.         TH1 = 0xBE;                    //设置定时初值
  51.         TF1 = 0;                    //清除TF1标志
  52.         TR1 = 1;                    //定时器1开始计时
  53. }



  54. //*********************************************************
  55. //中断控制初始化
  56. //*********************************************************

  57. void Init_Interr(void)         
  58. {
  59.         EA = 1;     //开总中断
  60.     EX0 = 1;    //开外部中断INT0
  61.     EX1 = 1;    //开外部中断INT1
  62.     IT0 = 1;    //下降沿触发
  63.     IT1 = 1;    //下降沿触发
  64.         ET1 = 1;    //开定时器1中断
  65. }



  66. //******卡尔曼参数************
  67.                
  68. float code Q_angle=0.001;  
  69. float code Q_gyro=0.003;
  70. float code R_angle=0.5;
  71. float code dt=0.01;                          //dt为kalman滤波器采样时间;
  72. char  code C_0 = 1;
  73. float xdata Q_bias, Angle_err;
  74. float xdata PCt_0, PCt_1, E;
  75. float xdata K_0, K_1, t_0, t_1;
  76. float xdata Pdot[4] ={0,0,0,0};
  77. float xdata PP[2][2] = { { 1, 0 },{ 0, 1 } };


  78. //*********************************************************
  79. // 卡尔曼滤波
  80. //*********************************************************

  81. //Kalman滤波,20MHz的处理时间约0.77ms;

  82. void Kalman_Filter(float Accel,float Gyro)               
  83. {
  84.         Angle+=(Gyro - Q_bias) * dt; //先验估计

  85.        
  86.         Pdot[0]=Q_angle - PP[0][1] - PP[1][0]; // Pk-先验估计误差协方差的微分

  87.         Pdot[1]=- PP[1][1];
  88.         Pdot[2]=- PP[1][1];
  89.         Pdot[3]=Q_gyro;
  90.        
  91.         PP[0][0] += Pdot[0] * dt;   // Pk-先验估计误差协方差微分的积分
  92.         PP[0][1] += Pdot[1] * dt;   // =先验估计误差协方差
  93.         PP[1][0] += Pdot[2] * dt;
  94.         PP[1][1] += Pdot[3] * dt;
  95.                
  96.         Angle_err = Accel - Angle;        //zk-先验估计
  97.        
  98.         PCt_0 = C_0 * PP[0][0];
  99.         PCt_1 = C_0 * PP[1][0];
  100.        
  101.         E = R_angle + C_0 * PCt_0;
  102.        
  103.         K_0 = PCt_0 / E;
  104.         K_1 = PCt_1 / E;
  105.        
  106.         t_0 = PCt_0;
  107.         t_1 = C_0 * PP[0][1];

  108.         PP[0][0] -= K_0 * t_0;                 //后验估计误差协方差
  109.         PP[0][1] -= K_0 * t_1;
  110.         PP[1][0] -= K_1 * t_0;
  111.         PP[1][1] -= K_1 * t_1;
  112.                
  113.         Angle        += K_0 * Angle_err;         //后验估计
  114.         Q_bias        += K_1 * Angle_err;         //后验估计
  115.         Gyro_y   = Gyro - Q_bias;         //输出值(后验估计)的微分=角速度

  116. }



联系方式

地址:石家庄市新华区民族路77号华强广场D座2009
电话:0311-88816616/87087811
手机:13315190088
传真:0311-67901001
联系人:张工
网址:www.feixindz.com
邮箱:feixindz@163.com
微信:xinpianjiemi
QQ:527263666/568069805

在线客服
热线电话

企业微信