第一章:數字PID控制
1.PID控制原理:
圖爲PID控制原理的最簡形式:
e(t) = 設定值 - 實際值
控制規律爲:
P:比例控制部分,當產生誤差後,系統會產生控制作用,減小偏差。但是偏差始終減少不到。所以會與設定值有一個誤差,叫做靜態誤差。對於參數P的控制作用,可以增加開環增益,但是P加大後會不穩定。
I:積分控制部分:積分部分的引入是爲了消除靜態誤差,提高系統的無差度。I加大後會增加系統的穩定性,但超調會明顯,所以在PID的控制之上,會對積分部分採取一些操作,以減小超調。
D:微分控制部分:能反映信號的偏差的變化趨勢。加快系統的動作迅速,較小調節時間。
有一個形象的比喻:
是不是對PID的理解又深了一步呢?
2.PID分爲位置式PID和增量式PID:
區別:位置式PID是與過去的位置有關。容錯性小
增量式PID只與增量有關。
3.位置式PID公式:
#include <stdio.h>
#include <stdlib.h>
struct PID{
float Speed_Set ;
float Speed_Actual;
float Kp;
float Ki;
float Kd;
float Err;
float Last_Err;
float Sum_Err;
} PID;
void PID_Init (void){
printf("PID_Init Begin:\n");
PID.Speed_Set = 0 ;
PID.Speed_Actual = 0 ;
PID.Kp = 0.2;
PID.Ki = 0.1;
PID.Kd = 0;
PID.Err = 0.0;
PID.Last_Err = 0.0;
PID.Sum_Err = 0.0;
printf("PID_Init end:\n");
}
float PID_Realize (float Speed){
PID.Speed_Set = Speed;
PID.Err = PID.Speed_Set - PID.Speed_Actual ;
PID.Sum_Err += PID.Err;
PID.Last_Err = PID.Err;
PID.Speed_Actual = PID.Kp * PID.Err + PID.Ki * PID.Sum_Err + PID.Kd * (PID.Err - PID.Last_Err);
return PID.Speed_Actual ;
}
void main(void){
float Speed = 0.0;
float a = 0.0;
int i = 0;
PID_Init ();
while(i < 290){
a = PID_Realize ( 200.0);
printf("%f\n",a);
i++;
}
system("pause");
}
缺點:由於是全量輸出,所以每次輸出均與過去的狀態有關,計算是要對e(k)進行累加,計算機工作量大,且容易出現錯誤。
4.增量式PID公式:
#include <stdio.h>
#include <stdlib.h>
struct PID{
float set;
float act;
float err;
float err_next;
float err_last;
float P;
float I;
float D;
}pid;
void PID_INIT(void){
pid.set = 0.0;
pid.act = 0.0;
pid.err = 0.0;
pid.err_next = 0.0;
pid.err_last = 0.0;
pid.P = 0.2;
pid.I = 0.015;
pid.D = 0.2;
}
float PID_rea (float SET){
float speed = 0.0;
pid.set = SET;
pid.err = pid.set - pid.act;
speed = pid.P *(pid.err - pid.err_next ) + pid.I * pid.err + pid.D * (pid.err- pid.err_next - (pid.err_next - pid.err_last) );
pid.act += speed;
pid.err_last = pid.err_next;
pid.err_next = pid.err;
return pid.act;
}
void main(void){
int i = 250;
float speed = 0.0;
PID_INIT();
while(i>= 0){
i --;
speed = PID_rea(200.0);
printf("%f\n",speed);
}
system("pause");
}
優點:由於計算機輸出增量,所以誤動作是影響小,可用邏輯判斷去掉
算式無需累加。
缺點:有靜態誤差,這個無法避免。
總結:在控制精度高的控制系統中用位置PID
在以步進電機未執行器的系統中,則可以使用增量式PID