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