控制算法
電機控制算法的作用是接受指令速度值,通過運算向電機提供適當?shù)尿寗与妷?,盡快地和盡快平穩(wěn)地使電機轉速達到指令速度值,并維持這個速度值。換言之,一旦電機轉速達到了指令速度值,即使在各種不利因素(如斜坡、碰撞之類等使電機轉速發(fā)生變化的因素)的干擾下也應該保持速度值不變。為了提高機器人小車控制系統(tǒng)的控制精度,選用合適的控制算法顯得十分必要??刂扑惴ㄊ侨魏伍]環(huán)系統(tǒng)控制方案的核心,然而并非越復雜、精度越高的算法越好,因為比賽要求非常高的實時性,機器人必須在非常短的時間內(nèi)作出靈敏的反應,所以現(xiàn)代的一些先進控制算法,比如模糊控制、神經(jīng)元網(wǎng)絡控制等就不能應用到小車控制系統(tǒng)里。本系統(tǒng)選用了最常規(guī)、最經(jīng)典的PID控制算法,通過實際應用取得了很好的效果。
1. 比例項
控制回路中的第一個偏差轉換環(huán)節(jié)就是比例項。這一環(huán)節(jié)簡單地將偏差信號乘以常數(shù)K
得到新的CV值(值域為-100~100)?;镜谋壤刂扑惴ㄈ缦拢?
loop:
PV=ReadMotorSpeed()
Error=SP-PV
CV=Error*Kprop
Setpwm(cv)
Goto
loop
上一段程序中的SP表示預設目標值,SetPWM()函數(shù)并非將CV值作為絕對的PWM占空比來對待。否則,不斷降低的偏差值會使輸出值接近零,而且由于電機工作時需要持續(xù)的PWM信號,控制系統(tǒng)將會使電機穩(wěn)定在低速運轉狀態(tài)上,從而導致控制系統(tǒng)策略失敗。
相反,CV值一般被取作當前PWM占空比的改變量,并被附加到當前的PWM占空比上。這也要求SetPWM()函數(shù)必須將相加后得到的PWM占空比限制在0%~100%。正的CV值將使電機兩端電壓增加。負的CV值將使電機兩端電壓降低。如果CV值等于0,則無需改變當前占空比。較低的K 值會使電機的速度響應緩慢,但是卻很平穩(wěn)。較高的K 值會使速度響應更快,但是卻可能導致超調(diào),即達到穩(wěn)定輸出前在期望值附近振蕩。過高的K 值會導致系統(tǒng)的不穩(wěn)定,即輸出不斷震蕩且不會趨于期望值。
2.
微分項
任何變量的微分項被用來描述該變量是如何相對于另一個變量(多數(shù)是時間)變化的。換句話說,任何變量的微分項就是它隨時間的變化率。如位移隨時間的變化率是速度。速度相對于時間的微分是加速度。
在PID控制器中,值得關心的是偏差信號相對于時間的微分,或稱變化率。絕大多數(shù)控制器將微分項定義為:
R a t e = ( E t ? E t ?
1 ) T Rate=\frac{(E_t-E_{t-1} )}{T}
Rate=
T
(E
t
?E
t?1
)
式中,Et為當前偏差,Et-1
為前次偏差值,T為兩次測量的時間間隔。負的變化率表明偏差信號的改善。當微分項被具體應用于控制器中時,將一個常數(shù)乘以該微分項,并將它加到比例項上,就可以得到最終的CV值計算公式:
C
V = ( K p ? E ) + ( K d ? R a t e ) CV=( K_p*E)+( K_d*Rate)
CV=(K
p
?E)+(K
d
?Rate)
當偏差信號接近零時,CV值將為負,所以當偏差信號開始改善時,微分項的作用將逐漸減弱校正輸出量。在某些場合下,微分項還有利于超調(diào)量的消除,并可以允許使用較大的K
值,從而可以改善響應的快速性。微分環(huán)節(jié)還預示了偏差信號的變化趨勢。當控制對象對控制器的輸出響應遲緩時,微分環(huán)節(jié)的作用尤為明顯。
含有微分項的控制算法的偽代碼實現(xiàn)如下:
loop:
PV=ReadMotorSpeed()
LastError=Error
Error=SP-PV
Rate=Error-LastError
CV=Error*Kprop+Krate*Rate
SetPWM(CV)
Goto loop
3.
積分項
積分正好與微分相對。假如有一個描述變化率(微分)的表達式,那么對該表達式的積分就將得到隨時間變化的原物理量。如加速度的積分是速度,速度的積分是位移。
在PID控制回路中,偏差的積分代表從控制開始時算起所有偏差積累的總和。該總和被常數(shù)K
所乘后再添加到回路輸出中。在回路中,如果沒有積分環(huán)節(jié),盡管控制系統(tǒng)也會趨于穩(wěn)定,但是由于某種原因輸出值可能最終也無法達到SP值。
一個簡單但完全的PID控制器地偽代碼實現(xiàn)如下:
loop:
PV=ReadMotorSpeed()
LastError=Error
Isum=Isum+Error
Error=SP-PV
Rate=Error-LastError
CV=Error*Kprop+Krate*Rate+Kint*Isum
SetPWM(CV)
Goto
loop
由于積分項會越來越大,這就會使控制回路在SP值的改變時響應變慢,某些應用場合在CV值達到取值邊界(如為:-100~100)時會停止累加Isum。在SP值改變時,也可以除去Isum項。