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