PID概述:
在工程實(shí)際中,應(yīng)用最為廣泛的調(diào)節(jié)器控制規(guī)律為比例、積分、微分控制,簡稱PID控制,又稱PID調(diào)節(jié)。PID控制器問世至今已有近70年歷史,它以其結(jié)構(gòu)簡單、穩(wěn)定性好、工作可靠、調(diào)整方便而成為工業(yè)控制的主要技術(shù)之一。當(dāng)被控對(duì)象的結(jié)構(gòu)和參數(shù)不能完全掌握,或得不到精確的數(shù)學(xué)模型時(shí),控制理論的 其它技術(shù)難以采用時(shí),系統(tǒng)控制器的結(jié)構(gòu)和參數(shù)必須依靠經(jīng)驗(yàn)和現(xiàn)場(chǎng)調(diào)試來確定,這時(shí)應(yīng)用PID控制技術(shù)最為方便。即當(dāng)我們不完全了解一個(gè)系統(tǒng)和被控對(duì)象,或不能通過有效的測(cè)量手段來獲得系統(tǒng)參數(shù)時(shí),最適合用PID控制技術(shù)。PID控制,實(shí)際中也有PI和PD控制。PID控制器就是根據(jù)系統(tǒng)的誤差,利用比例、 積分、微分計(jì)算出控制量進(jìn)行控制的。
(1)比例(P)控制
比例控制是一種最簡單的控制方式。其控制器的輸出與輸入誤差信號(hào)成比例關(guān)系。當(dāng)僅有比例控制時(shí)系統(tǒng)輸出存在穩(wěn)態(tài)誤差(Steady-state error)。
(2)積分(I)控制
在積分控制中,控制器的輸出與輸入誤差信號(hào)的積分成正比關(guān)系。對(duì)一個(gè)自動(dòng)控制系統(tǒng),如果在進(jìn)入穩(wěn)態(tài)后存在穩(wěn)態(tài)誤差,則稱這個(gè)控制系統(tǒng)是有穩(wěn)態(tài)誤差的或簡稱有差系統(tǒng)(System with Steady-state Error)。為了消除穩(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)一步減小,直到接近于零。因此,比例+積分(PI)控制器,可以使系統(tǒng)在進(jìn)入穩(wěn)態(tài)后幾乎無穩(wěn)態(tài)誤差。
(3)微分(D)控制
在微分控制中,控制器的輸出與輸入誤差信號(hào)的微分(即誤差的變化率)成正比關(guān)系。自動(dòng)控制系統(tǒng)在克服誤差的調(diào)節(jié)過程中可能會(huì)出現(xiàn)振蕩甚至失穩(wěn)。其原因是由于存在有較大慣性組件(環(huán)節(jié))或有滯后(delay)組件,具有抑制誤差的作用, 其變化總是落后于誤差的變化。解決的辦法是使抑制誤差的作用的變化“超前”,即在誤差接近零時(shí),抑制誤差的作用就應(yīng)該是零。這就是說,在控制器中僅引入 “比例”項(xiàng)往往是不夠的,比例項(xiàng)的作用僅是放大誤差的幅值,而需要增加的是“微分項(xiàng)”,它能預(yù)測(cè)誤差變化的趨勢(shì),這樣,具有比例+微分的控制器,就能夠提前使抑制誤差的控制作用等于零,甚至為負(fù)值,從而避免了被控量的嚴(yán)重超調(diào)。所以對(duì)有較大慣性或滯后的被控對(duì)象,比例+微分(PD)控制器能改善系統(tǒng)在調(diào)節(jié)過程中的動(dòng)態(tài)特性。
制作實(shí)例:
大家一定都見過PID的實(shí)際應(yīng)用
比如四軸飛行器,再比如平衡小車……還有汽車的定速巡航、3D打印機(jī)上的溫度控制器….再比如動(dòng)物園里的海獅,將一根桿子直立著頂在頭上(OOPS,這個(gè)也算..)就是類似于這種:需要將某一個(gè)物理量“保持穩(wěn)定”的場(chǎng)合(比如維持平衡,穩(wěn)定溫度、轉(zhuǎn)速等),PID都會(huì)派上大用場(chǎng)。在這篇文章中我制作了一個(gè)基本的電機(jī)控制器,來探究PID的原理以及如何去使用它。首先我要可以任意控制我的電機(jī)旋轉(zhuǎn)角度,在旋轉(zhuǎn)的過程中,電機(jī)需要保持穩(wěn)定并且不會(huì)出現(xiàn)震蕩。
電機(jī)選型
要想完成這個(gè)實(shí)驗(yàn),單片機(jī)需要精確控制電機(jī),從電機(jī)那獲得電機(jī)的轉(zhuǎn)速以及位置等信息。所以需要使用帶有編碼器的直流電機(jī),通過編碼器,單片機(jī)即可獲得電機(jī)的轉(zhuǎn)速以及位置信息。市面上售賣的編碼器電機(jī)一般分為霍爾或者光電編碼器的,在這里我選擇的是一款來自Robot減速比為120的TT編碼器電機(jī)。
根據(jù)官網(wǎng)給出的數(shù)據(jù)手冊(cè),他的編碼器一圈可以輸出16個(gè)脈沖信號(hào),經(jīng)過減速箱后,輸出軸旋轉(zhuǎn)一圈可以輸出16*120=1920個(gè)脈沖信號(hào)。
電機(jī)一共有六根線,左邊4根為編碼器的線,右邊兩根為電機(jī)的線。
電機(jī)驅(qū)動(dòng)芯片
電機(jī)驅(qū)動(dòng)芯片我選擇的是L293D,這是一個(gè)雙路的H橋有刷電機(jī)驅(qū)動(dòng)芯片,使用2個(gè)輸入引腳以及一個(gè)使能腳就可以控制一路電機(jī)正反轉(zhuǎn)以及調(diào)速。
單片機(jī)用的是STM32F103C8T6系列的核心板。對(duì)于這款單片機(jī)來說,其定時(shí)器支持編碼器信號(hào)輸入,所以我只需要把電機(jī)的編碼器輸出引腳連接到定時(shí)器的的編碼器輸入引腳即可,即可實(shí)現(xiàn)定時(shí)器自動(dòng)計(jì)數(shù)。
單片機(jī)與電機(jī)電路連接好后,下面就開始做軟件部分了。
PID控制器
PID控制器的名稱其實(shí)就解釋了它的基本原理,PID分別是三個(gè)單詞的縮寫,P(Proportion)I(Integration)D(Differential),那么解釋成中文意思就是比例、積分、微分控制器。如下圖所示。

其中,最左側(cè)作為PID控制器的輸入,最右側(cè)作為PID控制器的輸出,通過以上框圖不難看出,PID 控制其實(shí)就是對(duì)偏差的控制過程;如果偏差為 0, 則比例環(huán)節(jié)不起作用,只有存在偏差時(shí),比例環(huán)節(jié)才起作用;積分環(huán)節(jié)主要是用來消除靜差,所謂靜差,就是系統(tǒng)穩(wěn)定后輸出值和設(shè)定值之間的差值,積分環(huán)節(jié)實(shí)際上就是偏差累計(jì)的過程,把累計(jì)的誤差加到原有系統(tǒng)上以抵消系統(tǒng)造成的靜差;而微分信號(hào)則反應(yīng)了偏差信號(hào)的變化規(guī)律,也可以說是變化趨勢(shì),根據(jù)偏差信號(hào)的變化趨勢(shì)來進(jìn)行超前調(diào)節(jié),從而增加了系統(tǒng)的預(yù)知性;我們可以看到在輸出端又有一個(gè)箭頭指向了輸入端的累加器,并且其符號(hào)是負(fù)的,這也就說明了PID控制器是具有負(fù)反饋的,同時(shí)此時(shí)的誤差信號(hào)就為輸入信號(hào)減去輸出信號(hào)。通俗來說,拿我們實(shí)驗(yàn)?zāi)康膩砼e例子就是當(dāng)電機(jī)旋轉(zhuǎn)角度過多了,PID控制器會(huì)控制其轉(zhuǎn)回到原來角度。
所以總的來看,PID控制器的精髓就是三個(gè)運(yùn)算過程。而在這個(gè)實(shí)驗(yàn)中,我想要控制電機(jī)旋轉(zhuǎn)到特定的角度,那么我的輸入就為我想要旋轉(zhuǎn)的角度,經(jīng)過使用PID控制器進(jìn)行運(yùn)算之后,他就會(huì)輸出一個(gè)PWM值去控制電機(jī)運(yùn)動(dòng),并且在這同時(shí)編碼器會(huì)不斷反饋當(dāng)前位置。經(jīng)過這樣不斷的使用PID控制器進(jìn)行計(jì)算,進(jìn)而我的電機(jī)就可以快速穩(wěn)定的轉(zhuǎn)到我指定角度。

代碼的實(shí)現(xiàn)
值得注意的是,對(duì)于上面PID結(jié)構(gòu)圖中提到的三部分運(yùn)算公式(比例,微分與積分)它都是對(duì)于連續(xù)信號(hào)來進(jìn)行的操作,對(duì)于單片機(jī)來說,處理連續(xù)信號(hào)顯然是不可能的??尚械霓k法就是每隔一定時(shí)間運(yùn)行一次PID算法,所以對(duì)于離散的位置PID算法來說,其公式如下

對(duì)于三個(gè)變量來說,它們的計(jì)算方法如下

那么接下來就是實(shí)現(xiàn)整個(gè)程序了,由于我使用的單片機(jī)小板沒有串口通信芯片,不利于后期調(diào)試,所以我使用STM32自帶的一個(gè)USB接口模擬串口通信。接下來新建一個(gè)STM32工程,并添加相關(guān)的外設(shè)初始化代碼(電機(jī)編碼器等)。

接下來我根據(jù)上文提到的PID計(jì)算公式,編寫了PID運(yùn)算函數(shù)。

為了定時(shí)運(yùn)行PID算法,我設(shè)置了一個(gè)5ms的定時(shí)器,這樣每次到了定時(shí)器中斷時(shí)候,就可以運(yùn)行PID算法了。從定時(shí)器的中斷函數(shù)中我們可以看到,每次的處理過程就是將當(dāng)前位置和目標(biāo)位置送入PID運(yùn)算器并且得到輸出后,送入電機(jī)的控制函數(shù)中即可。

而在電機(jī)的控制函數(shù)Output中,其內(nèi)容如下

通過PID控制器輸出的值來控制電機(jī)的旋轉(zhuǎn)方向,然后對(duì)PID輸出的值進(jìn)行限幅,最后賦值給PWM發(fā)生器即可。
實(shí)驗(yàn)
接下來我們開始實(shí)驗(yàn),首先我們將PID控制器的I和D參數(shù)全部調(diào)節(jié)為0,將Kp設(shè)置為一個(gè)較小值,接著編譯工程并且燒錄到STM32中。

給STM32上電,STM32使用USB模擬串口需要安裝一個(gè)軟件,我會(huì)附到文末資料中。打開串口調(diào)試助手,輸入h加上回車,點(diǎn)擊發(fā)送,幫助信息會(huì)被打印出來。可以看到支持的指令包括讀取編碼器位置,修改PID參數(shù)以及左右旋轉(zhuǎn)等等。

接著在串口調(diào)試助手中發(fā)送數(shù)據(jù)后,觀察到電機(jī)轉(zhuǎn)動(dòng)過了九十度,但是電機(jī)出現(xiàn)晃動(dòng)的情況,并且響應(yīng)速度也較慢接著增大Kp值,直到晃動(dòng)幅度減小并且電機(jī)響應(yīng)速度逐漸增快,在目標(biāo)位置附近抖動(dòng)時(shí),我們開始增大Kd值去抑制在目標(biāo)位置附近的抖動(dòng)。當(dāng)調(diào)整到Kp值為500,Kd值為900時(shí),電機(jī)晃動(dòng)情況大幅改善。雖然抖動(dòng)問題解決了,但是經(jīng)過多次旋轉(zhuǎn)之后,電機(jī)的誤差逐漸顯現(xiàn)出來,旋轉(zhuǎn)一周后沒法回到原點(diǎn)。所以接下來增加Ki值,建議Ki值增加幅度不要過大,一般在零點(diǎn)幾的范圍。這里我設(shè)置Ki值為0.01,以修正每次旋轉(zhuǎn)之后產(chǎn)生的誤差。到這里,PID參數(shù)調(diào)整的基本就差不多了,電機(jī)可以很好的執(zhí)行我的指令。
我發(fā)現(xiàn)當(dāng)我的旋轉(zhuǎn)角度設(shè)定到很大的值時(shí)候,電機(jī)會(huì)先以滿速轉(zhuǎn)動(dòng),然后會(huì)逐步減速直到我的設(shè)定位置。這就帶來一個(gè)問題,當(dāng)電機(jī)滿速的時(shí)候,PWM的占空比為100%,這時(shí)候電機(jī)等于直接接在電源兩端,此時(shí)電機(jī)的轉(zhuǎn)速我們沒法控制,那么如果這時(shí)候電源電壓不穩(wěn),電機(jī)轉(zhuǎn)速勢(shì)必會(huì)產(chǎn)生變化,造成轉(zhuǎn)動(dòng)的不穩(wěn)定,這當(dāng)然不是我想看到的。所以這時(shí)候就需要引入速度環(huán)了。

由于電機(jī)轉(zhuǎn)動(dòng)起來之后會(huì)具有一定的慣性,那么他的速度就不可能產(chǎn)生突變,所以在速度環(huán)控制器中,我只采用了PI控制。速度環(huán)控制器用于控制電機(jī)在轉(zhuǎn)動(dòng)過程中的速度,那么它將會(huì)處于位置環(huán)控制器的內(nèi)部,最終實(shí)現(xiàn)的代碼如下。


審核編輯:湯梓紅
-
單片機(jī)
+關(guān)注
關(guān)注
6074文章
45316瀏覽量
662773 -
控制器
+關(guān)注
關(guān)注
114文章
17621瀏覽量
190042 -
PID
+關(guān)注
關(guān)注
37文章
1489瀏覽量
90011
原文標(biāo)題:【電機(jī)控制】一篇通俗的PID算法詳細(xì)講解
文章出處:【微信號(hào):KY_QRS,微信公眾號(hào):開源嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
什么是pid控制,什么是pid控制器
pid控制器原理
13個(gè)基于PID控制器的設(shè)計(jì)實(shí)例
pid控制器的輸入輸出_PID控制器的控制實(shí)現(xiàn)
PID控制器控制電壓的詳細(xì)介紹和PID控制器的C程序的概述
pid控制器工作原理
PID控制的理論和PID控制器設(shè)計(jì)的及PID控制器參數(shù)整定的以及分析
制作一個(gè)帶有PID控制器的線跟隨機(jī)器人

PID控制器概述與制作實(shí)例
評(píng)論