wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6965|回復: 4
打印 上一主題 下一主題
收起左側

PID控制 卡爾曼濾波設計實現STM32單片機自平衡小車設計源碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:365793 發表于 2018-7-5 18:30 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
基于單片機平衡車設置
PID控制  卡爾曼濾波設計實現自平衡小車設計

單片機源程序如下:
  1. #include "sys.h"
  2. #include "usart.h"               
  3. //#include "delay.h"        

  4. // 編碼器:100線;電機減速比:150

  5. #include "ofme_led.h"


  6. #include "ofme_filter.h"
  7. #include "ofme_iic.h"
  8. #include "ofme_iic_dev.h"
  9. #include "ofme_pwm.h"
  10. #include "ofme_pid.h"
  11. #include "ofme_encoder.h"
  12. #include "ofme_io.h"
  13. #include "ofme_time.h"
  14. #include "ofme_ir_nec.h"

  15. #define PI (3.14159265)
  16. // 度數表示的角速度*1000
  17. #define MDPS (70)
  18. // 弧度表示的角速度
  19. #define RADPS ((float)MDPS*PI/180000)
  20. // 每個查詢周期改變的角度
  21. #define RADPT (RADPS/(-100))


  22. // 平衡的角度范圍;+-60度(由于角度計算采用一階展開,實際值約為46度)
  23. #define ANGLE_RANGE_MAX (60*PI/180)
  24. #define ANGLE_RANGE_MIN (-60*PI/180)

  25. // 全局變量
  26. pid_s sPID;                                        // PID控制參數結構體
  27. float radian_filted=0;                // 濾波后的弧度
  28. accelerometer_s acc;                // 加速度結構體,包含3維變量
  29. gyroscope_s gyr;                        // 角速度結構體,包含3維變量
  30. int speed=0, distance=0;        // 小車移動的速度,距離
  31. int tick_flag = 0;                        // 定時中斷標志
  32. int pwm_speed = 0;                        // 電機pwm控制的偏置值,兩個電機的大小、正負相同,使小車以一定的速度前進
  33. int pwm_turn = 0;                        // 電機pwm控制的差異值,兩個電機的大小相同,正負相反,使小車左、右轉向
  34. float angle_balance = 0;        // 小車的平衡角度。由于小車重心的偏移,小車的平衡角度不一定是radian_filted為零的時候


  35. // 定時器周期中斷,10ms
  36. void sys_tick_proc(void)
  37. {
  38.         static unsigned int i = 0;

  39.         tick_flag++;

  40.         i++;
  41.         if(i>=100) i=0;

  42.         if(i==0)                   // 綠燈的閃爍周期為1秒
  43.         {
  44.                 LED1_OFF();
  45.         }
  46.         else if(i==50)
  47.         {
  48.                 LED1_ON();
  49.         }
  50. }

  51. void control_proc(void)
  52. {
  53.         int i = ir_key_proc(); // 將紅外接收到的按鍵值,轉換為小車控制的相應按鍵值。

  54.         switch(i)
  55.         {
  56.                 case KEY_TURN_LEFT:
  57.                         if(pwm_turn<500) pwm_turn += 50;
  58.                         break;
  59.                 case KEY_TURN_RIGHT:
  60.                         if(pwm_turn>-500) pwm_turn -= 50;
  61.                         break;
  62.                 case KEY_TURN_STOP:
  63.                         pwm_turn = 0;
  64.                         distance = 0;
  65.                         pwm_speed = 0;
  66.                         break;
  67.                 case KEY_SPEED_UP:
  68.                         if(pwm_speed<500) pwm_speed+=100;
  69.                         break;
  70.                 case KEY_SPEED_DOWN:
  71.                         if(pwm_speed>-500) pwm_speed-=100;
  72.                         break;
  73.                 case KEY_SPEED_0:
  74.                         pwm_speed = 0;
  75.                         break;
  76.                 case KEY_SPEED_F1:
  77.                         pwm_speed = 150;
  78.                         break;
  79.                 case KEY_SPEED_F2:
  80.                         pwm_speed = 300;
  81.                         break;
  82.                 case KEY_SPEED_F3:
  83.                         pwm_speed = 450;
  84.                         break;
  85.                 case KEY_SPEED_F4:
  86.                         pwm_speed = 600;
  87.                         break;
  88.                 case KEY_SPEED_F5:
  89.                         pwm_speed = 750;
  90.                         break;
  91.                 case KEY_SPEED_F6:
  92.                         pwm_speed = 900;
  93.                         break;
  94.                 case KEY_SPEED_B1:
  95.                         pwm_speed = -150;
  96.                 case KEY_SPEED_B2:
  97.                         pwm_speed = -300;
  98.                 case KEY_SPEED_B3:
  99.                         pwm_speed = -450;
  100.                         break;
  101.                 default:
  102.                         break;
  103.         }

  104.         pwm_turn *= 0.9;        // pwm_turn的值以0.9的比例衰減,使小車在接收到一個轉向信號后只轉動一定的時間后停止轉動。


  105.         speed = speed*0.7 +0.3*(encoder_read());        // 定周期(10ms)讀取編碼器數值得到實時速度,再對速度進行平滑濾波
  106.          if(speed!=0)
  107.         {
  108.                 printf("speed: %d, dst: %d, pwm: %d \r\n", speed,distance,(int)(speed*6+distance*0.1));
  109.         }



  110.         encoder_write(0);                                                        // 編碼器值重新設為0

  111.         distance += speed;                                                        // 對速度進行積分,得到移動距離

  112.         if(distance>6000) distance = 6000;                        // 減少小車懸空、空轉對控制的影響
  113.         else if(distance<-6000) distance = -6000;

  114. }

  115. void balance_proc(void)
  116. {
  117.         static unsigned int err_cnt=0;

  118. //        float tFloat;
  119.         int pwm_balance;
  120. //        static float angle;
  121. //        float angle_t;
  122.         float radian, radian_pt;          // 當前弧度及弧度的微分(角速度,角度值用弧度表示)

  123.         adxl345_read(&acc);                        // 讀取當前加速度。由于傳感器按照的位置原因,傳感器的值在函數內部經過處理,變為小車的虛擬坐標系。
  124.         l3g4200d_read(&gyr);                // 讀取當前角速度。同樣經過坐標系變換。


  125. // 此段程序用于傳感器出錯時停止小車
  126.         err_cnt = err_cnt*115>>7;        // err_cnt以0.9的比例系數衰減(115>>7的值約為0.9,避免浮點數,提高速度)
  127.         if(acc.flag != 0x0F || gyr.flag != 0x0F)   // 讀取的角度、角速度值有誤。可能是電磁干擾、iic線太長等導致出錯。
  128.         {
  129.                 LED0_ON();                // 亮紅燈
  130.                 err_cnt +=100;        // 等比數列,比例系數0.9(115>>7),常數項100;根據公式,連續10項的和約為657
  131.                 if(err_cnt>657) goto err;        // 當連續發生約10次(約0.1秒)錯誤則超過657而溢出。
  132.         }


  133. // 此段程序用于倒立或失重時停止小車
  134.         if(acc.z<=0)
  135.         {
  136.                 goto err;
  137.         }


  138. // 小車的虛擬x軸方向為小車前進方向,虛擬y軸為小車左邊,虛擬z軸為小車上升方向。
  139. // 前傾角度為負,后傾角度為正。
  140.         // 通過計算加速度分量,得到小車傾斜弧度(未濾波)
  141.         radian = (float)(acc.x)/acc.z;        //  一階展開:Q =f(x)=x-x^3/3+x^5/5+...+(-1)^k*x^(2k+1)/(2k+1)+...
  142.         // 通過角速度傳感器,得到小車的角速度(單位為 弧度/秒)
  143.         radian_pt = gyr.y*RADPT;
  144.         radian_filted = ofme_filter(radian_filted, radian, radian_pt);                // 互補濾波得到小車的傾斜角度

  145. // 此段程序用于小車傾斜角度過大時,停止小車
  146.         if(radian_filted> ANGLE_RANGE_MAX || radian_filted<ANGLE_RANGE_MIN)
  147.         {
  148.                 goto err;
  149.         }

  150. // 通過PID計算,得到保持小車角度為零所需要的電機pwm輸出
  151.         pwm_balance = pid_proc(&sPID, radian_filted, radian_pt);
  152.         //        printf("%d\r\n",speed);
  153. // 通過小車移動速度與移動距離,調整小車平衡所需的pwm輸出
  154.         pwm_balance += (speed*6+distance*0.1);

  155. // 在pwm_balance的基礎上,加上速度分量與轉動分量,調整小車兩個電機的轉速。
  156.         pwm_control(pwm_balance+pwm_speed+pwm_turn, pwm_balance+pwm_speed-pwm_turn);

  157. // 如果pwm超出有效值,紅燈亮。用于調試,了解系統狀態。
  158.         if(pwm_balance>=1000||pwm_balance<=-1000) LED1_ON();
  159.         LED0_OFF();
  160.         return;
  161. err:
  162.         puts("balance error.\r\n");
  163.         pwm_control(0, 0);                                   // 關閉電機
  164.         return;
  165. }


  166. int main(void)
  167. {
  168. //        int i=0, t;
  169. //        int pwm;
  170. //        float radian, radian_pt;

  171.           Stm32_Clock_Init(9);//系統時鐘設置
  172.         uart_init(72,57600); //串口1初始化   
  173.         hw_tick_start();   // 定時器周期性中斷,用于提供系統脈搏
  174. ////////////////////////////////////////////////////////////////////////////////
  175.         led_init();
  176.         pwm_init();
  177.         iic_init();
  178.         adxl345_init(&acc);
  179.         l3g4200d_init(&gyr);
  180.         hw_ir_init();
  181.         encoder_init();
  182.         while(0)
  183.         {
  184.                 if(tick_flag>100)
  185.                 {
  186.                         tick_flag = 0;
  187.                         printf("count: %d\r\n",encoder_read());

  188.                 }
  189.         }



  190. ////////////////////////////////////////////////////////////////////////////////
  191. //        pid_init(&sPID, 4500,0,-300);6000--350        ;8000--350;11000--350;
  192. //        pid_init(&sPID, 6000,0,-35000);
  193.         pid_init(&sPID, 7500,0,-35000);          // 調節PID參數,后3個形參分別為:比例系數P,積分系數I,微分系數D
  194.         sPID.target = -3.5*PI/180;

  195.         radian_filted = 0;
  196.         adxl345_init(&acc);
  197.         l3g4200d_init(&gyr);
  198.         while(1)
  199.         {
  200.                 if(tick_flag)
  201.                 {
  202.                         tick_flag = 0;
  203.                         balance_proc();        // 調節小車,保持平衡
  204.                         control_proc();        // 根據遙控接收到的數據,調整電機輸出參數
  205.                 }
  206.         }
  207. }

復制代碼

所有資料51hei提供下載:
balance-20130511.rar (287.53 KB, 下載次數: 102)


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

使用道具 舉報

沙發
ID:404223 發表于 2019-1-18 19:54 | 只看該作者
下來看看,怎么樣
回復

使用道具 舉報

板凳
ID:474952 發表于 2019-2-4 15:20 | 只看該作者
終于找了pid算法來穩定電機在某個位置,帖子很棒,研究研究
回復

使用道具 舉報

地板
ID:437392 發表于 2019-2-20 22:08 | 只看該作者
十分不錯.
回復

使用道具 舉報

5#
ID:745708 發表于 2020-5-6 23:46 | 只看該作者
哥,你的程序有的行沒有程序,是空的 為什么
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
色七七影院综合| 国产伦精品一区二区三区88av| 久久精品国产亚洲| 天天亚洲美女在线视频| 免费在线视频一区| 亚洲资源网站| 1区2区在线| 欧美xxxxxxxxx59| 男女交配网站| 草莓视频18免费观看| 亚洲一区二区在线免费| 欧美一区二区三区爽大粗免费| 成人蜜桃视频| 欧美一级大胆视频| 亚洲图片在区色| 欧美又粗又大又爽| 自拍视频在线观看一区二区| 久88久久88久久久| 综合久久综合| 亚洲区小说区图片区qvod按摩| 国产在线美女| 国产乱理伦片a级在线观看| 好吊色免费视频| 亚洲精品乱码电影在线观看| 91黄色在线视频| 青娱乐国产在线| 中文精品在线观看| av中文字幕网址| 国产日韩欧美精品在线观看| 日韩理论片在线观看| 97视频资源在线观看| 青青a在线精品免费观看| 久久精品国产91精品亚洲| 日韩一区二区在线观看| 亚洲第一精品夜夜躁人人爽| 麻豆av免费在线| 蜜臀av一级做a爰片久久| 竹菊久久久久久久| 24小时成人在线视频| 一本色道久久综合无码人妻| 99热6这里只有精品| 91九色蝌蚪porny| 成人3d动漫一区二区三区| 免费成人进口网站| 日本午夜精品一区二区三区| 动漫一区二区在线| 亚洲a一级视频| 国产在线精品成人一区二区三区| 亚洲18私人小影院| 欧美精品videosex牲欧美| 日韩最新在线视频| 最新的欧美黄色| 国产一区二区三区在线视频| 亚洲精品短视频| 精品国产一区二区三区忘忧草| 欧美色图天堂网| 在线观看不卡一区| 色8久久人人97超碰香蕉987| 亚洲成人精品在线观看| 亚洲狠狠爱一区二区三区| 亚洲欧洲日韩综合一区二区| 亚洲欧洲日韩综合一区二区| 一色桃子久久精品亚洲| **欧美大码日韩| 国产精品乱人伦| 综合在线观看色| 亚洲精品国产成人久久av盗摄| 亚洲素人一区二区| 一区二区成人在线| 午夜精品国产更新| 色婷婷久久久久swag精品 | 精品欧美一区二区久久久久| 国产三级在线观看完整版| 人妻精品久久久久中文| 国产又粗又长又硬| 欧美人禽zoz0强交| jizz国产免费| 欧美激情一区二区三区免费观看| 一二三四区在线| www.黄色一片| 四虎永久网址| 亚洲中文字幕无码一区| 97人人模人人爽人人澡| fc2成人免费视频| 日本一卡二卡在线播放| 91久久国产综合| 国产精品二区一区二区aⅴ| 中国一级特黄毛片| 国产永久免费视频| 亚洲三级中文字幕| 999久久久免费精品国产牛牛| 免费h视频网站| av在线天天| 激情小视频在线| 欧美黑人猛交的在线视频| 中文字幕高清在线播放| 久久视频免费| 欧美色爱综合| 亚洲一区二区网站| 国产精品91xxx| 亚洲国产精品v| 欧美日韩亚洲91| 精品久久久久久亚洲综合网 | 亚洲欧洲日产国码二区| 亚洲成人777| 欧美一级片在线| 国产午夜精品免费一区二区三区| 欧美高清激情视频| 国产日韩在线精品av| 欧美精品一区二区视频| www.av毛片| 欧美熟妇精品一区二区| 国产又粗又猛又爽又黄的视频小说| 激情视频在线播放| 国产精品视频一二区| 亚洲精品乱码电影在线观看| 国产真实生活伦对白| 中文字幕在线观看日本| 国精产品一区一区三区四川| 亚洲图区在线| 欧美一区=区| 久久久久国产精品人| 色婷婷久久久久swag精品| 日韩精品免费观看| 国产精品久久久久av| 日本高清视频一区二区三区 | 中文乱码字幕午夜无线观看| wwwxx免费| 成年女人的天堂在线| 在线成人视屏| 日韩www.| 久国产精品韩国三级视频| 国产精品日产欧美久久久久| 欧美日韩黄色影视| 久久九九全国免费精品观看| 亚洲国产wwwccc36天堂| 欧美一二三区在线| 精品中文字幕在线2019| 国产日韩在线看片| 国产成人精品免费看在线播放| 午夜宅男在线视频| 中文字幕av久久爽av| 午夜精品无码一区二区三区 | 免费观看久久av| 日本不卡不码高清免费观看| 亚洲精品乱码久久久久久黑人| 亚洲福利在线播放| 国产成人精品视频在线| 一区高清视频| 高清中文字幕mv的电影| 一级一片免费看| 91电影91视频| 蜜桃视频在线观看www社区 | 永久看看免费大片| 黄色污污网站在线观看| 国产9色视频| 在线播放毛片| 日韩精选在线| 国产成人福利片| 欧美三级日韩在线| 91精品国产高清久久久久久| 一区二区三区电影| 亚洲欧美在线不卡| 成人高潮片免费视频| hbad中文字幕| 超碰这里只有精品| 日韩视频不卡| 亚洲高清免费观看| 久久不射热爱视频精品| 欧美一区二区三区在线播放| 免费在线观看日韩av| 亚洲视频一区二区三区四区| 成人影院在线观看视频| 日韩电影免费观| 日韩午夜av| 亚洲女人小视频在线观看| 亚洲毛片在线观看| 国产偷久久久精品专区| 亚洲麻豆一区二区三区| 国产高清第一页| 中文字幕在线永久在线视频| 综合成人在线| 高清国产午夜精品久久久久久| 欧美日韩国产欧美日美国产精品| 国产精品女主播视频| 国产天堂在线播放| 精品乱码一区内射人妻无码| 国产农村av| 6080成人| 久久奇米777| 国产一区二区三区18| 日韩精品久久久免费观看| 午夜在线观看一区| 国产二级c片l毛片| 亚洲人成午夜免电影费观看| 水野朝阳av一区二区三区| 日韩欧美在线播放| 国产女人精品视频| 女人扒开腿免费视频app| 狠狠躁日日躁夜夜躁av | 久久成人羞羞网站| 欧美一级片在线看| 久久综合婷婷综合| 亚洲无人区码一码二码三码的含义| 欧美性xxxx极品hd欧美| 第一福利在线视频| 人人精品人人爱| 欧美一级电影网站| 亚州欧美一区三区三区在线| www.97视频| 免费的av网址| 国产精品1luya在线播放| 久久蜜桃香蕉精品一区二区三区| 日韩中文字幕在线视频播放| 岛国大片在线播放| 一区二区三区在线免费观看视频 | 在线视频中文字幕第一页| 久久视频精品| 亚洲成人精品在线观看| 国产精品爽爽爽爽爽爽在线观看| 无码人妻aⅴ一区二区三区玉蒲团| 偷拍精品一区二区三区| 男人添女人下部高潮视频在线观看 | av动漫在线播放| 精品人妻无码一区二区性色| 在线国产小视频| 欧美激情麻豆| 6080日韩午夜伦伦午夜伦| 欧美日韩亚洲一区二区三区四区| 国产日韩欧美在线观看视频| 国产黄色免费电影| 婷婷综合久久| 精品视频色一区| 日韩av免费电影| 亚洲天堂男人av| av网站在线播放| 日韩国产成人精品| 国产一区二区三区免费视频| 久久精品香蕉视频| 欧美日韩亚洲色图| 国产一区二区三区免费观看在线| 国产精品嫩草久久久久| 国产精品 欧美在线| 精品国产av无码| 欧美狂欢多p性派对| 欧美丰满日韩| 亚洲视频一区在线| 国产精品免费一区二区三区在线观看 | 九色porn蝌蚪| 波多野结衣在线观看一区二区三区 | 国产午夜精品一区二区理论影院| 日韩在线免费播放| 三级精品在线观看| 中文字幕日韩综合av| 亚洲黄色av片| 美女裸体自慰在线观看| 色乱码一区二区三区网站| 欧美精品久久一区二区三区| 真人做人试看60分钟免费| 狠狠人妻久久久久久综合麻豆| 成人在线免费电影网站| 亚洲精品国产一区二区三区四区在线| 国产精品区二区三区日本| 永久免费无码av网站在线观看| 国产盗摄在线视频网站| 久久久91精品国产一区二区精品 | 91香蕉视频在线播放| 麻豆导航在线观看| 精一区二区三区| 99九九99九九九视频精品| 国产成人精品在线播放| 91嫩草丨国产丨精品| 大乳在线免费观看| 成人激情黄色小说| 国产精品普通话| 香蕉视频一区二区| 黑人玩欧美人三根一起进| 亚洲国产岛国毛片在线| 国产区一区二区| 国产孕妇孕交大片孕| 精品国产一级| 在线观看成人免费视频| 日韩欧美猛交xxxxx无码| 欧美色图片区| 91久久夜色精品国产按摩| 精品无人国产偷自产在线| 国产sm在线观看| 青檬在线电视剧在线观看| 国产乱码精品1区2区3区| 国产精品免费一区二区三区都可以 | 国产黄视频网站| 免费观看在线综合色| 午夜免费在线观看精品视频| 国产稀缺精品盗摄盗拍| 在线āv视频| 亚洲免费在线观看视频| 一区高清视频| 影音先锋5566资源站| 亚洲国产日本| 91禁外国网站| 99热国产在线观看| 国产精品麻豆成人av电影艾秋| 色综合天天综合色综合av| 精品无码一区二区三区在线| sese在线播放| 久久99久国产精品黄毛片色诱| 国产精品久久一区主播| 亚洲天堂中文在线| 麻豆一区二区| 亚洲色图综合久久| 成人无码av片在线观看| 麻豆蜜桃在线| 欧美性生交大片免网| 手机视频在线观看| 青青草视频在线观看| 日本一区二区三区视频视频| 亚洲欧美日韩精品久久久| 国产精品欧美韩国日本久久| 性欧美暴力猛交另类hd| 国产精品手机播放| 国产人妖在线播放| 日韩精品第一区| 欧美黑人又粗大| 日本中文字幕久久| 日韩精品a在线观看91| 久久成人免费视频| 成人毛片在线播放| 欧美黑白配在线| 久久精品亚洲94久久精品| 国产大片aaa| 欧美国产亚洲精品| 中文字幕亚洲一区在线观看| 麻豆视频在线免费看| 国产欧美自拍| 亚洲精品美女在线观看| av黄色免费在线观看| 欧美风情在线视频| 日韩风俗一区 二区| 永久免费看黄网站| 黄瓜视频在线观看| 久久精品二区亚洲w码| 狠狠色噜噜狠狠色综合久| 国产寡妇树林野战在线播放| 蜜臀av一级做a爰片久久| 欧美日韩国产一二| 黄色免费网站观看| 91在线国产观看| 国产美女在线一区| 视频二区在线| 午夜激情一区二区| 男人网站在线观看| 亚洲a∨精品一区二区三区导航| 亚洲国产精品va在线看黑人动漫 | 97在线观看免费观看高清 | 国产91丝袜在线18| 正在播放国产精品| 成人av影视| 亚洲丝袜另类动漫二区| 日韩精品视频一二三| 中文字幕有码在线观看| 制服丝袜激情欧洲亚洲| 三级黄色在线观看| 成人国产精品久久| 欧美高清视频在线| 肥臀熟女一区二区三区| 国产精品视频| 日韩欧美精品一区二区| 特黄特黄的视频| 欧美日韩一区二区免费视频| 日韩Av无码精品| 日韩成人在线电影| 欧美高清videos高潮hd| 爱福利一区二区| 国产99久久久国产精品潘金网站| 婷婷无套内射影院| 免费在线毛片网站| 欧美一二三四在线| 97免费在线观看视频| 欧美福利视频| 精品伦理一区二区三区| 美女做a视频| 色综合天天视频在线观看 | aa在线观看视频| 麻豆av在线免费观看| 亚洲男人天堂2024| 国产aⅴ爽av久久久久成人| 秋霞午夜鲁丝一区二区老狼| 中文一区一区三区免费| h视频在线观看免费| 精品国产一区二区三区久久久蜜月 | 一区二区不卡在线| 精彩国产在线| 欧美成人在线直播| 五月婷婷六月婷婷| 日本视频免费一区| 国产精品自拍片| 天堂中文在线播放| 久久91亚洲精品中文字幕奶水| 天堂中文在线www| 91婷婷韩国欧美一区二区|