算法原理
PID控制器即比例(proportion)、積分(integral)、微分(differential)控制器, 該算法以誤差作為輸入量,經(jīng)過對比例,積分,微分三項加權(quán)求和之后得到輸出量。PID控制器是非常經(jīng)典的控制器,簡單易懂,不需要精確的系統(tǒng)模型就可以使用,應(yīng)用非常廣泛。
關(guān)于PID的介紹資料網(wǎng)上有很多,也有很多講的通俗易懂的。
我這里介紹算法原理時除了定性分析之外,還會涉及到一部分理論知識,需要一定的《自動控制原理》和《信號與系統(tǒng)》的專業(yè)知識,不過不會過于深入,都是簡單的入門級知識。
我們先說一下為什么需要閉環(huán)控制,以控制一個電機的轉(zhuǎn)速為例。在實際控制之前,我們可能會想當(dāng)然的覺得,只要我給電機一個100轉(zhuǎn)/min的轉(zhuǎn)速期望,它就會乖乖輸出100轉(zhuǎn)/min的結(jié)果,但是實際情況呢?電機空載的情況下它或許還能夠達到期望的轉(zhuǎn)速,但是假如給電機上加了一個10斤的負(fù)載呢?它的轉(zhuǎn)速可能就掉到80轉(zhuǎn)/min去了,再繼續(xù)增加負(fù)載,轉(zhuǎn)速可能會繼續(xù)下降。
再舉一個例子,做過智能小車之類的同學(xué)應(yīng)該會深有體會,單片機輸出同樣脈寬PWM給電機,但是隨著電源電壓,輪子松緊等因素的干擾,幾乎每次電機最后輸出的實際轉(zhuǎn)速都會變化。
如何解決這個問題呢?其實我們只需要根據(jù)電機的實際轉(zhuǎn)速來改變我們的給電機的輸入量就可以了。比如同樣是希望電機掛了10斤負(fù)載的情況下能夠輸出100轉(zhuǎn)/min,由于給電機的輸入對應(yīng)于空載100轉(zhuǎn)/min時,實際輸出只有80轉(zhuǎn)/min,可以考慮將輸入量提高到對應(yīng)于空載時120轉(zhuǎn)/min,這時電機的實際輸出或許就能夠達到100轉(zhuǎn)/min。同樣的,如果負(fù)載繼續(xù)增加,我們就進一步增大輸入量,以控制實際輸出保持在100轉(zhuǎn)/min。
Robomaster的大部分電機都是帶霍爾傳感器,可以反饋轉(zhuǎn)速/位置信息的,因此都可以通過閉環(huán)的方式進行控制。
然后我們介紹一下什么是典型的反饋控制器(該模型可以在matlab的simulink中打開):
一般我們會將受控對象的反饋(measured output)與我們的期望(reference)輸入相減,得到一個誤差值(error),然后以該誤差作為輸入量給控制器(controller),控制器最后輸出結(jié)果(control input)直接傳給受控對象(plant)。
依然是結(jié)合我們之前的電機的例子,這里的期望即我們的期望電機轉(zhuǎn)速100轉(zhuǎn)/min,反饋即我們通過霍爾傳感器獲得的電機實際轉(zhuǎn)速80轉(zhuǎn)/min,我們將他們做差得到誤差,然后將其送入控制器中,控制器根據(jù)內(nèi)部的算法得到結(jié)果,算出120轉(zhuǎn)/min的期望給電機,就能夠使電機的實際轉(zhuǎn)速恰好等于期望。
由于誤差和控制器輸出都是時變的,我們分別假設(shè)其為err(t)和U(t),這樣我們就可以引出連續(xù)型PID的公式
U(t)=Kp?err(t)+Ki?∫err(t)dt+Kd?derr(t)dtU(t)=Kp?err(t)+Ki?∫err(t)dt+Kd?derr(t)dt
即對err(t)分別進行比例,積分,微分運算之后進行加權(quán)求和得到輸出U(t)。為什么會同時需要這三項呢?我們來定性的分析一下每一項的含義——
首先我們假設(shè)Ki和Kd兩個系數(shù)均為0,則公式變化為
U(t)=Kp?err(t)U(t)=Kp?err(t)
即輸出量隨誤差大小等比例變化,那么這樣得到的輸出結(jié)果會是什么樣的呢?(藍(lán)線為輸出,黃線為期望,紫線為誤差)
我們會發(fā)現(xiàn)輸出出現(xiàn)了兩個問題——第一,出現(xiàn)了超調(diào),第二,出現(xiàn)了靜差。
超調(diào)即實際輸出量出現(xiàn)了一個大于期望值的尖峰,超調(diào)可能會引發(fā)很嚴(yán)重的問題——系統(tǒng)不穩(wěn)定,這種情況往往出現(xiàn)在比例項過大的情況。一個超調(diào)量引發(fā)另一個超調(diào),導(dǎo)致系統(tǒng)處于持續(xù)的震蕩狀態(tài)中,比如下圖這種情況——
體現(xiàn)在實際的機器人中就會是“嘿,你的云臺瘋了”或者“嘿,你的底盤瘋了”,你會看見自己的機器人的云臺抽風(fēng)一般的抽搐點頭,底盤如同脫韁的野馬肆意奔馳.......(所以為了安全,一定要給輸出添加限幅!!被云臺打到或者被底盤撞到真的很疼!!)
靜差即輸出穩(wěn)定在一個小于期望的值,引發(fā)這一點的問題之一是比例系數(shù)過小。因為我們知道輸出是和誤差成正比例的,如果比例系數(shù)小了,則輸出自然也會小。適當(dāng)?shù)脑龃蟊壤禂?shù)可以改善這一問題,但是永遠(yuǎn)不可能徹底消除靜差,因為如果真的達到了輸出等于期望,也就是err(t)等于0的情況,則輸出U(t)就也為0了......我們來看一下增大比例項的結(jié)果:靜差大大減小,但是超調(diào)也增大了。
所以我們可以看出純比例控制所遇到的一個矛盾的問題,系數(shù)太小則存在靜差,系數(shù)太大則存在超調(diào),所以為了解決這一問題,我們需要提高系統(tǒng)階數(shù),引入積分項。
引入積分項后,公式變成
U(t)=Kp?err(t)+Ki?∫err(t)dtU(t)=Kp?err(t)+Ki?∫err(t)dt
我們來分析一下積分項是如何解決靜差這個問題的。由于積分的累積性,只要存在誤差,積分項就會持續(xù)作用,即使在err(t)為0時,積分項也不會為0,而是繼續(xù)保持作用,維持U(t)不為0。但是需要注意的是,積分項對于輸出的影響是比較大的,不能貿(mào)然給很大的積分系數(shù),否則......(“嘿,你云臺/底盤瘋了”),此外積分項一定程度上會助長超調(diào)的影響,使系統(tǒng)趨于穩(wěn)定的時間變得更久,如下圖所示。
通過增加積分項,我們解決了靜差這一問題,但是超調(diào)問題依然存在,雖然通過增加減小比例項和積分項可以一定程度上的減小超調(diào),但是代價就是輸出消除靜差的時間又要被延長了。所以這時我們引入第三項微分項。這時我們就得到了真正的完整PID控制器公式——
U(t)=Kp?err(t)+Ki?∫err(t)dt+Kd?derr(t)dtU(t)=Kp?err(t)+Ki?∫err(t)dt+Kd?derr(t)dt
微分項的意義何在呢?我們可以將其與物理中的阻尼概念聯(lián)系起來。每當(dāng)err(t)產(chǎn)生急劇變化時,就會產(chǎn)生一個很大的微分項來抵消這一急劇的變化。這就恰好和我們的超調(diào)現(xiàn)象相對應(yīng),因為超調(diào)正是一個急劇上升后急劇下降的尖峰,而微分項是來和它做抵消的。
我們來看一下引入微分項后的輸出結(jié)果——
可以看到超調(diào)量大大減小,且系統(tǒng)恢復(fù)穩(wěn)定的時間也加快了。
通過以上的分析,我們知道了PID控制器各項的作用。然而注意,上面所說的一切都只是定性分析,下面讓我們來結(jié)合《信號與系統(tǒng)》以及《自動控制原理》的專業(yè)知識,來說一下PID更深層次的原理,沒有相關(guān)基礎(chǔ)的同學(xué)可以跳過這一部分。
我們引入傳遞函數(shù)來進行系統(tǒng)穩(wěn)定性的分析,一個閉環(huán)控制系統(tǒng)的系統(tǒng)框圖如下——
假設(shè)我們已經(jīng)獲得了云臺的傳遞函數(shù)(可以通過系統(tǒng)辨識獲得)
寫出PID控制器的s域表達式如下:
U(s)=Kp+Ki?1s+Kd?sU(s)=Kp+Ki?1s+Kd?s
通過調(diào)節(jié)積分項,使積分段作用于系統(tǒng)的低頻成分,保證系統(tǒng)穩(wěn)定性,將微分段作用于系統(tǒng)的高頻成分,保證系統(tǒng)的動態(tài)性能。
在自動控制原理中,我們知道一個系統(tǒng)穩(wěn)定的條件是該系統(tǒng)的極點全部位于復(fù)平面左側(cè)。所以任何控制器所做的首要任務(wù)是配置系統(tǒng)極點,舉一個例子。假設(shè)一個系統(tǒng)傳遞函數(shù)為
G(s)=1s?1G(s)=1s?1
顯然其開環(huán)不穩(wěn)定,其閉環(huán)傳函為
Φ(s)=G(s)1+G(s)H(s)=1sΦ(s)=G(s)1+G(s)H(s)=1s
顯然閉環(huán)系統(tǒng)極點在原點上,不穩(wěn)定
而在引入前饋純比例控制器
C(s)=2C(s)=2
之后,我們可以看到閉環(huán)傳函變?yōu)?/p>
Φ(s)=C(s)G(s)1+C(s)G(s)H(s)=2s+1Φ(s)=C(s)G(s)1+C(s)G(s)H(s)=2s+1
系統(tǒng)極點為s=-1,系統(tǒng)穩(wěn)定。
在保證系統(tǒng)穩(wěn)定的前提下,我們根據(jù)系統(tǒng)閉環(huán)傳遞函數(shù)的波特圖進行分析,使幅頻響應(yīng)和相頻響應(yīng)滿足幅度裕度條件和相位裕度條件,可以借助matlab的工具箱進行分析。
關(guān)于系統(tǒng)辨識以及根據(jù)系統(tǒng)辨識的結(jié)果設(shè)計控制器,可以參考官方的開源教程
https://bbs.robomaster.com/thread-4941-1-1.html
https://bbs.robomaster.com/thread-5059-1-1.html
當(dāng)然,沒有掌握這些知識不代表一個人不能調(diào)PID,同樣一個人掌握了這個知識也不等于他一定能夠調(diào)好PID,很多情況下系統(tǒng)的傳遞函數(shù)并不容易獲取,所以經(jīng)驗依然非常非常重要。
代碼實現(xiàn)
需要注意的是,前文我們一直在討論連續(xù)型PID控制器,但是單片機內(nèi)部是一個數(shù)字系統(tǒng),數(shù)字系統(tǒng)必然是離散的,所以我們需要把連續(xù)型PID轉(zhuǎn)換出離散型PID,當(dāng)然這一點其實也沒有任何難度,只不過是把積分變成求和,微分變成差分而已。
離散型PID公式如下
U(n)=Kp?err(n)+Ki?∑err(n)+Kd?[err(n)?err(n?1)]U(n)=Kp?err(n)+Ki?∑err(n)+Kd?[err(n)?err(n?1)]
眼尖的同學(xué)注意到我沒有把周期T寫在公式里面,其實考慮到周期是一個常數(shù),我把它直接合在了系數(shù)中。
這里對應(yīng)到代碼中,也告訴了我們兩件事
PID控制器的運算必須在定時中斷中執(zhí)行
采樣周期和控制周期會影響系數(shù)
關(guān)于第二點特別說明一下,一般來說增加控制周期和采樣周期是可以讓我們的控制變得更加平滑,控制周期即執(zhí)行控制代碼的周期,一般是放置運算PID代碼的定時器的周期,采樣周期即獲取傳感器數(shù)據(jù)的周期,比如電機的采樣周期就是CAN接收中斷的周期。
最后我們依然是結(jié)合官方開源代碼來理解PID的代碼實現(xiàn)。
這是pid.c下的pid_calculate函數(shù),結(jié)合公式可以很容易理解含義。set即期望,get即反饋,兩者相減得到誤差err,pid->pout即比例項,直接將err線性放大,pid->iout即積分項,對err進行累加,pid->dout即微分,對err做差分。最后將三者疊加得到pid控制器輸出。
/** * @brief calculate delta PID and position PID * @param[in] pid: control pid struct * @param[in] get: measure feedback value * @param[in] set: target value * @retval pid calculate output */ float pid_calculate(struct pid *pid, float get, float set) { pid->get = get; pid->set = set; pid->err = set - get; if ((pid->param.input_max_err != 0) && (fabs(pid->err) > pid->param.input_max_err)) return 0; pid->pout = pid->param.p * pid->err; pid->iout += pid->param.i * pid->err; pid->dout = pid->param.d * (pid->err - pid->last_err); abs_limit(&(pid->iout), pid->param.inte_limit); pid->out = pid->pout + pid->iout + pid->dout; abs_limit(&(pid->out), pid->param.max_out); return pid->out; }
調(diào)參技巧
最后說一點關(guān)于調(diào)參的問題,當(dāng)然不會具體到各個參數(shù)的調(diào)節(jié)上,因為這個東西往往是各執(zhí)一詞,不同的人調(diào)起PID來即使大思路一致,具體細(xì)節(jié)上依然可能會有各種各樣的不同。這里更多是推薦一些調(diào)參的工具,方法,注意事項等。
首先是工具,這里就要搬出我們無敵的Jscope了,在之前的博文中也提到過,這是一個非常便利的虛擬示波器,在mdk中由于只能看到數(shù)值,很難分析系統(tǒng)的動態(tài)性能,所以Jscope在這時可以派上大用處——
直接上官網(wǎng)就可以免費下載,建議使用比較新的版本,舊的版本存在不能查看結(jié)構(gòu)體內(nèi)部變量,不能正常畫浮點數(shù)波形等一些問題。
然后是方法,這里說的方法不是說PID的參數(shù)調(diào)節(jié)順序之類的(雖然正常人都是先調(diào)P然后I,D),而是如何設(shè)計輸入與如何評價輸出。設(shè)計輸入時,一般以階躍信號作為輸入,逐步提升階躍幅值以測定系統(tǒng)魯棒性。進一步測試時可以將窄方波脈沖當(dāng)作沖激信號來輸入,因為賽場上的沖擊一般是被可以看作沖激的,RM這個比賽一定程度上檢驗的就是穩(wěn)定性,對自己系統(tǒng)的穩(wěn)定性界限心知肚明對一個電控隊員來說是很重要的。
評價輸出則根據(jù)超調(diào)量,靜差,恢復(fù)時間等參數(shù)作為指標(biāo)。理想的輸出曲線自然是能夠又快又不超調(diào)的貼合上期望曲線,然后根據(jù)實際情況來調(diào)整參數(shù),出現(xiàn)超調(diào)時適當(dāng)衰減比例項,恢復(fù)時間過長時適當(dāng)減小積分項,增大微分項等等。必須在調(diào)參的一開始就定好系統(tǒng)的靜態(tài)和動態(tài)性能指標(biāo),有的放矢才能提高效率。
最后是注意事項:記得給控制器的輸出限制幅度,切記,切記,切記,被鐵疙瘩狠狠打一下或者撞一下,輕則瘀傷,重則傷筋動骨,希望各位電控同學(xué)注意自己的生命安全。一般調(diào)車時我個人不會把車放在地上調(diào),而是放在車架上,這樣可以在一定程度上避免跑飛帶來的危險。
另外可以適當(dāng)考慮采用無線下載器,磁吸附線等,保護好自己的下載器也是很重要的,在越來越多的隊伍使用滑環(huán)做小陀螺的RM賽場上,云臺抽風(fēng)打轉(zhuǎn)很有可能直接扯斷下載線......
結(jié)語
關(guān)于PID就先說這么多了,還是那句話,實踐出真知。掌握PID的理論可以幫助一個人更加科學(xué)地去調(diào)參,但是光有理論沒有實踐是沒有意義的,還是得多調(diào),積累經(jīng)驗才行。
編輯:hfy
-
單片機
+關(guān)注
關(guān)注
6039文章
44579瀏覽量
636439 -
控制器
+關(guān)注
關(guān)注
112文章
16398瀏覽量
178533 -
PWM
+關(guān)注
關(guān)注
114文章
5193瀏覽量
214221 -
霍爾傳感器
+關(guān)注
關(guān)注
27文章
726瀏覽量
63259 -
PID控制器
+關(guān)注
關(guān)注
2文章
173瀏覽量
18609
發(fā)布評論請先 登錄
相關(guān)推薦
評論