天天看點

利用PID控制算法實作恒溫實驗的方法

   大家好。

  今天和大家聊一聊PID算法的控制原理。

   在講解PID算法之前,在此抛出一個問題,如何通過算法控制加熱器使水溫穩定在50攝氏度?

目錄

​​一、傳統的位式控制算法(非PID算法)​​

​​二、PID閉環控制​​

​​三、PID控制參數整定的方法​​

一、傳統的位式控制算法(非PID算法)

利用PID控制算法實作恒溫實驗的方法

(1)算法邏輯:使用者設定目标溫度Sv為50,傳感器檢測控制對象即水的溫度Pv

①當Pv<Sv時,表示實際溫度低于目标溫度,輸出高電平OUT=H,讓執行元件即加熱器滿功率加熱

②當Pv==SV時,表示實際溫度等于目标溫度,不輸出

③當Pv>Sv時,表示實際溫度高于目标溫度,輸出低電平OUT=L,讓執行元件即加熱器不工作,即0功率輸出

(2)代碼實作:

#define Sv 50
void func(unsigned int Pv)
{
          if(Pv<Sv) OUT(H);
          else OUT(L);
}      

(1)缺點

①控制算法過于簡單,單純對設定值和輸出值進行比較,一旦發現低于設定值,就輸出高,否則就輸出低

②要麼處于全功率下,要麼處于0功率下工作

③會導緻溫度總是在設定值上下波動如下圖所示,因為控制對象具有一定的慣性,即加熱時水的溫度不會立即上升,不加熱時水的溫度不會立即下降

利用PID控制算法實作恒溫實驗的方法

二、PID閉環控制

PID閉環即比例-積分-微分控制,即通過對偏差進行比例-積分-微分控制,使得目前值趨于目标值的過程。一般來說,比例P控制是必須的,是以衍生出很多組合的PID控制,如PD、PI、PID。離散PID公示為:

利用PID控制算法實作恒溫實驗的方法

其中,e(k):為k時刻的偏差,u(k):為輸出的控制量(對于加熱器來說是PWM)

利用PID控制算法實作恒溫實驗的方法

(1)比例控制(P)

Sv為使用者設定目标值,Pv為控制對象即水的目前溫度值

Ek為目标溫度與目前溫度的偏差:Ek=Sv-Pv

①當Ek<0時,表示目前溫度未達标

②當Ek==0時,表示目前溫度正好達标

③當Ek>0時,表示目前溫度已超标

比例控制算法公式:PWM=Kp*Ek

Kp參數的解釋:Kp可以了解為一個衰減器或者放大器,主要是用來調整偏內插補點,調整其增益或者說是放大倍數    

比例控制的作用:調節到達目标值的時間,增大Kp會增加相應速度,但可能會造成超調,有靜态誤差

(2)積分控制(I)

Ek為曆史上某一時刻的偏差,Sk為曆史偏差之和:Sk=E1+E2+E3+...+EN

①當Sk<0時,表示曆史上大部分時間溫度未達标(現在是否達标不知道)

②當Sk==0時,表示曆史上溫度總體上是好的(現在溫度是否達标不管)

③當Sk>0時,表示曆史上大部分時間溫度超标(現在溫度是否超标不知道)

 積分控制公式:PWM=Ki*Sk

Ki參數的解釋:Ki可以了解為一個衰減器或者放大器,主要是用來調整Sk,調整其增益或者說是放大倍數  

比例控制的作用:如果我們把加熱器放到一個非常冷的地方對水進行加熱,加熱目标值是50攝氏度在比例控制下,水溫度慢慢升高,直到升高到45攝氏度,發現天氣太冷,水散熱的速度正好等于比例控制下的加熱速度。是以水溫永遠停留在45攝氏度,永遠到不了50攝氏度。如果加上積分控制,隻要沒有達到50攝氏度,就會存在偏差,這時候對偏差不斷積分(累加),輸出的PWM就會增大,即增大的加熱器的功率,使水溫能達到50攝氏度。是以比例控制的作用是,減少靜态情況下的誤差,但容易造成震蕩

(3)微分控制(D)

E(k)為目前偏內插補點,E(k-1)為上一次偏內插補點

Dk為最近兩次偏差相減,表示最近兩個時間點偏差的變化:Dk=E(k)-E(k-1)

①當Dk<0時,表示偏差有增大的趨勢

②當Dk==0時,表示偏差穩定,輸出為0

③當Dk>0時,表示偏差有減小的趨勢

微分控制公式:PWM=Kd*Dk

Kd參數的解釋:Kd可以了解為一個衰減器或者放大器,主要是用來調整Dk,調整其增益或者說是放大倍數

微分控制的作用:隻要實體量存在變化,微分控制就會起作用,讓實體量的變化速度趨于0,增大Kd參數能夠抑制震蕩,盡快穩定,但有可能造成調節周期過長

(4)PID算法控制代碼實作

int PID(int Sv,int Pv)
{
      /* Sv:使用者設定的目标值
      ** Pv:傳感器檢測到的目前值
      ** Ek:目标值與目前值的偏內插補點
      ** last_Ek:上一次的Ek值
      ** Sk:偏內插補點Ek的積分值
      ** PWM:輸出的PWM值
      */
      static int Ek,last_Ek,Sk;
      static float PWM;
      Ek=Sv-Pv;
      Sk+=Ek;
      /*積分限幅,Sk_max和Sk_min根據情況自己給定*/
      if(Sk>Sk_max)   Sk=Sk_max;
      if(Sk<Sk_min)   Sk=Sk_min;
      /*PID公式,其中Kp、Ki和Kd為參數,需要自己給定并調節*/
      PWM=Kp*Ek+Ki*Sk+Kd*(Ek-last_Ek);
      last_Ek=Ek;
      /*PWM限幅,PWM_max和PWM_min根據情況自己給定*/
      if(PWM>PWM_max)   PWM=PWM_max;
      if(PWM<PWM_min)   PWM=PWM_min;
      return PWM;
}      

當Ek、Ki和Kp參數參數調節的比較好時,溫度能及時達到目标溫度并且很平穩如圖所示:

利用PID控制算法實作恒溫實驗的方法

三、PID控制參數整定的方法

PID控制的調節經驗可以總結為:先隻使用 P 控制,增大 P 系數直到系統振蕩,然後加入微分控制增大阻尼,消除振蕩之後再根據系統對響應和靜差等具體要求,調節 P 和 I 參數。

例子:我們需要調節目标值為 10390,目前值為 10000

①先設定Kd和Ki的參數值為0,然後把Kp參數從0逐漸增大,直到出現震蕩

當Kp=62,Ki=0,Kd=0時,響應曲線如下:

利用PID控制算法實作恒溫實驗的方法

②保持Kp=62,Ki=0不變,Kd從0逐漸增大,當Kd=188時,響應曲線如下:

繼續閱讀