PID調(diào)試心得
本人不是自動化出身,也沒有受過專業(yè)訓(xùn)練,都是自己摸索,在這里淺述一下自己的PID參數(shù)整定心得。所言之物皆由實踐及自己的理解得出,如有不當之處還請指正。
首先例舉第一個例子,我調(diào)的第一臺四軸飛行器,十字型四軸飛行器,講下配置:
網(wǎng)上一百多的650機架,好贏20A電調(diào),新西達2212 1000kV,1045的槳,2200mah電池。
主控是STM32F103
這是第一個四軸的帖子
www點amobbs點com/thread-5539270-1-1.html
采用位置式PID控制,位置式PID公式如下
PID的基本意義我在次就不作闡述了,我只講我的設(shè)計,我以姿態(tài)角作為被控制對象,所以
e(k) = 期望-測量 = 給定值-測量姿態(tài)角
對于微分項D,我做了一點改變,標準PID的微分項D=kd*(e(k)-e(k-1)),我在實踐過程中因為角度的微分就是角速度,而陀螺儀可以直接測出角速度,
所以我沒有將微分項作為偏差的差而是直接用D=kd*Gyro
實現(xiàn)代碼如下
float pidUpdate(pidsuite* pid, const float measured,float expect,float gyro)
{
float output;
static float lastoutput=0;
pid->desired=expect; //獲取期望角度
pid->error = pid->desired - measured; //偏差:期望-測量值
pid->integ += pid->error * IMU_UPDATE_DT; //偏差積分
if (pid->integ > pid->iLimit) //作積分限制
{
pid->integ = pid->iLimit;
}
else if (pid->integ < -pid->iLimit)
{
pid->integ = -pid->iLimit;
}
// pid->deriv = (pid->error - pid->prevError) / IMU_UPDATE_DT; //微分 應(yīng)該可用陀螺儀角速度代替
pid->deriv = -gyro;
if(fabs(pid->error)>Piddeadband) //pid死區(qū)
{
pid->outP = pid->kp * pid->error; //方便獨立觀察
pid->outI = pid->ki * pid->integ;
pid->outD = pid->kd * pid->deriv;
output = (pid->kp * pid->error) +
(pid->ki * pid->integ) +
(pid->kd * pid->deriv);
}
else
{
output=lastoutput;
}
pid->prevError = pid->error; //更新前一次偏差
lastoutput=output;
return output;
}
我這么做的原因是因為,如果使用傳統(tǒng)的D的形式,在我快速打舵時會產(chǎn)生輸入的設(shè)定值變化頻繁且幅度較大,四軸飛行器會迅速回到新的期望點,說白了就是非常靈活,四軸回復(fù)很猛,也許造成系統(tǒng)的振蕩,對PID參數(shù)要求較高。如果用角速度代替的話,那怕你打舵非?欤妮S會較平穩(wěn)的回到新位置,運動較柔和。對于我這種操作菜鳥來說無疑后面一種會更合適,所以我選擇了D=kd*Gyro的方式。
PID控制器我大概就是這么實現(xiàn)的,下面講講我在調(diào)試過程中具體遇到的問題。首先我將四軸固定在單軸平衡平臺上,讓飛行器完成單軸平衡,主要觀察姿態(tài)角的
(1)穩(wěn)定性,能否平衡在期望角度;
(2)響應(yīng)性,當操縱命令改變時,四軸能否即時的響應(yīng)期望的變化;
(3)操縱性,由操縱員感受四軸的姿態(tài)是否已與操縱,會不會產(chǎn)生響應(yīng)過沖。
我先調(diào)一個軸的平衡再調(diào)另外一個軸,最后調(diào)YAW軸。
A:開始只調(diào)P,將I,D置0。由于不知道PID的大致范圍我就隨便給了一組值
:P=1,I=0,D=0觀察現(xiàn)象。一開電機四軸就開始劇烈左右搖擺,很明顯P給大了。然后P從小了往上加。從P=0.1開始試。調(diào)試的時候我就發(fā)現(xiàn)了一個現(xiàn)象就是我的四軸往一邊歪,離平衡的0度差了那么一個角度A,P=0.1時A較大,除非油門推到很大否則四周根本起不來,這是P說明給小了,我再將P=0.2這時四軸狀況無明顯改善。于是我直接將P加大一點P=0.8,P=0.8時已經(jīng)可以看出在等幅震蕩了,但是不是在0度的平衡位置,也是偏離的一個角度B,此時B較小了。之后我再加大P到1四軸震蕩又變大了,但是到震蕩中心到零度的靜差還是存在。由于此時I=0,所以我決定不管這個靜差,先把P的臨界震蕩點找到。P=0.8時可以觀察到比較明顯的等幅震蕩了,P=0.2時四軸又顯得的無力,所以P應(yīng)該在0.2~0.8之間。臨界震蕩點就是P從為震蕩到,剛開始震蕩的點。
在這里還應(yīng)注意一點,當P太小時,四軸在很大傾斜的地方,在重力與P的作用下也會震蕩,這種震蕩不是等幅的,也不是對稱的,震蕩波谷的絕對值明顯要比波峰絕對值大而且距離0度會很遠。這種情況要加以區(qū)分。
我把P從0.2到0.8開始嘗試,找到一個適合的點,即剛開是出現(xiàn)震蕩的P值最后我定為0.5。注:此時還是有靜差。
在以上過程中在一開始我一直想通過P來消除靜差,但是我發(fā)現(xiàn)我把P加到很大,已經(jīng)震蕩的很劇烈了,四軸的震蕩中心都不是在0度位置。所以我只能選擇先選好P,D最后加入I來解決這個問題。
P=0.5時四軸在他的穩(wěn)定位置震蕩比較小了,但是在外力干擾下很難在穩(wěn)定下來,抗干擾能力較差。然后我開始調(diào)D。
在平衡過程中P相當于四軸的回復(fù)力,它要努力時四軸在一個穩(wěn)定的平衡位置,但這個位置不一定是你的期望點。個人認為就是當偏差不在變化時,pid的輸出也沒有變化了,所以有可能光用P時穩(wěn)定的位置不一定是平衡的期望的位置。而D是阻尼力,他在四軸有速度的情況下才發(fā)揮作用,它與速度方向相反始終是抑制運動。所以他可以抑制震蕩,但是他同樣也可以抑制P的作用,當震動產(chǎn)生時,在震動的中心點四軸震動速度最大,也是D作用最強的時刻。
剛開始調(diào)D的時我就范了一個錯誤。因為我改了D的標準型,而D應(yīng)該是抑制運動的,但是陀螺儀輸出的數(shù)據(jù)符號導(dǎo)致我這里D變成了增加運動,所以一開始無論我怎么調(diào)整D,都會激發(fā)震蕩。后來我在參數(shù)前加了個符號就好了。在這里我提醒要始終注意D是阻尼力,是其抑制震蕩也就是運動的作用的,它始終期望的是它所作用的對象沒有運動,至于停在什么位置不是D所關(guān)心的,那是P,I所關(guān)心的。所以直接用陀螺儀數(shù)據(jù)代替偏差的差得話就得注意下。修正這個問題后加了D效果就比較明顯了,四軸在外力的干擾先能明顯的有回復(fù)力且,能快速穩(wěn)定在平衡點了,調(diào)D就是試,當然D大了也會產(chǎn)生震蕩,但是此時不加D時光P作用時的震蕩就很小,很明顯就可以看出隨著D的增大,震蕩減小又增大的過程。最后P=0.4,D=0.15。
最后定好了P,D后我的四軸還是有靜差,不能穩(wěn)定在期望的0點。網(wǎng)上有很多四軸只用PD,在這里我決定根據(jù)我的實際情況加入I。調(diào)I的時候我先把積分限幅去掉。然后從小往大加,當調(diào)平衡時,隨著油門的變大,靜差應(yīng)該是越來小的。我將油門推到差不多快要將四軸推離地面的位置,看I能不能消除靜差。因為如果油門給小了,靜差較大,調(diào)出來的I雖然能消除靜差但是I比較大,在加油門時有可能也會產(chǎn)生超調(diào)震蕩。最后I要再能消除靜差又不產(chǎn)生震蕩,個人認為要近可能小。最后加上合適的積分限幅。P:0.4,I:0.35,D:0.15。
別忘了以上調(diào)試過程中每次都需要給予平衡一個干擾,看看參數(shù)在外界干擾情況下做的如何,會不會產(chǎn)生超調(diào)震蕩,會不會長時間才能穩(wěn)定。以上就是我第一臺四軸的PID調(diào)試。
下面我講講我在調(diào)第二個X四軸過程中遇到的問題。
第二架四軸是我做了用來參加愛板網(wǎng)的ARM-STM32校園比賽的,因為第一架屬于學(xué)校了財產(chǎn)留在學(xué)校了,手里沒有,只好再搞一個。
第二架的配置采用的是飛越的650碳纖機架,電調(diào)用的是好贏的奔騰40A,電機同樣是新西達2212 1000kV。主控是STM32F407
其實這個機架和電調(diào)配這個電機是大才小用了,但是我的預(yù)算實在不夠了就只好買了個水一點的電機,等以后再升級。
這次我采用X型四軸,主要是掛了云臺。PID的設(shè)計與之前講的一樣,就不多說了直接說調(diào)試中遇到的問題。
調(diào)試方法還是先調(diào)平衡桿,如圖:
剛開始調(diào)X的時候我以為跟十字的差不多,于是我只是簡單的把原有PID參數(shù)按照新的程序里面的PWM值域縮放了一下倍數(shù),但是發(fā)現(xiàn)不行,PID完全沒有起作用。
具體表現(xiàn)為四軸開機后直往一邊倒到底。只好重新開始調(diào)。
還是P=1,I=0,D=0開始,這組參數(shù)我發(fā)現(xiàn),開機后四軸往一邊倒,但是沒有倒下就起不來了,而是在倒到一個很大的角度,大概70度左右,電機力量像是突然加大,四軸起來,反向,接著倒向另外一邊。進入失控的大幅震蕩。
因為一開始就倒,所以是P太小。于是我開始加大P,但是當我把P加到很大時,四軸還是一開始往一邊倒,然后電機力量增大,四軸翻倒向另外一邊,開始發(fā)散性的震蕩。此時我覺得開始P比較小的時候是P不足,電機的慣性的作用下開始震蕩。到后來是P太大了,直接進入震蕩。我始終沒有觀察到一個等幅震蕩或者說接近小幅震蕩的點。無論P大P小我的四軸都會進入失控的發(fā)散震蕩。換而言之這個X四軸光靠P根本進入不不了一個比較穩(wěn)定的狀態(tài)或者接近穩(wěn)定的狀態(tài)。連相對穩(wěn)定的等幅震蕩都觀察不到就直接進入發(fā)散的震蕩。此時我開始困惑了。這個情況跟十字的很不一樣。我沒有明顯觀察到網(wǎng)上流傳最通俗的調(diào)節(jié)PID說法的那種情況,即:逐漸加大P直到開始發(fā)生等幅震蕩,然后P不變,加入D抑制震蕩。。。
我觀察到的是P無論怎么給,我的四軸都倒向一邊然后開始進入發(fā)散的震蕩,唯一的區(qū)別就是P小一開始倒下的角度大,P越大一開始倒下得角度越小,進入震蕩的越快。此種情況與前一個四軸的情況截然不同。
當我潛入困境時,以為名叫螃蟹的網(wǎng)友幫助了我。他告訴我定P要定在把手放開,開始震蕩,只要左右晃二三次就達到大晃動幅度,大晃動幅度大概是45度左右。定下這個P值后然后加入D,而且D有可能比P大。在這個基礎(chǔ)上我又開始了調(diào)試。
從頭來調(diào)P,這次我觀察到新現(xiàn)象。我把四軸稍微傾向一邊幾度,比如說左邊,當P小時,啟動電機松手后,四軸向左倒,如果P大了,四軸回向右倒。前者是補償不足,后者是補償過度。在這個兩個P值得區(qū)間就有我們要找的P,合適的P就是能在平衡位置掙扎左右晃幾下的值。此時我的P=3.0但是光靠P四軸還是站不住,只能在平衡位置堅持個1,2s。所以得加入D,嘗試D=1,2,3時沒什么明顯的效果只能觀察到起初的短時平衡跟穩(wěn)定了點。D=10時可明顯觀察到平衡的時間跟長了,但還是會倒。當D=20,可明顯觀察到四軸可以基本平衡了,但還是有有小幅震蕩,一但有干擾還是不能很快恢復(fù)穩(wěn)定了,D=30時四軸已經(jīng)開始比之前大的等幅震蕩了,而且當有外力干擾時四軸也能抵抗住外力維持自身在平衡位置的震蕩狀態(tài),說明D有起作用但是D大了。在這種情況下還說明P還是給小了,回復(fù)力不足。我把D定在25,再開始調(diào)節(jié)P,把P加大。增強恢復(fù)力。后面得的調(diào)節(jié)過程中我就是感覺,P會產(chǎn)生一種震蕩A,這種A震蕩是會發(fā)散的,頻率較低。D也會產(chǎn)生一種震蕩B,B是等幅的,頻率較高的。然后P會抑制震蕩B,但會激發(fā)A,D會抑制震蕩A,但會激發(fā)B。后面的調(diào)節(jié)參數(shù)就是要調(diào)好P后再調(diào)D,定好D再調(diào)節(jié)P,兩個參數(shù)互相扶持的趨近一個最佳點,想單靠一個參數(shù)一次就接近理想值是辦不到的。當然機體表現(xiàn)出的等幅震蕩時也不一定是D大了,P不合適同樣也會產(chǎn)生此種情況。還有調(diào)節(jié)參數(shù)時不要一味只加不減。當我P=4,D=50時我就是將P往回減了點才取得了更好的效果。最后離開平衡桿時P=3.5,D=50。這次沒有靜差,所以沒有I項。
最后來總結(jié)幾點:
1.我覺得調(diào)節(jié)PID首先要明白最基本PID三項的意義P是回復(fù)力是系統(tǒng)平衡的主力,D是阻尼力,始終是抑制作用,I雖然能使系統(tǒng)回復(fù)但是I大了容易激發(fā)震蕩,所以I只能是輔助P
2.一般從P開始調(diào)節(jié)時候首先要找到臨界震蕩點,要學(xué)會辨識系統(tǒng)臨界震蕩點的特點,不同系統(tǒng)臨界狀態(tài)可能不同,在這一點上用曲線代替肉眼直接觀察效果好的多。
3.P不一定就比D大,切不可經(jīng)驗主義,一切遵循實際,多嘗試可能性
4.調(diào)節(jié)PID最麻煩的就是會產(chǎn)生震蕩,只要參數(shù)不合適都會產(chǎn)生震蕩,初學(xué)者往往心急不知如何下手,其實是不同參數(shù)不合適而產(chǎn)生的震蕩都有所區(qū)別,要細心觀察,最好是能看PID輸出,被調(diào)量,設(shè)定值三者的曲線圖,通過圖來對比特征曲線得出震蕩產(chǎn)生的原因,關(guān)于曲線特征判別我推薦下面附件中的篇文獻。
5.調(diào)節(jié)參數(shù)是個令人蛋疼的活,一定要心平氣和,切莫急躁,多多嘗試,我覺得一個平靜的心態(tài)是在調(diào)PID時很重要,能讓你腦子清醒的看清問題。調(diào)參數(shù)很枯燥,如果 你很煩或者很著急,調(diào)不出來只會讓你更加煩躁,更迷糊。還有就是耐心,多試。參數(shù)選擇剛開始不知道大致范圍時參數(shù)嘗試變化范圍可以大一點。確定范圍后就要耐心的一點點的加。
6.以上所言都是針對位置式PID,增量式PID三組參數(shù)所起作用與位置式大相徑庭,不可套用。
7.多與人交流,在這里再次感謝指導(dǎo)我的諸多網(wǎng)友
8.調(diào)節(jié)PID最好能看曲線圖,判別特征曲線,又曲線來看特征比直接看物體表現(xiàn)好得多
然后貼上我認為對我?guī)椭容^大的兩個PID資料,一個講PID基本定義,一個講PID參數(shù)整
|