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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13336|回復: 21
收起左側

mpu6050卡爾曼濾波輸出姿態角程序

  [復制鏈接]
ID:159760 發表于 2017-7-30 01:31 | 顯示全部樓層 |閱讀模式
經過調試可以正確讀取數據并輸出 姿態角

單片機源程序如下:


  1. /******************** (C) COPYRIGHT 2012 WildFire Team **************************
  2. * 文件名  :main.c
  3. * 描述    :I2C EEPROM(AT24C02)測試,測試信息通過USART1打印在電腦的超級終端。     
  4. * 實驗平臺:野火STM32開發板
  5. * 庫版本  :ST3.0.0
  6. * 作者    :wildfire team
  7. **********************************************************************************/        
  8. #include "stm32f10x.h"
  9. #include "I2C_MPU6050.h"
  10. #include "usart1.h"
  11. #include "delay.h"
  12. #include "filter.h"
  13. #include "math.h"
  14. #include "misc.h"
  15. #include "TIMX.h"
  16. #define AIN2   PBout(15)
  17. #define AIN1   PBout(14)
  18. #define BIN1   PBout(13)
  19. #define BIN2   PBout(12)
  20. #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))  
  21. #define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
  22. #define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))
  23. #define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C
  24. #define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C
  25. #define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C
  26. #define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C
  27. #define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C
  28. #define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C   
  29. #define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C   
  30. //#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //輸出
  31. //#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //輸入

  32. #define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //輸出
  33. //#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //輸入

  34. //#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //輸出
  35. //#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //輸入

  36. //#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //輸出
  37. //#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //輸入

  38. //#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //輸出
  39. //#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //輸入

  40. //#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //輸出
  41. //#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //輸入

  42. //#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //輸出
  43. //#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //輸入
  44. #define PI 3.14159265
  45. #define ZHONGZHI -6
  46. #define PWMA   TIM1->CCR1  //PA8

  47. #define PWMB   TIM1->CCR4  //PA11
  48. float Angle_Balance,Gyro_Balance,Gyro_Turn;  //平衡環控制相關變量
  49. float Encoder_left,Encoder_right;            //速度環控制相關變量
  50. int Moto1,Moto2;                                                            
  51. /*
  52. * 函數名:main
  53. * 描述  :主函數
  54. * 輸入  :無
  55. * 輸出  :無
  56. * 返回  :無
  57. */

  58. //中斷分組處理函數
  59. void NVIC_Configuration(void)
  60. {

  61.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);        //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級

  62. }
  63. int Read_Encoder(u8 TIMX);
  64. //位置平衡PID控制
  65. int balance(float Angle,float Gyro)
  66. {  
  67.    float Bias,kp=500,kd=1;
  68.          int balance;
  69.          Bias=Angle-ZHONGZHI;       //===求出平衡的角度中值 和機械相關
  70.          balance=kp*Bias+Gyro*kd;   //===計算平衡控制的電機PWM  PD控制   kp是P系數 kd是D系數
  71.          return balance;
  72. }

  73. //速度PI控制
  74. int velocity(int encoder_left,int encoder_right)
  75. {
  76.         static float Velocity,Encoder_Least,Encoder,Movement;
  77.         static float Encoder_Integral,Target_Velocity;
  78.         float kp=50,ki=kp/200;
  79.         Encoder_Least=(Encoder_left+Encoder_right)-0;
  80.         Encoder*=0.7;                                  //一階低通濾波,上次速度差占70,本次速度差占30,減緩速度差值,減少對直立系統的干擾
  81.         Encoder+=Encoder_Least*0.3;                      //一階低通濾波
  82.         Encoder_Integral+=Encoder;            //積分出位移,積分時間10ms
  83.         Encoder_Integral=Encoder_Integral-Movement;  //接受遙控器的數據,控制正反轉
  84.         if(Encoder_Integral>15000){
  85.                 Encoder_Integral=15000;                   //積分限幅
  86.         }
  87.         if(Encoder_Integral<-15000)
  88.         {
  89.         Encoder_Integral=-15000;
  90.         }
  91.         Velocity=Encoder*kp+Encoder_Integral*ki;    //PI 控制器
  92.         
  93.         return Velocity;
  94.         
  95. }
  96. //限幅函數
  97. void Xianfu_Pwm(void)
  98. {        
  99.           int Amplitude=6900;    //===PWM滿幅是7200 限制在6900
  100.     if(Moto1<-Amplitude) Moto1=-Amplitude;        
  101.                 if(Moto1>Amplitude)  Moto1=Amplitude;        
  102.           if(Moto2<-Amplitude) Moto2=-Amplitude;        
  103.                 if(Moto2>Amplitude)  Moto2=Amplitude;               
  104. }

  105. //絕對值函數
  106. int myabs(int a)
  107. {                    
  108.           int temp;
  109.                 if(a<0)  temp=-a;  
  110.           else temp=a;
  111.           return temp;
  112. }
  113. /*void MiniBalance_Motor_Init(void)
  114. {
  115.         RCC->APB2ENR|=1<<3;       //PORTB時鐘使能   
  116.         GPIOB->CRH&=0X0000FFFF;   //PORTB12 13 14 15推挽輸出
  117.         GPIOB->CRH|=0X22220000;   //PORTB12 13 14 15推挽輸出
  118. }*/
  119. void MiniBalance_Motor_Init(void)
  120. {

  121. GPIO_InitTypeDef  GPIO_InitStructure;
  122.          
  123. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);         //使能PB,PE端口時鐘
  124.         
  125. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;                                 //LED0-->PB.5 端口配置
  126. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽輸出
  127. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度為50MHz
  128. GPIO_Init(GPIOB, &GPIO_InitStructure);                                         //根據設定參數初始化GPIOB.5
  129. //GPIO_SetBits(GPIOB,GPIO_Pin_5);        
  130. //GPIO_ResetBits(GPIOB,GPIO_Pin_6);        //PB.5 輸出高

  131. //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                             //LED1-->PE.5 端口配置, 推挽輸出
  132. //GPIO_Init(GPIOE, &GPIO_InitStructure);                                           //推挽輸出 ,IO口速度為50MHz
  133. //GPIO_SetBits(GPIOE,GPIO_Pin_5);                                                  //PE.5 輸出高
  134. }


  135. void MiniBalance_PWM_Init(u16 arr,u16 psc)
  136. {                                                         
  137.         MiniBalance_Motor_Init();  //初始化電機控制所需IO
  138.         RCC->APB2ENR|=1<<11;       //使能TIM1時鐘   
  139.         RCC->APB2ENR|=1<<2;        //PORTA時鐘使能     
  140.         GPIOA->CRH&=0XFFFF0FF0;    //PORTA8 11復用輸出
  141.         GPIOA->CRH|=0X0000B00B;    //PORTA8 11復用輸出
  142.         TIM1->ARR=arr;             //設定計數器自動重裝值
  143.         TIM1->PSC=psc;             //預分頻器不分頻
  144.         TIM1->CCMR2|=6<<12;        //CH4 PWM1模式        
  145.         TIM1->CCMR1|=6<<4;         //CH1 PWM1模式        
  146.         TIM1->CCMR2|=1<<11;        //CH4預裝載使能         
  147.         TIM1->CCMR1|=1<<3;         //CH1預裝載使能         
  148.         TIM1->CCER|=1<<12;         //CH4輸出使能           
  149.         TIM1->CCER|=1<<0;          //CH1輸出使能        
  150.         TIM1->BDTR |= 1<<15;       //TIM1必須要這句話才能輸出PWM
  151.         TIM1->CR1=0x8000;          //ARPE使能
  152.         TIM1->CR1|=0x01;          //使能定時器1                        
  153. }

  154. //PWM shewzhi
  155. void Set_Pwm(int moto1,int moto2)
  156. {
  157.         
  158.               int siqu=400;
  159.                         if(moto1<0)                 
  160.                         {
  161.                                 printf("AIN反向");
  162.                                 AIN1=0;   
  163.                         AIN2=1;
  164.                         }
  165.                         else         
  166.                         {
  167.                                 printf("AINfanxaing");
  168.                                 AIN2=0;
  169.                                 AIN1=1;
  170.                         }
  171.                         PWMA=myabs(moto1)+siqu;
  172.                   if(moto2<0)
  173.                         {        
  174.                                 BIN1=0;               
  175.                                 BIN2=1;
  176.                         }
  177.                         else      
  178.                         {                        
  179.                                 BIN1=1;                        
  180.                                 BIN2=0;
  181.                         }
  182.                         PWMB=myabs(moto2)+siqu;        
  183. }

  184. int main(void)
  185. {        
  186.   int Accel_Y,Accel_X,Accel_Z,Gyro_X,Gyro_Y,Gyro_Z;
  187.         float Acceleration_Z;                       //Z軸加速度計
  188.         int Balance_Pwm,Velocity_Pwm;
  189.         
  190.   NVIC_Configuration();          //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
  191.         
  192.         /* 串口1初始化 */
  193.         USART1_Config();
  194.   /*GPIO 口初始化        */
  195.         MiniBalance_Motor_Init();
  196.         /*定時器1初始化*/
  197.         MiniBalance_PWM_Init(7199,0);
  198.         Encoder_Init_TIM2();            //=====編碼器接口
  199.         Encoder_Init_TIM4();            //=====初始化編碼器2
  200.         /*IIC接口初始化*/
  201.         I2C_MPU6050_Init();         
  202.         /*陀螺儀傳感器初始化*/
  203.   InitMPU6050();
  204.         
  205.         /***********************************************************************/
  206.         
  207.         while(1)
  208.         {
  209.                 Accel_X=GetData(ACCEL_XOUT_H);
  210.                 Accel_Y=GetData(ACCEL_YOUT_H);
  211.                 Accel_Z=GetData(ACCEL_ZOUT_H);
  212.                 Gyro_X=GetData(GYRO_XOUT_H);
  213.                 Gyro_Y=GetData(GYRO_YOUT_H);
  214.                 Gyro_Z=GetData(GYRO_ZOUT_H);
  215.                 Encoder_left=-Read_Encoder(2);                                      //===讀取編碼器的值,因為兩個電機的旋轉了180度的,所以對其中一個取反,保證輸出極性一致
  216.                 Encoder_right=Read_Encoder(4);
  217.                
  218.     /*printf("\r\n---------加速度X軸原始數據---------%d \r\n",Accel_X);
  219.                 printf("\r\n---------加速度Y軸原始數據---------%d \r\n",Accel_Y);        
  220.                 printf("\r\n---------加速度Z軸原始數據---------%d \r\n",Accel_Z);        
  221.                 printf("\r\n---------陀螺儀X軸原始數據---------%d \r\n",Gyro_X);        
  222.                 printf("\r\n---------陀螺儀Y軸原始數據---------%d \r\n",Gyro_Y);        
  223.                 printf("\r\n---------陀螺儀Z軸原始數據---------%d \r\n",Gyro_Z);*/
  224.                 //delay_ms(500);
  225.         
  226.                  if(Gyro_Y>32768)  Gyro_Y-=65536;                       //數據類型轉換  也可通過short強制類型轉換
  227.                         if(Gyro_Z>32768)  Gyro_Z-=65536;                       //數據類型轉換
  228.                   if(Accel_X>32768) Accel_X-=65536;                      //數據類型轉換
  229.                   if(Accel_Z>32768) Accel_Z-=65536;                      //數據類型轉換
  230.                         Gyro_Balance=-Gyro_Y;                                  //更新平衡角速度
  231.                    Accel_Y=atan2(Accel_X,Accel_Z)*180/PI;                 //計算傾角        
  232.                   Gyro_Y =Gyro_Y/16.4;                                    //陀螺儀量程轉換        
  233.              Kalman_Filter(Accel_Y,-Gyro_Y);//卡爾曼濾波        
  234.                         //else if(Way_Angle==3)   Yijielvbo(Accel_Y,-Gyro_Y);    //互補濾波
  235.             Angle_Balance=angle;                                   //更新平衡傾角
  236.                         Gyro_Turn=Gyro_Z;                                      //更新轉向角速度
  237.                         Acceleration_Z=Accel_Z;                                //===更新Z軸加速度計        
  238.                         Gyro_Balance=-Gyro_Y;
  239.                         printf("卡爾曼濾波值%f,%f\n",Angle_Balance,Gyro_Turn);
  240.                         //Balance_Pwm =balance(Angle_Balance,Gyro_Balance);
  241.                         Velocity_Pwm=velocity(Encoder_left,Encoder_right);      
  242.                         Moto1=Velocity_Pwm;
  243.                         Moto2=Velocity_Pwm;
  244.                         printf("%d,%d\n",Moto1,Moto2);
  245.                         Xianfu_Pwm();   
  246.                         Set_Pwm(Moto1,Moto2);  
  247.                                 delay_ms(5);
  248.         }               


  249. }

  250. /******************* (C) COPYRIGHT 2012 WildFire Team *****END OF FILE************/

  251. ……………………

  252. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
卡爾曼濾波輸出姿態角.zip (2.14 MB, 下載次數: 431)


回復

使用道具 舉報

ID:217957 發表于 2018-1-6 14:54 | 顯示全部樓層
資料不錯,參考一下
回復

使用道具 舉報

ID:128321 發表于 2018-3-21 21:37 來自手機 | 顯示全部樓層
mfc20010 發表于 2018-1-6 14:54
資料不錯,參考一下

資料不錯,參考一下
回復

使用道具 舉報

ID:237206 發表于 2018-3-25 20:13 | 顯示全部樓層
支持一下
回復

使用道具 舉報

ID:290380 發表于 2018-5-3 21:18 | 顯示全部樓層

資料不錯,參考一下,支持一下
回復

使用道具 舉報

ID:323802 發表于 2018-5-6 21:52 | 顯示全部樓層
資料不錯哦
回復

使用道具 舉報

ID:329263 發表于 2018-5-14 01:48 | 顯示全部樓層
可以把附件發給我嘛,676913753@qq.com沒有幣很難受
回復

使用道具 舉報

ID:320612 發表于 2018-5-22 15:55 | 顯示全部樓層
資料不錯,參考一下,支持一下
回復

使用道具 舉報

ID:337376 發表于 2018-6-5 17:21 | 顯示全部樓層
很好的算法,謝謝分享
回復

使用道具 舉報

ID:320161 發表于 2018-6-9 23:44 | 顯示全部樓層
不能用騙人的!
回復

使用道具 舉報

ID:368329 發表于 2018-7-9 23:43 | 顯示全部樓層


資料不錯,參考一下,支持一下
回復

使用道具 舉報

ID:158903 發表于 2018-7-10 16:10 | 顯示全部樓層
資料不錯,參考一下,支持一下
馬克
回復

使用道具 舉報

ID:370943 發表于 2018-9-26 15:33 | 顯示全部樓層
學習大神的作品
回復

使用道具 舉報

ID:248291 發表于 2018-9-29 22:46 來自手機 | 顯示全部樓層
學習一下
回復

使用道具 舉報

ID:387286 發表于 2018-11-5 19:52 | 顯示全部樓層
不能用,代碼不全
回復

使用道具 舉報

ID:502704 發表于 2019-4-2 18:47 | 顯示全部樓層
資料不錯,參考一下
回復

使用道具 舉報

ID:442220 發表于 2019-7-29 19:42 | 顯示全部樓層
學習了,最近急需這些
回復

使用道具 舉報

ID:267330 發表于 2019-7-30 08:58 | 顯示全部樓層
謝謝正是我需要的
回復

使用道具 舉報

ID:421308 發表于 2019-8-2 08:54 | 顯示全部樓層
資料不錯,學習下
回復

使用道具 舉報

ID:588621 發表于 2019-8-2 15:29 來自手機 | 顯示全部樓層
厲害哦咯可以用下
回復

使用道具 舉報

ID:443082 發表于 2020-6-4 23:54 | 顯示全部樓層
資料不錯,可以放到stm32f103c8t6上使用并且成功輸出。感謝分享。
回復

使用道具 舉報

ID:369024 發表于 2020-6-7 12:27 | 顯示全部樓層
   沒有姿態結算
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品小短片 | 日韩欧美在线观看 | 在线看av的网址 | 日本在线播放 | 国产欧美日韩在线一区 | 99热热| 亚洲精品一区二三区不卡 | 欧美成人激情 | 欧美日韩在线观看一区 | 欧美色综合 | 日本天堂一区二区 | 国产综合久久 | 影音先锋中文字幕在线观看 | 欧美激情va永久在线播放 | 日本网站免费观看 | 精品国产乱码久久久久久老虎 | 在线看免费 | 欧美成人一区二区 | 欧美一区二区三区久久精品 | www.788.com色淫免费 | 亚洲视频中文字幕 | 国产一区二区三区视频 | 怡红院成人在线视频 | 亚洲综合久久网 | 亚洲欧美综合精品久久成人 | 香蕉视频1024 | 嫩草影院网址 | 成人精品在线观看 | www.国产一区 | 亚洲欧美在线一区 | 久久精品久久精品 | 亚洲国产精品成人久久久 | 日韩在线视频一区 | 欧美久久久久 | 精品国产青草久久久久福利 | av在线一区二区三区 | 精品一区二区在线观看 | 99热最新| 国产成人午夜电影网 | 蜜桃黄网| 成人亚洲精品久久久久软件 |