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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stm32f4單片機編碼器讀數以及PID初步測試程序,大家相互學習!

[復制鏈接]
跳轉到指定樓層
樓主
ID:357526 發表于 2018-11-24 20:53 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "led.h"
  4. #include "lcd.h"
  5. #include "pid.h"
  6. #include "exti.h"
  7. #include "key.h"
  8. #include "timer.h"
  9. #include "motor.h"
  10. #include "pid.h"
  11. #include "usart.h"
  12. struct PID pid;
  13. extern u32 LL,RR,S_L,S_R,TT,speed_lcd,set_speed;
  14. extern int  pwm_i,pwm_j,wk_up;;
  15. float KP=0.5;//控制比例
  16. float KI=0.1;//積分系數  
  17. float KD=0.0;//微分系數  

  18. void key_scanf(void)  //按鍵PWM調節
  19. {   
  20. if(KEY0==0)      //KEY_0 ->KI
  21. {
  22.   delay_ms(10); //消抖
  23.   if(KEY0==0)   
  24.   {  
  25.    if(wk_up!=3) KD+=0.01;
  26.    if(wk_up==3) KD-=0.01;
  27.    
  28.    if(KD<=0)  KD=0.00;
  29.   }  
  30. }

  31. if(KEY1==0)         //KEY_1 ->KD
  32. {
  33.   delay_ms(10); //消抖
  34.   if(KEY1==0)   
  35.   {
  36.    if(wk_up!=2) KI+=0.01;
  37.    if(wk_up==2) KI-=0.01;
  38.       if(KI<=0)  KI=0.00;   
  39.   }
  40. }

  41.   
  42. if(KEY2==0)         //KEY_2 ->KP
  43. {
  44.   delay_ms(10); //消抖
  45.   if(KEY2==0)   
  46.   {
  47.    if(wk_up!=1) KP+=0.01;
  48.    if(wk_up==1) KP-=0.01;
  49.    
  50.    if(KP<=0)  KP=0.00;
  51.   }
  52. }


  53. if(WK_UP==1)         //KEY_2 ->KP
  54. {
  55.   delay_ms(10); //消抖
  56.   if(WK_UP==1)   
  57.   {
  58.        wk_up+=1;
  59.      if(wk_up==4)  wk_up=0;
  60.   }
  61. }
  62. }

  63. void PID_Init(void)
  64. {
  65. pid.limit=0.0;//限幅
  66.   
  67. pid.e_current=0.0;//當前偏差
  68. pid.e_his=0.0;//歷史偏差總和
  69. pid.e_last=0.0;//上次偏差
  70. pid.e_llast=0.0;//上上次偏差

  71. pid.target_out=0.0;//目標輸出
  72. pid.real_out=0.0;
  73. }

  74. //算法數據實現
  75. float PID_Data(float set_speed)
  76. {
  77. float out_speed;
  78. pid.real_out=(float)LL;
  79. pid.target_out=set_speed;//設定的速度值給target_out處理

  80. pid.e_current=pid.target_out-pid.real_out;//計算當前誤差  real_out需要外部調入
  81. //pid.e_his+=pid.e_current;//重復調用記錄開機以來的歷史誤差

  82. out_speed=KP*(pid.e_current-pid.e_last)+KI*pid.e_current+KD*(pid.e_current-2*pid.e_last+pid.e_llast);//計算公式
  83. pid.real_out=pid.real_out+out_speed;//疊加再輸出

  84. pid.e_llast=pid.e_last;//為下次數據處理準備;
  85. pid.e_last=pid.e_current;//為下次數據處理準備;

  86. return out_speed;//輸出目標調節PWM值
  87. }
復制代碼
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "led.h"
  4. #include "lcd.h"
  5. #include "pid.h"
  6. #include "exti.h"
  7. #include "key.h"
  8. #include "timer.h"
  9. #include "motor.h"
  10. #include "pid.h"
  11. #include "usart.h"

  12. u32 LL=0,RR=0,S_L=0,S_R=0,TT=0,speed_lcd,mo_dir=0,set_speed_ms_lcd=0;
  13. u32 temp2=0,temp3=0,temp1=0,temp=0;
  14. float R_T=0.0,speed=0.0,SPEED=0.0,set_speed_ms=0.0;
  15. extern float speed,temp5,temp7,Duty,KP,KI,KD;
  16. extern int adc5,adc7,set_speed,temp_P,temp_I,temp_D,temp_PP,temp_II,temp_DD,pwm_i,pwm_j,wk_up;
  17. extern struct PID pid;

  18. void motor_set(void)
  19. {
  20.                   
  21.         TIM_SetCompare1(TIM4,1000);        //修改比較值,修改占空比   PB6
  22.         TIM_SetCompare3(TIM4,1000);        //修改比較值,修改占空比   PA1    電機正  L  and   R    前進

  23.         TIM_SetCompare2(TIM4,pwm_i);        //修改比較值,修改占空比   PB7
  24.         TIM_SetCompare4(TIM4,pwm_i);        //修改比較值,修改占空比   PA5    電機負  L  and   R   后退                                                               
  25.         
  26. /*                                                         
  27.         TIM_SetCompare3(TIM3,PID_Data(i));        //修改比較值,修改占空比   PA1    電機正  L  and   R    前進
  28.         TIM_SetCompare2(TIM3,PID_Data(1000-i));        //修改比較值,修改占空比   PA5    電機負  L  and   R   后退        
  29. */        
  30. }

  31. void motor_reset(void)
  32. {
  33.                         
  34.                         TIM_SetCompare1(TIM4,1);
  35.                         TIM_SetCompare3(TIM4,1);
  36.         
  37.                         TIM_SetCompare2(TIM4,1);
  38.                         TIM_SetCompare4(TIM4,1);   //停車不動                                 
  39. }

  40. void lcd_show(void)
  41. {
  42.                 POINT_COLOR=BLACK;
  43.                
  44.           LCD_ShowString(0,0,100,24,24,"pwm_i   ->:");
  45.                 LCD_ShowxNum(150,0,pwm_i,3,24,0);   LCD_ShowxNum(200,0,pwm_j,3,24,0);//顯示i,j        
  46.         
  47.     LCD_ShowString(0,24,100,24,24,"LL  value:");
  48.                 LCD_ShowxNum(150,24,LL,7,24,0);
  49.           LCD_ShowString(0,48,100,24,24,"RR  value:");
  50.                 LCD_ShowxNum(150,48,RR,7,24,0);                              //顯示左右編碼器的值
  51.         
  52.           LCD_ShowString(0,72,200,24,24,"Speed_L  :");//顯示出計算過的速度
  53.           LCD_ShowString(126,72,100,24,24," .  ");
  54.           temp=speed_lcd/100;
  55.     temp1=speed_lcd%1000;        
  56.            LCD_ShowxNum(126,72,temp,1,24,0);
  57.           LCD_ShowxNum(150,72,temp1,2,24,0);
  58.           LCD_ShowString(174,72,100,24,24,"(m/s)");
  59.         
  60.           LCD_ShowString(0,96,200,24,24,"Speed_R  :");
  61.                 LCD_ShowxNum(150,96,S_R,7,24,0);
  62.         
  63.           LCD_ShowString(0,120,100,24,24,"TT value :");
  64.                 LCD_ShowxNum(150,120,TT,7,24,0);

  65.     LCD_ShowString(0,255,200,24,24,"set_LL   :");
  66.                 LCD_ShowxNum(150,255,set_speed,7,24,0);
  67.           LCD_ShowString(0,279,200,24,24,"set_speed:");//顯示出計算過的速度
  68.           LCD_ShowString(126,279,100,24,24," .  ");
  69.           temp2=set_speed_ms_lcd/100;
  70.     temp3=set_speed_ms_lcd%1000;        
  71.            LCD_ShowxNum(126,279,temp2,1,24,0);
  72.           LCD_ShowxNum(150,279,temp3,2,24,0);
  73.                 LCD_ShowString(174,279,100,24,24,"(m/s)");
  74.                
  75.                 LCD_ShowString(0,144,260,24,24,"WK_UP    :");
  76.           LCD_ShowxNum(198,144,wk_up,1,24,0);
  77.                                 
  78.                 LCD_ShowString(0,168,260,24,24,"KEY_2   P:");
  79.                 LCD_ShowString(174,168,100,24,24," .   ");
  80.                 temp_P=(int)100*KP;
  81.                 temp_PP=temp_P/100;
  82.                 temp_P=temp_P%100;
  83.     LCD_ShowxNum(174,168,temp_PP,1,24,0);
  84.           LCD_ShowxNum(198,168,temp_P,2,24,0);

  85.                 LCD_ShowString(0,192,260,24,24,"KEY_1   I:");
  86.           LCD_ShowString(174,192,100,24,24," .   ");
  87.                 temp_I=(int)100*KI;
  88.                 temp_II=temp_I/100;
  89.                 temp_I=temp_I%100;
  90.     LCD_ShowxNum(174,192,temp_II,1,24,0);
  91.           LCD_ShowxNum(198,192,temp_I,2,24,0);                 
  92.                
  93.                 LCD_ShowString(0,216,260,24,24,"KEY_0   D:");
  94.           LCD_ShowString(174,216,100,24,24," .   ");
  95.     temp_D=(int)100*KD;
  96.                 temp_DD=temp_D/100;
  97.                 temp_D=temp_D%100;
  98.     LCD_ShowxNum(174,216,temp_DD,1,24,0);
  99.           LCD_ShowxNum(198,216,temp_D,2,24,0);
  100. //                v777=(int)(temp7*1000);
  101. //          v7=(v777/1000);
  102. //    v77=v7%1000;               
  103. //           LCD_ShowxNum(174,216,v7,1,24,0);
  104. //          LCD_ShowxNum(198,216,v77,2,24,0);
  105.                
  106. }
復制代碼

全部資料51hei下載地址:
PID任務二.rar (531.32 KB, 下載次數: 63)



評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:414834 發表于 2018-11-25 01:20 | 只看該作者
樓主設置電機停車的時候為1的占空比,不會損害電機嘛?還有我也在做PID,但是總是一開始就最大值了,有沒有什么辦法調節,我查找不到問題在哪
回復

使用道具 舉報

板凳
ID:357526 發表于 2018-11-26 17:19 | 只看該作者
風吟軒 發表于 2018-11-25 01:20
樓主設置電機停車的時候為1的占空比,不會損害電機嘛?還有我也在做PID,但是總是一開始就最大值了,有沒有 ...

哈哈哈,1000占空比是向上計數的,輸出為 0 哈。
PID的話去B站找一下XX老師的視頻,我記得是十來講的,講得非常不錯,注意理解公式就好了。
回復

使用道具 舉報

地板
ID:433764 發表于 2018-11-26 21:35 | 只看該作者
風吟軒 發表于 2018-11-25 01:20
樓主設置電機停車的時候為1的占空比,不會損害電機嘛?還有我也在做PID,但是總是一開始就最大值了,有沒有 ...

首先判斷引起輸出最大值的原因,是否比例系數設置過大了。
如果不是,判斷是否迭代時間設置過短,導致迭代速度太快,系統響應跟不上輸出的變化速度,導致積分項增加過快,這種情況可以適當調低迭代速度,或者考慮使用飽和積分。
具體情況要具體分析哈
回復

使用道具 舉報

5#
ID:414834 發表于 2018-11-30 19:51 | 只看該作者
萬物互聯 發表于 2018-11-26 21:35
首先判斷引起輸出最大值的原因,是否比例系數設置過大了。
如果不是,判斷是否迭代時間設置過短,導致迭 ...

大佬,我現在PID調出來了,但是有點問題,應該說問題挺大的,跳躍的頻率挺大的,而且跳躍的范圍也不確定,有什么辦法可以讓四個電機的速度都相等呢?我現在7200的最大占空比,但是輸出的時候占空比的波動范圍差不多50左右,還能減少么?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久手机视频 | 日韩伦理一区二区三区 | 亚洲欧美激情视频 | 亚洲欧美国产一区二区三区 | 一级国产精品一级国产精品片 | 成人影 | 国产香蕉视频 | 免费观看一级毛片 | 精品国产乱码久久久久久蜜柚 | 99久久精品国产毛片 | 日日夜夜精品视频 | 欧美精品一区二区三区四区五区 | 男女精品网站 | 成人精品一区二区三区 | 伊人精品久久久久77777 | 亚洲精品久久久一区二区三区 | av一区二区在线观看 | 成人福利网站 | 日本精品国产 | 粉嫩一区二区三区国产精品 | 亚洲精品久久久久中文字幕二区 | 一级特黄a大片 | av二区三区 | 欧美日韩免费在线 | 精品视频www | 欧美福利三区 | 农村真人裸体丰满少妇毛片 | 精品视频在线一区 | 91精品久久久久久久久久入口 | 日韩一区精品 | 日本精品一区二区 | 玖玖玖在线观看 | 中文在线一区 | 蜜月aⅴ免费一区二区三区 99re在线视频 | 成人精品一区二区三区中文字幕 | 成年视频在线观看福利资源 | 国产精品污www在线观看 | 成人免费视频在线观看 | 在线亚洲免费视频 | 国产乱码精品一区二区三区五月婷 | 五月婷婷在线播放 |