|
PID形象解釋
小明接到這樣一個(gè)任務(wù):
有一個(gè)水缸點(diǎn)漏水(而且漏水的速度還不一定固定不變),
要求水面高度維持在某個(gè)位置,
一旦發(fā)現(xiàn)水面高度低于要求位置,就要往水缸里加水。
小明接到任務(wù)后就一直守在水缸旁邊,
時(shí)間長(zhǎng)就覺得無(wú)聊,就跑到房里看小說了,
每30分鐘來檢查一次水面高度。水漏得太快,
每次小明來檢查時(shí),水都快漏完了,離要求的高度相差很遠(yuǎn)
,小明改為每3分鐘來檢查一次,結(jié)果每次來水都沒怎么漏
,不需要加水,來得太頻繁做的是無(wú)用功。幾次試驗(yàn)后,
確定每10分鐘來檢查一次。這個(gè)檢查時(shí)間就稱為采樣周期。
開始小明用瓢加水,水龍頭離水缸有十幾米的距離,
經(jīng)常要跑好幾趟才加夠水,于是小明又改為用桶加,
一加就是一桶,跑的次數(shù)少了,加水的速度也快了,
但好幾次將缸給加溢出了,不小心弄濕了幾次鞋,小明又動(dòng)腦筋,
我不用瓢也不用桶,老子用盆,幾次下來,發(fā)現(xiàn)剛剛好,不用跑太多次,
也不會(huì)讓水溢出。這個(gè)加水工具的大小就稱為比例系數(shù)。
小明又發(fā)現(xiàn)水雖然不會(huì)加過量溢出了,有時(shí)會(huì)高過要求位置比較多
,還是有打濕鞋的危險(xiǎn)。他又想了個(gè)辦法,在水缸上裝一個(gè)漏斗,
每次加水不直接倒進(jìn)水缸,而是倒進(jìn)漏斗讓它慢慢加。這樣溢出的問題解決了,
但加水的速度又慢了,有時(shí)還趕不上漏水的速度。
于是他試著變換不同大小口徑的漏斗來控制加水的速度
,最后終于找到了滿意的漏斗。漏斗的時(shí)間就稱為積分時(shí)間 。
小明終于喘了一口,但任務(wù)的要求突然嚴(yán)了,
水位控制的及時(shí)性要求大大提高,一旦水位過低,
必須立即將水加到要求位置,而且不能高出太多,否則不給工錢。
小明又為難了!于是他又開努腦筋,終于讓它想到一個(gè)辦法,常放一盆備用水在旁邊,
一發(fā)現(xiàn)水位低了,不經(jīng)過漏斗就是一盆水下去,這樣及時(shí)性是保證了,但水位有時(shí)會(huì)高多了。
他又在要求水面位置上面一點(diǎn)將水鑿一孔,再接一根管子到下面的備用桶里這樣多出的水會(huì)從上面的孔里漏出來。這個(gè)水漏出的快慢就稱為微分時(shí)間。
PID調(diào)節(jié)經(jīng)驗(yàn)總結(jié)
PID控制器參數(shù)選擇的方法很多,例如試湊法、臨界比例度法、擴(kuò)充臨界比例度法等。但是,對(duì)于PID控制而言,參數(shù)的選擇始終是一件非常煩雜的工作,需要經(jīng)過不斷的調(diào)整才能得到較為滿意的控制效果。依據(jù)經(jīng)驗(yàn),一般PID參數(shù)確定的步驟如下[42]:
(1) 確定比例系數(shù)Kp
確定比例系數(shù)Kp時(shí),首先去掉PID的積分項(xiàng)和微分項(xiàng),可以令Ti=0、Td=0,使之成為
純比例調(diào)節(jié)。輸入設(shè)定為系統(tǒng)允許輸出最大值的60%~70%,比例系數(shù)Kp由0開始逐漸增大,直至系統(tǒng)出現(xiàn)振蕩;再反過來,從此時(shí)的比例系數(shù)Kp逐漸減小,直至系統(tǒng)振蕩消失。記錄此時(shí)的比例系數(shù)Kp,設(shè)定PID的比例系數(shù)Kp為當(dāng)前值的60%~70%。
(2) 確定積分時(shí)間常數(shù)Ti
比例系數(shù)Kp確定之后,設(shè)定一個(gè)較大的積分時(shí)間常數(shù)Ti,然后逐漸減小Ti,直至系統(tǒng)出現(xiàn)振蕩,然后再反過來,逐漸增大Ti,直至系統(tǒng)振蕩消失。記錄此時(shí)的Ti,設(shè)定PID的積分時(shí)間常數(shù)Ti為當(dāng)前值的150%~180%。
(3) 確定微分時(shí)間常數(shù)Td
微分時(shí)間常數(shù)Td一般不用設(shè)定,為0即可,此時(shí)PID調(diào)節(jié)轉(zhuǎn)換為PI調(diào)節(jié)。如果需要設(shè)定,則與確定Kp的方法相同,取不振蕩時(shí)其值的30%。
(4) 系統(tǒng)空載、帶載聯(lián)調(diào)
對(duì)PID參數(shù)進(jìn)行微調(diào),直到滿足性能要求。
PID代碼
//定義變量
float Kp; //PI調(diào)節(jié)的比例常數(shù)
float Ti; //PI調(diào)節(jié)的積分常數(shù)
float T; //采樣周期
float Ki;
float ek; //偏差e[k]
float ek1; //偏差e[k-1]
float ek2; //偏差e[k-2]
float uk; //u[k]
signed int uk1; //對(duì)u[k]四舍五入取整
signed int adjust; //調(diào)節(jié)器輸出調(diào)整量
//變量初始化
Kp=4;
Ti=0。005;
T=0.001;
// Ki=KpT/Ti=0.8,微分系數(shù)Kd=KpTd/T=0.8,Td=0.0002,根據(jù)實(shí)驗(yàn)調(diào)得的結(jié)果確定這些參數(shù)
ek=0;
ek1=0;
ek2=0;
uk=0;
uk1=0;
adjust=0;
int piadjust(float ek) //PI調(diào)節(jié)算法
{
if( gabs(ek)<0.1 )
{
adjust=0;
}
else
{
uk=Kp*(ek-ek1)+Ki*ek; //計(jì)算控制增量
ek1=ek;
uk1=(signed int)uk;
if(uk>0)
{
if(uk-uk1>=0.5)
{
uk1=uk1+1;
}
}
if(uk<0)
{
if(uk1-uk>=0.5)
{
uk1=uk1-1;
}
}
adjust=uk1;
}
return adjust;
}
補(bǔ)充內(nèi)容(2012-7-17 09:07):
float gabs(float ek)
{
if (ek > 0) return ek; elsereturn -ek;
}
|
|