天天看點

# Arduino小車PID調速——整定參數初試水Arduino小車PID調速——整定參數初試水

Arduino小車PID調速——整定參數初試水

在實作了小車較為可靠的測速基礎上,便可以正式開展PID調速實驗了。本文是基于使用Arduino平台上由Brett Beauregard大神寫的PID庫進行參數整定的,側重于在對PID算法有基本了解下,通過實驗自己動手整定參數,觀察不同的參數值對小車調速效果的影響,進而對PID算法産生感性的認知。

PID基本知識

所謂PID算法,是一種在工程應用領域被使用最為廣泛的負回報調節方法,通過PID算法中比例、積分、微分三個部分的作用,達到使系統穩定的效果。有關PID的介紹在網絡上已經非常多且詳細,本文不再展開論述。

公式

Output=Kpe(t)+KI∫e(t)dt+KDddte(t)

Where:e=Setpoint−Input

上面的公式是一種最為常見的PID算法形式,由比例、積分、微分三個部分組成,在實際工作中三者互相配合作用于控制系統

P就是比例作用,是把調節器的輸入偏差乘以一個系數,作為調節器的輸出,它能夠使系統趨于穩定,但卻不能有效地使系統達到設定值

I就是積分作用,它的作用使如果系統存在輸入偏差,那麼積分作用将使系統按照一定的速度向一個方向累加下去,它的作用在于可以消除系統靜态偏差,讓系統達到設定值

D就是微分作用,能夠起到超前調節的作用,即如果被調量沒有變化,則微分作用不産生變化,一旦發生變化,則微分作用可以很快的做出響應。

以上是PID的公式和各個參數的意義的簡單陳述,目的在于産生一個基本的認識,而對于真正進行PID參數整定的實際工作來說,還是遠遠不夠的,需要不斷地深入了解各個參數對系統的影響以及多個參數之間的關系。

參數整定口訣

這裡筆者比較推崇由白志剛編著的《自動調節系統解析與PID整定》一書中的趨勢讀定法整定口訣

自動調節并不難,複雜系統化簡單

整定要練硬功夫,圖形特征看熟練

趨勢讀定三要素,設定被調和輸出

三個曲線放一起,然後曲線能判讀

積分微分先去掉,死區暫時也不要

比例曲線最簡單,被調輸出一般

頂點谷底同時刻,升降同時同拐點

波動周期都一樣,靜态偏差沒辦法

比例從弱漸調強,階躍響應記時間

時間放大十來倍,調節周期約在内

然後比例再加強,沒有周期才算對

靜差消除靠積分,能消靜差就算穩

不管被調升或降,輸出直覺偏差存

輸入偏差等于零,輸出才會不積分

積分不可加太強,幹擾調節成擾因

被調拐點零點間,輸出拐點仔細辨

積分拐點再靠前,既消靜差又不亂

微分分辨最容易,輸入偏差多注意

偏差不動微分死,偏差一動就積極

跳動之後自動回,微分時間管回歸

系統若有大延遲,微分超前最合适

風壓水位易波動,微分作用要丢棄

比例積分和微分,曲線判讀特征真

如果不會看曲線,多看杖策行吟文

綜合比較靈活用,盛極衰來扼殺因

參數整定

首先需要将PID庫運用到自己已能實作測速功能的程式中,接下來隻需調節Kp、Ki、Kd三個參數即可。

第一步:純比例作用整定

由于是第一次進行PID參數整定,筆者先以把小車速度整定到250mm/s為目标,在程式中輸入設定值。根據上面的口訣,先把系統設定為純比例作用,即隻有比例增益Kp不為0,積分增益Ki和微分增益Kd都暫時設定為0.因為是這個小車第一次整定參數,筆者也不知道什麼比例增益比較好。根據口訣所說比例作用從弱到強調節,是以筆者就随便寫了個自認為不大的值2,然後觀察小車運作情況。實際的運作結果令我大吃一驚,小車電機以一定的周期在轉和不轉之間震蕩。根據口訣中“然後比例再加強,沒有周期才算對”得知,肯定是比例作用已經非常大了,是以趕緊将比例增益調整為0.2,小車的電機不再出現劇烈的“抽搐”,開始以一種比較緩慢的姿态轉動,但通過觀察輸出波形,還是存在較小的波動,而根據網上查閱資料得,比例作用過分小也會導緻系統震蕩,但與之前較大比例作用下的震蕩相比,顯然“溫柔”多了。于是筆者繼續增加比例作用,直至Kp = 0.7時,輸出波形已經相較其他參數下穩定很多了。

# Arduino小車PID調速——整定參數初試水Arduino小車PID調速——整定參數初試水

第二步:比例積分作用

由上圖可看出,一個适合的比例作用可以使系統趨于穩定,但卻無法消除靜态偏差,是以需要引入積分作用,其最大的好處就是可以消除靜态偏差。筆者繼續采用由小逐漸加大積分增益的方式。當設定Ki = 0.3時,由圖可見

# Arduino小車PID調速——整定參數初試水Arduino小車PID調速——整定參數初試水

靜态偏差逐漸減小,輸出的速度越來越接近設定的250mm/s的目标,不過調節速度太慢,還是不能滿足需求。

于是繼續加積分作用,當Ki = 5時,可以看出,系統反應速度已經很快,可以在0.1秒内

# Arduino小車PID調速——整定參數初試水Arduino小車PID調速——整定參數初試水

由波形可以看出,此時速度已基本能夠快速準确地達到設定值,但仍然存在着些許波動。在比例積分作用下産生波動,可能是由于比例作用過大,也有可能是積分作用過強産生了積分幹擾,是以可以适當降低比例或積分作用,來嘗試減弱波動。由于比例作用和積分作用是相對的,是以為了使系統穩定,降低其中一種作用時,另外一種作用也要随之降低。故把參數設定為Kp = 0.65,Ki = 4.5,此時效果如圖

# Arduino小車PID調速——整定參數初試水Arduino小車PID調速——整定參數初試水

可明顯看出,速度得到進一步的穩定,且系統反應迅速,在不到0.1秒的時間内便使速度達到穩定。考慮到測速中存在的幹擾以及電機機械轉動的問題,剩餘的些許波動可以被忽略。

第三步:測試在其他速度下的效果

以上的實驗是建立在設定速度恒定為250mm/s的條件下進行的,能保證在250mm/s的速率下良好的調節效果,而這個參數是否适合在其他速率下工作,還需要進一步測試。

一、低速運作情況下

當筆者嘗試将速度設定為200mm/s時,再觀察波形,結果出現了非常頻繁的波動,極端情況下,達到設定速度附近一段時間後,系統居然開始出現越來越大的波動,越來越發散

# Arduino小車PID調速——整定參數初試水Arduino小車PID調速——整定參數初試水

由此可得出,在參數不變的情況下,适合一個特定速度的調節方式不一定适合低速條件,在低速條件下會出現不穩定。

是什麼導緻這樣波動的發生?比例作用可以使系統穩定,雖然積分可以消除靜态偏差,但如果比例設定的不合理,靜态偏差也難以被消除。而之前設定的參數是在250mm/s的情況下合适的,此時設定速度降低到200mm/s。比例作用是把調節器的輸入偏差乘以一個系數,作為調節器的輸出,是以可以設想此時比例作用相對于積分作用實際上偏向于減弱了。這就可能造成了積分作用過強,導緻積分幹擾。是以筆者嘗試降低積分作用, 并相應略微降低比例作用。将參數設定為Kp = 0.5,Ki = 2

# Arduino小車PID調速——整定參數初試水Arduino小車PID調速——整定參數初試水

可以看出,波動已得到一定的抑制,同時在運作一段時間後,不再出現波動範圍越來越大,波動周期越來越明顯的“抽搐”發生,證明了高速條件下的參數運用到低速條件下會出現積分幹擾的猜想。

二、高速運作情況下

筆者再次嘗試将适合250mm/s的參數運用到300mm/s,看看會有什麼情況發生。

# Arduino小車PID調速——整定參數初試水Arduino小車PID調速——整定參數初試水

對比250mm/s下的波形可以觀察得,在300mm/s下工作,系統的快速性變弱,系統的穩定時間比250mm/s下要長了一點,同時波形出現了小幅度的有周期震蕩。

系統穩定時間變長有兩方面的原因,第一可能是比例作用偏弱,會導緻難以消除靜态偏差,第二是積分作用偏弱也會導緻消除靜态偏差的過程變慢。比例作用偏強和偏弱都會導緻一定的震蕩,偏強時的曲線是周期性很強,基本呈正弦波形式的,而偏弱時候波動也會有一定的周期,但在一個波動周期内,往往摻雜着幾個小的波峰。由本圖可看出,此時的波動屬于比例作用偏小的情況。

當把參數調節到Kp = 0.75,Ki = 5.5時,得到的曲線如圖

# Arduino小車PID調速——整定參數初試水Arduino小車PID調速——整定參數初試水

很明顯,波動得到了抑制,穩定時間也縮短了。

總結

通過以上實驗證明了pid調速過程中,一個特定的參數僅對一定的速度區間有比較好的調節效果。若比這個速度低,則會出現比例積分作用過強,進而出現震蕩;若比這個速度高,則會出現比例作用不強,系統的穩定時間變長,且出現小幅度周期性波動的情況。

不足與改進

小車在實際工作中,不會一直隻工作在一個恒定的速度下,是以在進行PID調速時不能在一個速度下調成功了就覺得萬事大吉了。為了能達到PID調速對更大的速度區間内有效,一個簡單的辦法就是在電機低速轉動的情況下進行調速,這樣基本可以實作從慢速到高速都能速度穩定的效果,但這樣的一個缺點在于高速情況下穩定時間變長,且會出現小幅度周期性波動。在這個基礎上的一個改進辦法是通過分别調節低速、中速、高速三種不同情況下适合的PID,可以設定速度區間,當速度設定值落在某個區間内,則啟用适合那個速度下的PID參數進行調速。進一步深挖,可以嘗試自動整定參數,達到最好的PID調速效果。

以上是本人的一點嘗試和經驗,難免有不足之處,還望各位多多指教!

參考

  1. 白志剛《自動調節系統解析與PID整定》化學工業出版社

繼續閱讀