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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

STM32自平衡小車源代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
平衡小車代碼

全部源碼下載:
STM32自平衡小車源代碼.7z (231.18 KB, 下載次數(shù): 100)


部分代碼預(yù)覽:
  1. #include "stm32f10x.h"
  2. #include "MPU6050.h"
  3. #include "motor.h"
  4. #include "control.h"
  5. #include <math.h>
  6. //******角度參數(shù)************

  7. float Gyro_y;        //Y軸陀螺儀數(shù)據(jù)暫存
  8. float Angle_gy;      //由角速度計(jì)算的傾斜角度
  9. float Accel_x;             //X軸加速度值暫存
  10. float Angle_ax;      //由加速度計(jì)算的傾斜角度
  11. float Angle;         //小車最終傾斜角度

  12. //******PWM參數(shù)*************

  13. int   speed_mr;                 //右電機(jī)轉(zhuǎn)速
  14. int   speed_ml;                 //左電機(jī)轉(zhuǎn)速
  15. float PWM;           //綜合PWM計(jì)算
  16. //******電機(jī)參數(shù)*************

  17. float speed_r_l;        //電機(jī)轉(zhuǎn)速
  18. float speed;        //電機(jī)轉(zhuǎn)速濾波
  19. //******卡爾曼參數(shù)************
  20.                
  21. const float Q_angle=0.001;  
  22. const float Q_gyro=0.003;
  23. const float R_angle=0.5;
  24. const float dt=0.01;                          //dt為kalman濾波器采樣時(shí)間;
  25. const char  C_0 = 1;
  26. float Q_bias, Angle_err;
  27. float PCt_0, PCt_1, E;
  28. float K_0, K_1, t_0, t_1;
  29. float Pdot[4] ={0,0,0,0};
  30. float PP[2][2] = { { 1, 0 },{ 0, 1 } };

  31. static const float Kp  = 35.0;                                //PID參數(shù)
  32. static const float Kd  = 2.5;                                        //PID參數(shù)
  33. static const float Ksp = 10.0;                                //PID參數(shù)

  34. void TIM4_Configuration(void)
  35. {
  36.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;//定義一個(gè)定時(shí)器結(jié)構(gòu)體變量

  37.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);//使能定時(shí)器4
  38.   
  39.   TIM_TimeBaseStructure.TIM_Period = (10000 - 1);        //計(jì)數(shù)10000次,因?yàn)閺?開始,所以減1
  40.   TIM_TimeBaseStructure.TIM_Prescaler = (72 - 1);        //時(shí)鐘72分頻,因?yàn)?不分頻,所以減1
  41.   TIM_TimeBaseStructure.TIM_ClockDivision = 0;        // 使用的采樣頻率之間的分頻比例
  42.    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;        //向上計(jì)數(shù)
  43.   TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);        //初始化定時(shí)器4

  44.   TIM_ClearITPendingBit(TIM4, TIM_IT_Update);                //清除定時(shí)器4中斷標(biāo)志位
  45.   TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);                //打開定時(shí)器4中斷

  46.   TIM_Cmd(TIM4, ENABLE);  //計(jì)數(shù)器使能,開始計(jì)數(shù)
  47. }

  48. void NVIC_Configuration(void)
  49. {
  50.   NVIC_InitTypeDef NVIC_InitStructure;
  51.   
  52.   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000);
  53.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

  54. /********************注冊(cè)定時(shí)器4中斷處理函數(shù)***********************/

  55.   NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
  56.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  57.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  58.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  59.   NVIC_Init(&NVIC_InitStructure);

  60. /******************注冊(cè)串口1中斷服務(wù)函數(shù)************************/
  61.         NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//配置串口中斷
  62.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//占先式優(yōu)先級(jí)設(shè)置為0
  63.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //副優(yōu)先級(jí)設(shè)置為0
  64.         NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;//中斷禁止
  65.         NVIC_Init(&NVIC_InitStructure);//中斷初始化


  66. }
  67. void Control_Init(void)
  68. {
  69.         TIM4_Configuration();
  70.         NVIC_Configuration();
  71. }
  72. /****************定時(shí)器4中斷服務(wù)函數(shù)***************************************/
  73. void TIM4_IRQHandler(void)
  74. {
  75.         if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
  76.   {
  77.                 TIM_ClearITPendingBit(TIM4, TIM_IT_Update);

  78.                 Angle_Calculate();// 車體傾角計(jì)算
  79.                 Speed_Calculate();//車速計(jì)算
  80.                 PWM_Calculate();//電機(jī)PWM值計(jì)算
  81.                 Motor_Control(PWM);//調(diào)節(jié)電機(jī)參數(shù)

  82.         }
  83. }

  84. /*****************卡爾曼濾波**************************************************/
  85. void Kalman_Filter(float Accel,float Gyro)               
  86. {
  87.         Angle+=(Gyro - Q_bias) * dt; //先驗(yàn)估計(jì)
  88.         
  89.         Pdot[0]=Q_angle - PP[0][1] - PP[1][0]; // Pk-先驗(yàn)估計(jì)誤差協(xié)方差的微分

  90.         Pdot[1]= -PP[1][1];
  91.         Pdot[2]= -PP[1][1];
  92.         Pdot[3]=Q_gyro;
  93.         
  94.         PP[0][0] += Pdot[0] * dt;   // Pk-先驗(yàn)估計(jì)誤差協(xié)方差微分的積分
  95.         PP[0][1] += Pdot[1] * dt;   // =先驗(yàn)估計(jì)誤差協(xié)方差
  96.         PP[1][0] += Pdot[2] * dt;
  97.         PP[1][1] += Pdot[3] * dt;
  98.                
  99.         Angle_err = Accel - Angle;        //zk-先驗(yàn)估計(jì)
  100.         
  101.         PCt_0 = C_0 * PP[0][0];
  102.         PCt_1 = C_0 * PP[1][0];
  103.         
  104.         E = R_angle + C_0 * PCt_0;
  105.         
  106.         K_0 = PCt_0 / E;
  107.         K_1 = PCt_1 / E;
  108.         
  109.         t_0 = PCt_0;
  110.         t_1 = C_0 * PP[0][1];

  111.         PP[0][0] -= K_0 * t_0;                 //后驗(yàn)估計(jì)誤差協(xié)方差
  112.         PP[0][1] -= K_0 * t_1;
  113.         PP[1][0] -= K_1 * t_0;
  114.         PP[1][1] -= K_1 * t_1;
  115.                
  116.         Angle        += K_0 * Angle_err;         //后驗(yàn)估計(jì)
  117.         Q_bias        += K_1 * Angle_err;         //后驗(yàn)估計(jì)
  118.         Gyro_y   = Gyro - Q_bias;         //輸出值(后驗(yàn)估計(jì))的微分=角速度

  119. }
  120. void Angle_Calculate(void)
  121. {
  122.         static        uint8_t DataBuffer[2];        //數(shù)據(jù)緩存

  123. /****************************加速度****************************************/
  124.         I2C_ReadBuffer(DataBuffer, ACCEL_XOUT_H, 2);
  125.         Accel_x  = (short)((DataBuffer[0]<<8)+DataBuffer[1]);          //讀取X軸加速度
  126.         Angle_ax = (Accel_x +220) /16384;   //去除零點(diǎn)偏移,計(jì)算得到角度(弧度)
  127.         Angle_ax = Angle_ax*1.2*180/3.14;     //弧度轉(zhuǎn)換為度,

  128. /****************************角速度****************************************/
  129.         I2C_ReadBuffer(DataBuffer, GYRO_YOUT_H, 2);
  130.         Gyro_y = (short)((DataBuffer[0]<<8)+DataBuffer[1]);              //靜止時(shí)角速度Y軸輸出為-18左右
  131.         Gyro_y = (Gyro_y + 18)/16.4;         //去除零點(diǎn)偏移,計(jì)算角速度值
  132.         //Angle_gy = Angle_gy + Gyro_y*0.01;  //角速度積分得到傾斜角度,因?yàn)榭柭?jì)算帶有時(shí)間dt,所以此處不用積分

  133. /***************************卡爾曼融合*************************************/
  134.         Kalman_Filter(Angle_ax,Gyro_y);       //卡爾曼濾波計(jì)算傾角
  135.         
  136. /****************************互補(bǔ)濾波****************************************/

  137.         /***補(bǔ)償原理是取當(dāng)前傾角和加速度獲得傾角差值進(jìn)行放大,然后與
  138. ****陀螺儀角速度疊加后再積分,從而使傾角最跟蹤為加速度獲得的
  139. ****角度 0.5為放大倍數(shù),可調(diào)節(jié)補(bǔ)償度;0.01為系統(tǒng)周期10ms        
  140. *************************************************************/

  141. //        Angle = Angle + (((Angle_ax-Angle)*0.5 + Gyro_y)*0.01);                //因?yàn)榧踊虿患哟苏Z(yǔ)句處理效果一樣,故省略,原因搞不清楚。。。

  142. }
  143. void Speed_Calculate(void)
  144. {
  145.                 speed_mr=TIM_GetCounter(TIM2)-0x7fff;
  146.                 speed_ml=TIM_GetCounter(TIM3)-0x7fff;                //讀取編碼器寄存器計(jì)數(shù)值,并減去中間值,得到速度矢量
  147.                 TIM_SetCounter(TIM2, 0x7fff);
  148.                 TIM_SetCounter(TIM3, 0x7fff);                                                //重置編碼器計(jì)數(shù)值

  149.                 speed_r_l =(speed_mr + speed_ml)*0.5;
  150.                 speed *= 0.7;                                                          //車輪速度濾波
  151.                 speed += speed_r_l*0.3;        
  152.         
  153. }
  154. void PWM_Calculate(void)
  155. {
  156.                 if(Angle<-40||Angle>40)                //傾角過(guò)大就關(guān)閉電機(jī),進(jìn)入死循環(huán),直到復(fù)位
  157.                 {
  158.                         Motor_Stop();
  159.                         while(1);
  160.                 }               
  161.                 PWM  = (short)(Kp*Angle + Kd*Gyro_y);          //PID:角速度和角度調(diào)節(jié)
  162.                  PWM += Ksp*speed;                                                                                                      //PID:車速度調(diào)節(jié)
  163. }
復(fù)制代碼


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:187303 發(fā)表于 2017-4-24 08:35 | 只看該作者
平衡車的代碼夠復(fù)雜的 初學(xué)者就不用考慮了
回復(fù)

使用道具 舉報(bào)

板凳
ID:258573 發(fā)表于 2017-12-7 12:17 | 只看該作者
沒錢下載啊。
回復(fù)

使用道具 舉報(bào)

地板
ID:87193 發(fā)表于 2017-12-7 14:51 | 只看該作者
只有代碼嗎
回復(fù)

使用道具 舉報(bào)

5#
ID:250019 發(fā)表于 2017-12-11 13:35 | 只看該作者
有人可以說(shuō)一下有原理圖嗎?
回復(fù)

使用道具 舉報(bào)

6#
ID:215629 發(fā)表于 2018-5-17 16:41 | 只看該作者
濾波原理
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 99精品久久99久久久久 | 国产精品99 | 欧美国产视频 | 999www视频免费观看 | 欧美在线一区二区三区四区 | 国产色婷婷精品综合在线播放 | 欧美在线色 | 一区二区在线观看av | 国产成人网 | 盗摄精品av一区二区三区 | 亚洲免费一区 | 一区二区免费在线观看 | 国产在线观看网站 | 日韩精品在线视频免费观看 | 国产在线观看一区二区三区 | 一级黄片一级毛片 | 91视频三区 | 午夜精品一区二区三区在线视频 | 国产一级在线观看 | 免费在线观看一区二区 | 黄色毛片在线观看 | 免费看黄色视屏 | 久久蜜桃资源一区二区老牛 | 国产伦精品一区二区三区照片91 | 欧美国产一区二区 | 欧美.com| 亚洲男人天堂av | 在线观看视频福利 | 精品av天堂毛片久久久借种 | 岛国av免费观看 | 国产精品国产精品国产专区不卡 | 成人午夜激情 | 91看片| 视频精品一区 | 亚洲天堂999| 欧美成人激情视频 | 91影视| 亚洲国产欧美在线人成 | 亚洲视频免费 | 最近日韩中文字幕 | 二区欧美 |