陳洪偉
[摘 要] 我國提出了“中國制造2025”。目前企業工業自動化的水平已經成為現代化水平的一個主要衡量指標。PID控制器的特點是結構簡單、應用廣泛、完全擺脫了精確模型的限制,這樣就能解決在工業過程中需要精確建模的困難。那么,基于單片機的PID控制成本低廉,可以根據不同的應用環境進行開發,具有很大的應用優勢。
[關 鍵 詞] PID算法;C語言;單片機
[中圖分類號] F403.6 [文獻標志碼] A [文章編號] 2096-0603(2017)30-0220-01
不論在工業還是民用應用中PID及其衍生算法是應用較為廣泛的算法之一,也被大家稱為萬能算法,所以熟練掌握PID算法的設計和實現的過程,對研發人員來講,基本上是可以應對工作中遇到的一些基本問題了。其實PID的控制過程也是相當的簡單了,原理是通過誤差信號來控制被控的量,就控制器本身而言就是比例、積分、微分三個環節的加和。在這里我們規定(在t時刻):輸入的變量為rin(t),輸出的變量為rout(t),所以我們可以得出偏差量為err(t)=rin(t)-rout(t)。那么我們從參考文獻上可以查閱到PID的控制規律為U(x)=kp(err(t)+1/T*∫err(t)*dt+TD*derr(t)/dt)。接下面我們來舉例說明這個公式,首先來假設這個工作流程是用來直流電機調速的。在這里rin(t)為電機轉速預定值,rout(t)作為電機的實際轉速值。直流電機的調速方法為PWM脈寬調制。轉速的單位用轉/min表示。那么接下來我們要考慮的是系統中的U(t)是什么,而U(t)和PWM之間存在的關系是什么樣的。我們都知道實際應用中,每一個電壓對應的是一個轉速,但是大多數人把電壓和轉速的關系理解成線性的對應關系了。而在實際的應用中直流電機的特性不是線性的,或者只能說直流電機的特性是在局部上趨于線性的。所以這樣就引出來一個問題,直流電機在PID調速上是有范圍限制的。這樣就要求我們在進行PID調速之前,用開環系統來測試電壓和轉速之間的特性曲線,根據這個曲線再進行閉環參數的調整。
接下來我們再來說明一下反饋的原理,來看一下公式U(x)=kp(err(t)+1/T*∫err(t)*dt+TD*derr(t)/dt)。在這里,PID控制其實就是對偏差的控制過程。那么偏差如果為0則比例環節就不起作用了。當控制系統存在偏差時比例環節才發揮作用,這里的積分環節是用來消除靜差的,靜差在這里是系統穩定后輸出值和設定值之間的相差值,而積分環節就是偏差累計后的結果,把累計的誤差加到原有系統上用來抵消掉系統產生的靜差。而微分信號則是反映偏差信號的變化規律,它的作用是根據偏差信號的變化趨勢提前進行調節,這樣就增加了系統的快速性。了解了它的控制原理后,接下來我們將對PID進行連續系統離散化,這樣我們就能在單片機上通過C語言來實現。偏差err(K)=rin(K)-rout(K);積分環節用加和來表示,也就是err(K)+err(K+1)+……,而微分環節用斜率的形式來表示,[err(K)-err(K-1)]/T,這樣就形成了如下所列出的PID離散表示形式:U(k)=kp(err(k)+Ki∑err(j)+Kd(err(k-1)-err(k-2)),從這個公式可以看出,增量式的結果是和最近的一次偏差有關系,這樣就可以最大限度地提高系統的穩定性。但是需要注意的是最后的結果應該為u(K)+增量調節后的值,這就是PID的離散化過程,接下來要做的工作是將離散化的公式轉換成為C語言,從而實現在單片機上控制。實現過程C語言控制代碼如下:
首先我們來定義一個PID變量結構體struct_pid{ float SetSpeed;float ActualSpeed;float err;float err_last;float Kp,Ki,Kd;float voltage;float integral} pid,結構體中變量含義分別為定義一個設定的值,定義一個偏差值,定義上一個偏差值,定義比例系數、積分系數、微分系數,定義一個控制執行器電壓值的變量,定義一個積分值。把所要用到的參數定義在一個結構體中可以使程序更加模塊化。接下來我們要對三個比例系數賦初值,pid.Kp=0.2;pid.Ki=0.015;pid.Kd=0.2.在調試過程當中,對要求的控制效果,可以通過調節這三個量直接進行調節。float PID_realize(float speed){pid.SetSpeed=speed;pid.err=pid.SetSpeed-pid.ActualSpeed;pid.integral+=pid.err;pid.voltage=pid.Kp*pid.err+pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);pid.err_last=pid.err;pid.ActualSpeed=pid.voltage*1.0;returnpid.ActualSpeed;}那么到此PID的基本算法已經呈現出來了。但是在實際應用中這個算法沒有考慮上下限的問題,只是對公式的一種直接實現。如放在實際應用中應根據情況加以改進。
參考文獻:
[1]維斯.數據結構與算法分析[M].機械工業出版社,2004.
[2]譚浩強.C語言程序設計[M].清華大學出版社,2001,