PID算法通俗講解_第1頁(yè)
PID算法通俗講解_第2頁(yè)
PID算法通俗講解_第3頁(yè)
PID算法通俗講解_第4頁(yè)
PID算法通俗講解_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、精選文檔總所周知,PID算法是個(gè)很經(jīng)典的東西。而做自平衡小車,飛行器PID是一個(gè)必需翻過(guò)的坎。因此本節(jié)我們來(lái)好好講解一下PID,依據(jù)我在學(xué)習(xí)中的體會(huì),力求通俗易懂。并舉出PID的形象例子來(lái)掛念理解PID。一、首先介紹一下PID名字的由來(lái):P:Proportion(比例),就是輸入偏差乘以一個(gè)常數(shù)。I  :Integral(積分),就是對(duì)輸入偏差進(jìn)行積分運(yùn)算。D:Derivative(微分),對(duì)輸入偏差進(jìn)行微分運(yùn)算。注:輸入偏差=讀出的被把握對(duì)象的值-設(shè)定值。比如說(shuō)我要把溫度把握在26度,但是現(xiàn)在我從溫度傳感器上讀出溫度為28度。則這個(gè)26度就是”設(shè)定值“,28度就是“讀出的

2、被把握對(duì)象的值”。然后來(lái)看一下,這三個(gè)元素對(duì)PID算法的作用,了解一下即可,不懂不用牽強(qiáng)。P,打個(gè)比方,假如現(xiàn)在的輸出是1,目標(biāo)輸出是100,那么P的作用是以最快的速度達(dá)到100,把P理解為一個(gè)系數(shù)即可;而I呢?大家學(xué)過(guò)高數(shù)的,0的積分才能是一個(gè)常數(shù),I就是使誤差為0而起調(diào)和作用;D呢?大家都知道微分是求導(dǎo)數(shù),導(dǎo)數(shù)代表切線是吧,切線的方向就是最快到至高點(diǎn)的方向。這樣理解,最快獲得最優(yōu)解,那么微分就是加快調(diào)整過(guò)程的作用了。二、然后要知道PID算法具體分兩種:一種是位置式的 ,一種是增量式的。在小車?yán)镆话阌迷隽渴?,為什么呢?位置式PID的輸出與過(guò)去的全部狀態(tài)有關(guān),計(jì)算時(shí)要對(duì)e(每一次的把握誤差)進(jìn)

3、行累加,這個(gè)計(jì)算量格外大,而明顯沒(méi)有必要。而且小車的PID把握器的輸出并不是確定數(shù)值,而是一個(gè),代表增多少,減多少。換句話說(shuō),通過(guò)增量PID算法,每次輸出是PWM要增加多少或者減小多少,而不是PWM的實(shí)際值。所以明白增量式PID就行了。三、接著講PID參數(shù)的整定,也就是PID公式中,那幾個(gè)常數(shù)系數(shù)Kp,Ti,Td等是怎么被確定下來(lái)然后帶入PID算法中的。假如要運(yùn)用PID,則PID參數(shù)是必需由自己調(diào)出來(lái)適合自己的項(xiàng)目的。通常四旋翼,自平衡車的參數(shù)都是由自己一個(gè)調(diào)整出來(lái)的,這是一個(gè)繁瑣的過(guò)程。本次我們可以不管,關(guān)于PID參數(shù)怎么確定的,網(wǎng)上有很多閱歷可以借鑒。比如那個(gè)經(jīng)典的閱歷試湊口訣: 

4、;                        參數(shù)整定找最佳, 從小到大挨次查。                         先是比例后積分, 最終再把微分加。              &#

5、160;          曲線振蕩很頻繁, 比例度盤要放大。                         曲線漂移繞大彎, 比例度盤往小扳。                         曲線偏離回復(fù)慢, 積分時(shí)

6、間往下降。                         曲線波動(dòng)周期長(zhǎng), 積分時(shí)間再加長(zhǎng)。                         曲線振蕩頻率快, 先把微分降下來(lái)。            

7、;             動(dòng)差大來(lái)波動(dòng)慢, 微分時(shí)間應(yīng)加長(zhǎng)。                         抱負(fù)曲線兩個(gè)波, 前高后低四比一。                         一看

8、二調(diào)多分析, 調(diào)整質(zhì)量不會(huì)低。四、接下來(lái)我們用例子來(lái)幫助我們把常用的PID模型講解了。(PID把握并不肯定要三者都消滅,也可以只是PI、PD把握,關(guān)鍵打算于把握的對(duì)象。)(下面的內(nèi)容只是介紹一下PID模型,可以不看,對(duì)理解PID沒(méi)什么用)例子:我們要把握一個(gè)人,讓他一PID的把握方式來(lái)行走110步后停下來(lái)。1)P比例把握,就是讓他依據(jù)肯定的比例走,然后停下。比如比例系數(shù)為108,則走一次就走了108步,然后就不走了。說(shuō)明:P比例把握是一種最簡(jiǎn)潔的把握方式,把握器的輸出與輸入誤差信號(hào)成比例關(guān)系。但是僅有比例把握時(shí)系統(tǒng)輸出存在穩(wěn)態(tài)誤差。比如上面的只能走到108,無(wú)論怎樣都走不到110。2)PI積分

9、把握,就是依據(jù)肯定的步伐走到112步然后回頭接著走,走到108步位置時(shí),然后又回頭向110步位置走。在110位置處來(lái)回晃蕩幾次,最終停在110步的位置。說(shuō)明:在積分I把握中,把握器的輸出與輸入誤差信號(hào)的積分成正比關(guān)系。對(duì)一個(gè)自動(dòng)把握系統(tǒng)來(lái)說(shuō),假如在進(jìn)入穩(wěn)態(tài)后存在穩(wěn)態(tài)誤差,則稱這個(gè)把握系統(tǒng)是有穩(wěn)態(tài)誤差的或簡(jiǎn)稱有差系統(tǒng)。為了消退穩(wěn)態(tài)誤差,在把握器中必需引入“積分項(xiàng)”。積分項(xiàng)對(duì)誤差的影響取決于時(shí)間的積分,隨著時(shí)間的增加,積分項(xiàng)會(huì)增大。這樣,即便誤差很小,積分項(xiàng)也會(huì)隨著時(shí)間的增加而加大,它推動(dòng)把握器的輸出增大,從而使穩(wěn)態(tài)誤差進(jìn)一步減小,直到等于0。因此,比例+積分(PI)把握器可以使系統(tǒng)在進(jìn)入穩(wěn)態(tài)后無(wú)

10、穩(wěn)態(tài)誤差。3)PD微分把握,就是依據(jù)肯定的步伐走到一百零幾步后,再漸漸地走向110步的位置靠近,假如最終能精確停在110步的位置,就是無(wú)靜差把握;假如停在110步四周(如109步或111步位置),就是有靜差把握。說(shuō)明:在微分把握D中,把握器的輸出與輸入誤差信號(hào)的微分(即誤差的變化率)成正比關(guān)系。      自動(dòng)把握系統(tǒng)在克服誤差的調(diào)整過(guò)程中可能會(huì)消滅振蕩甚至失穩(wěn),緣由是存在較大慣性組件(環(huán)節(jié))或滯后組件,具有抑制誤差的作用,其變化總是落后于誤差的變化。解決的方法是使抑制誤差作用的變化“超前”,即在誤差接近于零時(shí),抑制誤差的作用就應(yīng)當(dāng)是零。這就是說(shuō),在把握

11、器中僅引入“比例P”項(xiàng)往往是不夠的,比例項(xiàng)的作用僅是放大誤差的幅值,而目前需要增加的是“微分項(xiàng)”,它能猜測(cè)誤差變化的趨勢(shì)。這樣,具有比例+微分的把握器就能夠提前使抑制誤差的把握作用等于零,甚至為負(fù)值,從而避開了被控量的嚴(yán)峻超調(diào)。所以對(duì)有較大慣性或滯后的被控對(duì)象,比例P+微分D(PD)把握器能改善系統(tǒng)在調(diào)整過(guò)程中的動(dòng)態(tài)特性。五、用小明來(lái)說(shuō)明PID:       小明接到這樣一個(gè)任務(wù):有一個(gè)水缸有點(diǎn)漏水(而且漏水的速度還不肯定固定不變),要求水面高度維持在某個(gè)位置,一旦發(fā)覺(jué)水面高度低于要求位置,就要往水缸里加水。 小明接到任務(wù)后就始終守在水缸旁邊,時(shí)間長(zhǎng)就覺(jué)

12、得無(wú)聊,就跑到房里看小說(shuō)了,每30分鐘來(lái)檢查一次水面高度。水漏得太快,每次小明來(lái)檢查時(shí),水都快漏完了,離要求的高度相差很遠(yuǎn),小明改為每3分鐘來(lái)檢查一次,結(jié)果每次來(lái)水都沒(méi)怎么漏,不需要加水,來(lái)得太頻繁做的是無(wú)用功。幾次試驗(yàn)后,確定每10分鐘來(lái)檢查一次。這個(gè)檢查時(shí)間就稱為采樣周期。 開頭小明用瓢加水,水龍頭離水缸有十幾米的距離,經(jīng)常要跑好幾趟才加夠水,于是小明又改為用桶加,一加就是一桶,跑的次數(shù)少了,加水的速度也快了,但好幾次將缸給加溢出了,不當(dāng)心弄濕了幾次鞋,小明又動(dòng)腦筋,我不用瓢也不用桶,老子用盆,幾次下來(lái),發(fā)覺(jué)剛剛好,不用跑太多次,也不會(huì)讓水溢出。這個(gè)加水工具的大小就稱為比例系數(shù)。 

13、0;      小明又發(fā)覺(jué)水雖然不會(huì)加過(guò)量溢出了,有時(shí)會(huì)高過(guò)要求位置比較多,還是有打濕鞋的危急。他又想了個(gè)方法,在水缸上裝一個(gè)漏斗,每次加水不直接倒進(jìn)水缸,而是倒進(jìn)漏斗讓它漸漸加。這樣溢出的問(wèn)題解決了,但加水的速度又慢了,有時(shí)還趕不上漏水的速度。于是他試著變換不同大小口徑的漏斗來(lái)把握加水的速度,最終最終找到了滿足的漏斗。漏斗的時(shí)間就稱為積分時(shí)間。        小明最終喘了一口,但任務(wù)的要求突然嚴(yán)了,水位把握的準(zhǔn)時(shí)性要求大大提高,一旦水位過(guò)低,必需馬上將水加到要求位置,而且不能高出太多,否則不給工錢。小明又犯難了!于是他又開

14、努腦筋,最終讓它想到一個(gè)方法,常放一盆備用水在旁邊,一發(fā)覺(jué)水位低了,不經(jīng)過(guò)漏斗就是一盆水下去,這樣準(zhǔn)時(shí)性是保證了,但水位有時(shí)會(huì)高多了。他又在要求水面位置上面一點(diǎn)將水缸要求的水平面處鑿一孔,再接一根管子到下面的備用桶里這樣多出的水會(huì)從上面的孔里漏出來(lái)。這個(gè)水漏出的快慢就稱為微分時(shí)間。六、在代碼中理解PID:(好好看注釋,很好理解的。留意結(jié)合下面PID的公式)首先看PID的增量型公式:PID=Uk+KP*【E(k)-E(k-1)】+KI*E(k)+KD*【E(k)-2E(k-1)+E(k-2)】在單片機(jī)中運(yùn)用PID,出于速度和RAM的考慮,一般不用浮點(diǎn)數(shù),這里以整型變量為例來(lái)敘述PID在單片機(jī)中的

15、運(yùn)用。由于是用整型來(lái)做的,所以不是很精確。但是對(duì)于一般的場(chǎng)合來(lái)說(shuō),這個(gè)精度也夠了,關(guān)于系數(shù)和溫度在程序中都放大了10倍,所以精度不是很高,但是大部分的場(chǎng)合都?jí)蛄耍舨粔?,可以再放?0倍或者100倍處理,不超出整個(gè)數(shù)據(jù)類型的范圍就可以了。一下程序包括PID計(jì)算和輸出兩部分。當(dāng)偏差>10度時(shí)全速加熱,偏差在10度以內(nèi)時(shí)為PID計(jì)算輸出。程序說(shuō)明:下面的程序,先看main函數(shù)。可知在對(duì)定時(shí)器0初始化后就始終在執(zhí)行PID_Output()函數(shù)。在PID_Output()函數(shù)中先用iTemp變量來(lái)得到PID運(yùn)算的結(jié)果,來(lái)打算是啟動(dòng)加熱絲加熱還是不啟動(dòng)加熱絲。下面的if語(yǔ)句結(jié)合定時(shí)器來(lái)打算PID算

16、法多久執(zhí)行一次。PID_Operation()函數(shù)看似很簡(jiǎn)單,其實(shí)就始終在做一件事:依據(jù)供應(yīng)的數(shù)據(jù),用PID公式把最終的PID值算出來(lái)。#include <reg52.h> typedef unsigned char uChar8; typedef unsigned int uInt16; typedef unsigned long int uInt32; sbit ConOut = P11; /加熱絲接到P1.1口 typedef struct PID_Value uInt32 liEkVal3; /差值保存,給定和反饋的差值 uChar8 uEkFlag3; /符號(hào),1則對(duì)應(yīng)的

17、為負(fù)數(shù),0為對(duì)應(yīng)的為正數(shù) uChar8 uKP_Coe; /比例系數(shù) uChar8 uKI_Coe; /積分常數(shù) uChar8 uKD_Coe; /微分常數(shù) uInt16 iPriVal; /上一時(shí)刻值 uInt16 iSetVal; /設(shè)定值 uInt16 iCurVal; /實(shí)際值 PID_ValueStr; PID_ValueStr PID; /定義一個(gè)結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體用來(lái)存算法中要用到的各種數(shù)據(jù) bit g_bPIDRunFlag = 0; /PID運(yùn)行標(biāo)志位,PID算法不是始終在運(yùn)算。而是每隔肯定時(shí)間,算一次。 /* * /* 函數(shù)名稱:PID_Operation() /* 函數(shù)功

18、能:PID運(yùn)算 /* 入口參數(shù):無(wú)(隱形輸入,系數(shù)、設(shè)定值等) /* 出口參數(shù):無(wú)(隱形輸出,U(k)) /* 函數(shù)說(shuō)明:U(k)+KP*E(k)-E(k-1)+KI*E(k)+KD*E(k)-2E(k-1)+E(k-2) * */void PID_Operation(void) uInt32 Temp3 = 0; /中間臨時(shí)變量 uInt32 PostSum = 0; /正數(shù)和 uInt32 NegSum = 0; /負(fù)數(shù)和 if(PID.iSetVal > PID.iCurVal) /設(shè)定值大于實(shí)際值否? if(PID.iSetVal - PID.iCurVal > 10) /

19、偏差大于10否? PID.iPriVal = 100; /偏差大于10為上限幅值輸出(全速加熱) else /否則漸漸來(lái) Temp0 = PID.iSetVal - PID.iCurVal; /偏差<=10,計(jì)算E(k) PID.uEkFlag1 = 0; /E(k)為正數(shù),由于設(shè)定值大于實(shí)際值 /* 數(shù)值進(jìn)行移位,留意挨次,否則會(huì)掩蓋掉前面的數(shù)值 */ PID.liEkVal2 = PID.liEkVal1; PID.liEkVal1 = PID.liEkVal0; PID.liEkVal0 = Temp0; /* = */ if(PID.liEkVal0 > PID.liEkV

20、al1) /E(k)>E(k-1)否? Temp0 = PID.liEkVal0 - PID.liEkVal1; /E(k)>E(k-1) PID.uEkFlag0 = 0; /E(k)-E(k-1)為正數(shù) else Temp0 = PID.liEkVal1 - PID.liEkVal0; /E(k)<E(k-1) PID.uEkFlag0 = 1; /E(k)-E(k-1)為負(fù)數(shù) /* = */ Temp2 = PID.liEkVal1 * 2; /2E(k-1) if(PID.liEkVal0 + PID.liEkVal2) > Temp2) /E(k-2)+E(k

21、)>2E(k-1)否? Temp2 = (PID.liEkVal0 + PID.liEkVal2) - Temp2; PID.uEkFlag2=0; /E(k-2)+E(k)-2E(k-1)為正數(shù) else /E(k-2)+E(k)<2E(k-1) Temp2 = Temp2 - (PID.liEkVal0 + PID.liEkVal2); PID.uEkFlag2 = 1; /E(k-2)+E(k)-2E(k-1)為負(fù)數(shù) /* = */ Temp0 = (uInt32)PID.uKP_Coe * Temp0; /KP*E(k)-E(k-1) Temp1 = (uInt32)PID

22、.uKI_Coe * PID.liEkVal0; /KI*E(k) Temp2 = (uInt32)PID.uKD_Coe * Temp2; /KD*E(k-2)+E(k)-2E(k-1) /* 以下部分代碼是講全部的正數(shù)項(xiàng)疊加,負(fù)數(shù)項(xiàng)疊加 */ /* = 計(jì)算KP*E(k)-E(k-1)的值 = */ if(PID.uEkFlag0 = 0) PostSum += Temp0; /正數(shù)和 else NegSum += Temp0; /負(fù)數(shù)和 /* = 計(jì)算KI*E(k)的值 = */ if(PID.uEkFlag1 = 0) PostSum += Temp1; /正數(shù)和 else ; /*

23、空操作。就是由于PID.iSetVal > PID.iCurVal(即E(K)>0)才進(jìn)入if的, 那么就沒(méi)可能為負(fù),所以打個(gè)轉(zhuǎn)回去就是了 */ /* = 計(jì)算KD*E(k-2)+E(k)-2E(k-1)的值 = */ if(PID.uEkFlag2=0) PostSum += Temp2; /正數(shù)和 else NegSum += Temp2; /負(fù)數(shù)和 /* = 計(jì)算U(k) = */ PostSum += (uInt32)PID.iPriVal; if(PostSum > NegSum) /是否把握量為正數(shù) Temp0 = PostSum - NegSum; if(Temp0 < 100 ) /小于上限幅值則為計(jì)算值輸出 PID.iPriVal = (uInt16)Temp0; else PID.iPriVal = 100; /否則為上限幅值輸出 else /把握量輸出為負(fù)數(shù),則輸出0(下限幅值輸出) PID.iPriVal = 0; else PID.iPriVal = 0; /同上,嘿嘿 /* * /* 函數(shù)名稱:PID_Output() /* 函數(shù)功能:PID輸出把

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論