工業控制PID


1.      數字(離散)PID控制算法的表達式:

將PID調節器離散化,用差分方程來代替連續系統的微分方程,分爲位置式和增量式兩類。

重點理解概念如下:

a)  基本偏差e(t):表示當前測量值與設定目標值間的差,設定目標是被減數,結果可爲正或負值,正值表示未達到目標,負值表示超過設定值。(代表比例)

b)  偏差和:即每次測量的差值總和,注意正負(代表積分)

c)  基本偏差的相對偏差:即e(t)-e(t-1)用本次的基本偏差減去上一次的基本偏差。(代表微分)


位置式:


增量式:


位置式和增量式三個參數的作用:

1.      Kp參數:能迅速反映誤差,從而減小誤差,但他不能消除穩態誤差,加大Kp還會引起系統的不穩定。

2.      Ki參數:只要有足夠的時間,積分作用將能完全消除誤差。但其缺點積分控制是偏差累積控制,控製作業緩慢,但是如果積分作用太強會使系統的超調量加大,甚至出現振盪。

3.      Kd參數:預測誤差變化趨勢,減小超調量,克服振盪,使系統的穩定性提高,還能加快系統的動態響應速度,減小調整時間,從而改善系統的動態性能。


參考代碼如下:

  1. /* 
  2.  
  3.     位置型pid 
  4.  
  5. */  
  6. #include <stdio.h>  
  7. #include<ioctl.h>  
  8.   
  9. struct _pid{  
  10. float SetSpeed;         //定義設定值  
  11. float ActualSpeed;      //定義實際值  
  12. float err;              //定義偏差值  
  13. float err_last;         //定義上一個偏差值  
  14. float Kp,Ki,Kd;         //定義比例、積分、微分系數  
  15. float voltage;          //定義電壓值(控制執行器的變量)  
  16. float integral;         //定義積分值  
  17. }pid;  
  18.   
  19. //項目中獲取到的參數  
  20. void PID_init(){  
  21.     printf("PID_init begin \n");  
  22.     pid.SetSpeed=0.0;  
  23.     pid.ActualSpeed=0.0;  
  24.     pid.err=0.0;  
  25.     pid.err_last=0.0;  
  26.     pid.voltage=0.0;  
  27.     pid.integral=0.0;  
  28.     pid.Kp=0.2;             //自己設定  
  29.     pid.Ki=0.015;           //自己設定  
  30.     pid.Kd=0.2;             //自己設定  
  31.     printf("PID_init end \n");  
  32. }  
  33.   
  34. float PID_realize(float speed){  
  35.     pid.SetSpeed=speed;                     //設定值  
  36.     pid.err=pid.SetSpeed-pid.ActualSpeed;   //設定值-實際值  
  37.     pid.integral+=pid.err;                  //積分值,偏差累加  
  38.     pid.voltage=pid.Kp*pid.err+pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);  
  39.     pid.err_last=pid.err;                   //上一個偏差值  
  40.     pid.ActualSpeed=pid.voltage*1.0;        //算出實際值  
  41.     return pid.ActualSpeed;                 //返回  
  42. }  
  43.   
  44. int main(){  
  45.     printf("System begin \n");  
  46.     PID_init();  
  47.     int count=0;  
  48.     while(count<1000)  
  49.     {  
  50.     float speed=PID_realize(200.0);  
  51.     printf("%f\n",speed);  
  52.     count++;  
  53.     }  
  54.     return 0;  
  55. }  


增量式代碼:

  1. /* 
  2.     增量型pid 
  3. */  
  4. #include<stdio.h>  
  5. #include<stdlib.h>  
  6. struct _pid{  
  7.     float SetSpeed; //定義設定值  
  8.     float ActualSpeed; //定義實際值  
  9.     float err; //定義偏差值  
  10.     float err_next; //定義上一個偏差值  
  11.     float err_last; //定義最上前的偏差值  
  12.     float Kp,Ki,Kd; //定義比例、積分、微分系數  
  13. }pid;  
  14. void PID_init(){  
  15.     pid.SetSpeed=0.0;  
  16.     pid.ActualSpeed=0.0;  
  17.     pid.err=0.0;  
  18.     pid.err_last=0.0;  
  19.     pid.err_next=0.0;  
  20.     pid.Kp=0.2;  
  21.     pid.Ki=0.015;  
  22.     pid.Kd=0.2;  
  23. }  
  24. float PID_realize(float speed){  
  25.     pid.SetSpeed=speed;  
  26.     pid.err=pid.SetSpeed-pid.ActualSpeed;  
  27.     float  
  28.     incrementSpeed=pid.Kp*(pid.err-pid.err_next)+pid.Ki*pid.err+pid.Kd*(pid.err-2*pid.err_next+pid.err_last);  
  29.     pid.ActualSpeed+=incrementSpeed;  
  30.     pid.err_last=pid.err_next;  
  31.     pid.err_next=pid.err;  
  32.     return pid.ActualSpeed;  
  33. }  
  34. int main(){  
  35.     PID_init();  
  36.     int count=0;  
  37.     while(count<1000)  
  38.     {  
  39.     float speed=PID_realize(200.0);  
  40.     printf("%f\n",speed);  
  41.     count++;  
  42.     }  
  43.     return 0;  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章