新型PID控制及其應用

第一章:數字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

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