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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stm32f103rct6卡爾曼濾波源碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:323149 發(fā)表于 2018-5-5 23:00 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
卡爾曼濾波源碼
以stm32f103rct6為例
測試串口通信數(shù)據(jù)
MPU數(shù)據(jù)進(jìn)行處理
檢測X軸加速度,Y軸角速度
參考網(wǎng)上例程

單片機(jī)源程序如下:
  1. #include "stm32f10x.h"
  2. #include <stdio.h>
  3. #include "delay.h"
  4. #include "sys.h"
  5. #include "Usart.h"
  6. #include "MPU6050.h"
  7. //******角度參數(shù)************
  8. float Gyro_y;        //Y軸陀螺儀數(shù)據(jù)暫存
  9. float Angle_gy;      //由角速度計(jì)算的傾斜角度
  10. float Accel_x;             //X軸加速度值暫存
  11. float Angle_ax;      //由加速度計(jì)算的傾斜角度
  12. float Angle;         //最終測量角度
  13. void TIM2_Configuration(void)
  14. {
  15.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;//定義一個(gè)定時(shí)器結(jié)構(gòu)體變量

  16.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能定時(shí)器2
  17.   
  18.   TIM_TimeBaseStructure.TIM_Period = (10000 - 1);        //計(jì)數(shù)100次,因?yàn)閺?開始,所以減1
  19.   TIM_TimeBaseStructure.TIM_Prescaler = (72 - 1);        //時(shí)鐘72分頻,因?yàn)?不分頻,所以減1
  20.   TIM_TimeBaseStructure.TIM_ClockDivision = 0;        // 使用的采樣頻率之間的分頻比例
  21.    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;        //向上計(jì)數(shù)
  22.   TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);        //初始化定時(shí)器2

  23.   TIM_ClearITPendingBit(TIM2, TIM_IT_Update);                //清除定時(shí)器2中斷標(biāo)志位
  24.   TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);                //打開定時(shí)器2中斷

  25.   TIM_Cmd(TIM2, ENABLE);  //計(jì)數(shù)器使能,開始計(jì)數(shù)
  26. }

  27. void NVIC_Configuration(void)
  28. {
  29.   NVIC_InitTypeDef NVIC_InitStructure;
  30.   
  31.   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000);
  32.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

  33. /********************注冊定時(shí)器2中斷處理函數(shù)***********************/

  34.   NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  35.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  36.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  37.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  38.   NVIC_Init(&NVIC_InitStructure);

  39. /******************注冊串口1中斷服務(wù)函數(shù)************************/
  40.         NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//配置串口中斷
  41.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//占先式優(yōu)先級設(shè)置為0
  42.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //副優(yōu)先級設(shè)置為0
  43.         NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;//中斷禁止
  44.         NVIC_Init(&NVIC_InitStructure);//中斷初始化


  45. }

  46. /*************卡爾曼濾波*********************************/
  47. void Kalman_Filter(float Accel,float Gyro)               
  48. {
  49.                
  50.         static const float Q_angle=0.001;  
  51.         static const float Q_gyro=0.003;
  52.         static const float R_angle=0.5;
  53.         static const float dt=0.01;                          //dt為kalman濾波器采樣時(shí)間;
  54.         static const char  C_0 = 1;
  55.         static float Q_bias, Angle_err;
  56.         static float PCt_0, PCt_1, E;
  57.         static float K_0, K_1, t_0, t_1;
  58.         static float Pdot[4] ={0,0,0,0};
  59.         static float PP[2][2] = { { 1, 0 },{ 0, 1 } };
  60.        
  61.         Angle+=(Gyro - Q_bias) * dt; //先驗(yàn)估計(jì)

  62.         Pdot[0]=Q_angle - PP[0][1] - PP[1][0]; // Pk-先驗(yàn)估計(jì)誤差協(xié)方差的微分

  63.         Pdot[1]= -PP[1][1];
  64.         Pdot[2]= -PP[1][1];
  65.         Pdot[3]=Q_gyro;
  66.        
  67.         PP[0][0] += Pdot[0] * dt;   // Pk-先驗(yàn)估計(jì)誤差協(xié)方差微分的積分
  68.         PP[0][1] += Pdot[1] * dt;   // =先驗(yàn)估計(jì)誤差協(xié)方差
  69.         PP[1][0] += Pdot[2] * dt;
  70.         PP[1][1] += Pdot[3] * dt;
  71.                
  72.         Angle_err = Accel - Angle;        //zk-先驗(yàn)估計(jì)
  73.        
  74.         PCt_0 = C_0 * PP[0][0];
  75.         PCt_1 = C_0 * PP[1][0];
  76.        
  77.         E = R_angle + C_0 * PCt_0;
  78.        
  79.         K_0 = PCt_0 / E;
  80.         K_1 = PCt_1 / E;
  81.        
  82.         t_0 = PCt_0;
  83.         t_1 = C_0 * PP[0][1];

  84.         PP[0][0] -= K_0 * t_0;                 //后驗(yàn)估計(jì)誤差協(xié)方差
  85.         PP[0][1] -= K_0 * t_1;
  86.         PP[1][0] -= K_1 * t_0;
  87.         PP[1][1] -= K_1 * t_1;
  88.                
  89.         Angle        += K_0 * Angle_err;         //后驗(yàn)估計(jì)
  90.         Q_bias        += K_1 * Angle_err;         //后驗(yàn)估計(jì)
  91.         Gyro_y   = Gyro - Q_bias;         //輸出值(后驗(yàn)估計(jì))的微分=角速度
  92. }
  93. void Angle_Calculate(void)
  94. {
  95.         static        uint8_t DataBuffer[2];        //數(shù)據(jù)緩存
  96. /****************************加速度****************************************/
  97.         I2C_ReadBuffer(DataBuffer, ACCEL_XOUT_H, 2);
  98.         Accel_x  = (short)((DataBuffer[0]<<8)+DataBuffer[1]);          //讀取X軸加速度
  99.         Angle_ax = (Accel_x +220) /16384;   //去除零點(diǎn)偏移,計(jì)算得到角度(弧度)
  100.         Angle_ax = Angle_ax*1.2*180/3.14;     //弧度轉(zhuǎn)換為度,

  101. /****************************角速度****************************************/
  102.         I2C_ReadBuffer(DataBuffer, GYRO_YOUT_H, 2);
  103.         Gyro_y = (short)((DataBuffer[0]<<8)+DataBuffer[1]);              //靜止時(shí)角速度Y軸輸出為-18左右
  104.         Gyro_y = (Gyro_y + 18)/16.4;         //去除零點(diǎn)偏移,計(jì)算角速度值
  105. //                Angle_gy = Angle_gy + Gyro_y*0.01;  //角速度積分得到傾斜角度.       

  106. /***************************卡爾曼濾波+角度融合*************************************/
  107.         Kalman_Filter(Angle_ax,Gyro_y);       //卡爾曼濾波計(jì)算傾角

  108. /*******************************互補(bǔ)濾波******************************************/

  109. /*補(bǔ)償原理是取當(dāng)前傾角和加速度獲
  110.         得傾角差值進(jìn)行放大,然后與陀螺
  111.         儀角速度疊加后再積分,從而使傾
  112.         角最跟蹤為加速度獲得的角度0.5
  113.         為放大倍數(shù),可調(diào)節(jié)補(bǔ)償度;
  114.         0.01為系統(tǒng)周期10ms       
  115. */       
  116. //        Angle = Angle + (((Angle_ax-Angle)*0.5 + Gyro_y)*0.01);*/
  117.                                                                                                                                          
  118. }
  119. int main(void)
  120. {
  121.         Stm32_Clock_Init(6);//系統(tǒng)時(shí)鐘設(shè)置為外部晶振,9倍頻
  122.         delay_init(72);//系統(tǒng)SysTick初始化
  123.         Usart_Configuration();
  124.         TIM2_Configuration();
  125.         NVIC_Configuration();
  126.         I2C_Congiguration();
  127.         MPU6050_Init();
  128.         while (1)
  129.         {
  130.                 printf("%f        %f        ",Angle,Gyro_y);
  131.                 USART1_Send_Enter();       
  132.                 delay_ms(100);
  133.         }
  134. }
  135. /****************定時(shí)器2中斷服務(wù)函數(shù)***************************************/
  136. void TIM2_IRQHandler(void)
  137. {
  138.         if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
  139.   {
  140.                 TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
  141.                 Angle_Calculate();
  142.         }
  143. }
復(fù)制代碼

所有資料51hei提供下載:
卡爾曼濾波.rar (427.33 KB, 下載次數(shù): 68)


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

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲激情在线观看 | 欧美一区二区免费在线 | 久久久国产精品一区 | 欧美日日 | 成人亚洲精品久久久久软件 | 精品国产乱码久久久久久蜜柚 | 精品乱码一区二区三四区视频 | 久久精品91久久久久久再现 | 91在线播| 精品久久久久一区二区国产 | 不卡一区 | 男人av在线| 成人性视频免费网站 | 麻豆av一区二区三区久久 | 久久久.com | 久久精品91久久久久久再现 | 日韩精品在线观看免费 | 在线观看中文字幕dvd播放 | 91视频a | 欧美理论片在线观看 | 国产精品中文字幕在线 | 精品国产成人 | 成人h视频在线 | 久久久青草婷婷精品综合日韩 | 日本黄色片免费在线观看 | 日本久久久久久 | 国产99免费| 中文字幕亚洲精品在线观看 | 91在线精品视频 | 欧美精品在线免费观看 | 亚洲综合在线一区二区 | 国产精品久久久久久久免费观看 | 激情91| 国产资源在线视频 | 精品国产乱码久久久久久丨区2区 | 欧美日韩在线一区 | 亚洲高清视频一区二区 | 亚洲成人免费在线观看 | 欧美日韩一区不卡 | 久草网址 | 日韩一区二 |