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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

mpu6050卡爾曼濾波輸出姿態(tài)角程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:159760 發(fā)表于 2017-7-30 01:31 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
經(jīng)過調(diào)試可以正確讀取數(shù)據(jù)并輸出 姿態(tài)角

單片機源程序如下:


  1. /******************** (C) COPYRIGHT 2012 WildFire Team **************************
  2. * 文件名  :main.c
  3. * 描述    :I2C EEPROM(AT24C02)測試,測試信息通過USART1打印在電腦的超級終端。     
  4. * 實驗平臺:野火STM32開發(fā)板
  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;  //平衡環(huán)控制相關(guān)變量
  49. float Encoder_left,Encoder_right;            //速度環(huán)控制相關(guān)變量
  50. int Moto1,Moto2;                                                            
  51. /*
  52. * 函數(shù)名:main
  53. * 描述  :主函數(shù)
  54. * 輸入  :無
  55. * 輸出  :無
  56. * 返回  :無
  57. */

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

  61.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);        //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級

  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;       //===求出平衡的角度中值 和機械相關(guān)
  70.          balance=kp*Bias+Gyro*kd;   //===計算平衡控制的電機PWM  PD控制   kp是P系數(shù) kd是D系數(shù)
  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,減緩速度差值,減少對直立系統(tǒng)的干擾
  81.         Encoder+=Encoder_Least*0.3;                      //一階低通濾波
  82.         Encoder_Integral+=Encoder;            //積分出位移,積分時間10ms
  83.         Encoder_Integral=Encoder_Integral-Movement;  //接受遙控器的數(shù)據(jù),控制正反轉(zhuǎn)
  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. //限幅函數(shù)
  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. //絕對值函數(shù)
  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);                                         //根據(jù)設(shè)定參數(shù)初始化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復(fù)用輸出
  141.         GPIOA->CRH|=0X0000B00B;    //PORTA8 11復(fù)用輸出
  142.         TIM1->ARR=arr;             //設(shè)定計數(shù)器自動重裝值
  143.         TIM1->PSC=psc;             //預(yù)分頻器不分頻
  144.         TIM1->CCMR2|=6<<12;        //CH4 PWM1模式        
  145.         TIM1->CCMR1|=6<<4;         //CH1 PWM1模式        
  146.         TIM1->CCMR2|=1<<11;        //CH4預(yù)裝載使能         
  147.         TIM1->CCMR1|=1<<3;         //CH1預(yù)裝載使能         
  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();          //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級
  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);                                      //===讀取編碼器的值,因為兩個電機的旋轉(zhuǎn)了180度的,所以對其中一個取反,保證輸出極性一致
  216.                 Encoder_right=Read_Encoder(4);
  217.                
  218.     /*printf("\r\n---------加速度X軸原始數(shù)據(jù)---------%d \r\n",Accel_X);
  219.                 printf("\r\n---------加速度Y軸原始數(shù)據(jù)---------%d \r\n",Accel_Y);        
  220.                 printf("\r\n---------加速度Z軸原始數(shù)據(jù)---------%d \r\n",Accel_Z);        
  221.                 printf("\r\n---------陀螺儀X軸原始數(shù)據(jù)---------%d \r\n",Gyro_X);        
  222.                 printf("\r\n---------陀螺儀Y軸原始數(shù)據(jù)---------%d \r\n",Gyro_Y);        
  223.                 printf("\r\n---------陀螺儀Z軸原始數(shù)據(jù)---------%d \r\n",Gyro_Z);*/
  224.                 //delay_ms(500);
  225.         
  226.                  if(Gyro_Y>32768)  Gyro_Y-=65536;                       //數(shù)據(jù)類型轉(zhuǎn)換  也可通過short強制類型轉(zhuǎn)換
  227.                         if(Gyro_Z>32768)  Gyro_Z-=65536;                       //數(shù)據(jù)類型轉(zhuǎn)換
  228.                   if(Accel_X>32768) Accel_X-=65536;                      //數(shù)據(jù)類型轉(zhuǎn)換
  229.                   if(Accel_Z>32768) Accel_Z-=65536;                      //數(shù)據(jù)類型轉(zhuǎn)換
  230.                         Gyro_Balance=-Gyro_Y;                                  //更新平衡角速度
  231.                    Accel_Y=atan2(Accel_X,Accel_Z)*180/PI;                 //計算傾角        
  232.                   Gyro_Y =Gyro_Y/16.4;                                    //陀螺儀量程轉(zhuǎn)換        
  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;                                      //更新轉(zhuǎn)向角速度
  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黑下載附件…………
復(fù)制代碼

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


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

使用道具 舉報

沙發(fā)
ID:217957 發(fā)表于 2018-1-6 14:54 | 只看該作者
資料不錯,參考一下
回復(fù)

使用道具 舉報

板凳
ID:128321 發(fā)表于 2018-3-21 21:37 來自手機 | 只看該作者
mfc20010 發(fā)表于 2018-1-6 14:54
資料不錯,參考一下

資料不錯,參考一下
回復(fù)

使用道具 舉報

地板
ID:237206 發(fā)表于 2018-3-25 20:13 | 只看該作者
支持一下
回復(fù)

使用道具 舉報

5#
ID:290380 發(fā)表于 2018-5-3 21:18 | 只看該作者

資料不錯,參考一下,支持一下
回復(fù)

使用道具 舉報

6#
ID:323802 發(fā)表于 2018-5-6 21:52 | 只看該作者
資料不錯哦
回復(fù)

使用道具 舉報

7#
ID:329263 發(fā)表于 2018-5-14 01:48 | 只看該作者
可以把附件發(fā)給我嘛,676913753@qq.com沒有幣很難受
回復(fù)

使用道具 舉報

8#
ID:320612 發(fā)表于 2018-5-22 15:55 | 只看該作者
資料不錯,參考一下,支持一下
回復(fù)

使用道具 舉報

9#
ID:337376 發(fā)表于 2018-6-5 17:21 | 只看該作者
很好的算法,謝謝分享
回復(fù)

使用道具 舉報

10#
ID:320161 發(fā)表于 2018-6-9 23:44 | 只看該作者
不能用騙人的!
回復(fù)

使用道具 舉報

11#
ID:368329 發(fā)表于 2018-7-9 23:43 | 只看該作者


資料不錯,參考一下,支持一下
回復(fù)

使用道具 舉報

12#
ID:158903 發(fā)表于 2018-7-10 16:10 | 只看該作者
資料不錯,參考一下,支持一下
馬克
回復(fù)

使用道具 舉報

13#
ID:370943 發(fā)表于 2018-9-26 15:33 | 只看該作者
學習大神的作品
回復(fù)

使用道具 舉報

14#
ID:248291 發(fā)表于 2018-9-29 22:46 來自手機 | 只看該作者
學習一下
回復(fù)

使用道具 舉報

15#
ID:387286 發(fā)表于 2018-11-5 19:52 | 只看該作者
不能用,代碼不全
回復(fù)

使用道具 舉報

16#
ID:502704 發(fā)表于 2019-4-2 18:47 | 只看該作者
資料不錯,參考一下
回復(fù)

使用道具 舉報

17#
ID:442220 發(fā)表于 2019-7-29 19:42 | 只看該作者
學習了,最近急需這些
回復(fù)

使用道具 舉報

18#
ID:267330 發(fā)表于 2019-7-30 08:58 | 只看該作者
謝謝正是我需要的
回復(fù)

使用道具 舉報

19#
ID:421308 發(fā)表于 2019-8-2 08:54 | 只看該作者
資料不錯,學習下
回復(fù)

使用道具 舉報

20#
ID:588621 發(fā)表于 2019-8-2 15:29 來自手機 | 只看該作者
厲害哦咯可以用下
回復(fù)

使用道具 舉報

21#
ID:443082 發(fā)表于 2020-6-4 23:54 | 只看該作者
資料不錯,可以放到stm32f103c8t6上使用并且成功輸出。感謝分享。
回復(fù)

使用道具 舉報

22#
ID:369024 發(fā)表于 2020-6-7 12:27 | 只看該作者
   沒有姿態(tài)結(jié)算
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩一级黄色片 | 波多野结衣先锋影音 | 午夜免费视频 | 日韩网站在线 | 成人网av| 亚洲精品一区二区三区中文字幕 | 国产综合精品 | 在线观看视频一区 | 成年人在线观看视频 | 极品销魂美女一区二区 | 日韩欧美三区 | 精品国产欧美一区二区 | 国产91视频免费 | av黄色免费 | 国产不卡在线观看 | 成人精品一区亚洲午夜久久久 | 亚洲精品日韩视频 | 一区二区三区视频在线观看 | 福利精品 | 香蕉久久久 | 天天射视频 | 国产精品一区2区 | 日韩一二三区 | 精品无码三级在线观看视频 | 可以看黄的视频 | 久热9| 日日摸夜夜添夜夜添精品视频 | 亚洲黄色成人网 | 亚洲免费视频一区 | 日韩成人在线网站 | 人人做人人澡人人爽欧美 | 国产美女精品视频 | 日本在线观看网址 | 69精品久久久久久 | 亚洲精选一区二区 | 亚洲三区在线观看 | 99免费精品视频 | a级黄色毛片免费播放视频 国产精品视频在线观看 | 99久久精品免费看国产免费软件 | 久久久久久一区 | 在线免费观看日本 |