PID概述:
在工程實際中,應用最為廣泛的調節器控制規律為比例、積分、微分控制,簡稱PID控制,又稱PID調節。PID控制器問世至今已有近70年歷史,它以其結構簡單、穩定性好、工作可靠、調整方便而成為工業控制的主要技術之一。當被控對象的結構和參數不能完全掌握,或得不到精確的數學模型時,控制理論的 其它技術難以采用時,系統控制器的結構和參數必須依靠經驗和現場調試來確定,這時應用PID控制技術最為方便。即當我們不完全了解一個系統和被控對象,或不能通過有效的測量手段來獲得系統參數時,最適合用PID控制技術。PID控制,實際中也有PI和PD控制。PID控制器就是根據系統的誤差,利用比例、 積分、微分計算出控制量進行控制的。
(1)比例(P)控制
比例控制是一種最簡單的控制方式。其控制器的輸出與輸入誤差信號成比例關系。當僅有比例控制時系統輸出存在穩態誤差(Steady-state error)。
(2)積分(I)控制
在積分控制中,控制器的輸出與輸入誤差信號的積分成正比關系。對一個自動控制系統,如果在進入穩態后存在穩態誤差,則稱這個控制系統是有穩態誤差的或簡稱有差系統(System with Steady-state Error)。為了消除穩態誤差,在控制器中必須引入“積分項”。積分項對誤差取決于時間的積分,隨著時間的增加,積分項會增大。這樣,即便誤差很小,積分項也會隨著時間的增加而加大,它推動控制器的輸出增大使穩態誤差進一步減小,直到接近于零。因此,比例+積分(PI)控制器,可以使系統在進入穩態后幾乎無穩態誤差。
(3)微分(D)控制
在微分控制中,控制器的輸出與輸入誤差信號的微分(即誤差的變化率)成正比關系。自動控制系統在克服誤差的調節過程中可能會出現振蕩甚至失穩。其原因是由于存在有較大慣性組件(環節)或有滯后(delay)組件,具有抑制誤差的作用, 其變化總是落后于誤差的變化。解決的辦法是使抑制誤差的作用的變化“超前”,即在誤差接近零時,抑制誤差的作用就應該是零。這就是說,在控制器中僅引入 “比例”項往往是不夠的,比例項的作用僅是放大誤差的幅值,而需要增加的是“微分項”,它能預測誤差變化的趨勢,這樣,具有比例+微分的控制器,就能夠提前使抑制誤差的控制作用等于零,甚至為負值,從而避免了被控量的嚴重超調。所以對有較大慣性或滯后的被控對象,比例+微分(PD)控制器能改善系統在調節過程中的動態特性。
制作實例:
大家一定都見過PID的實際應用
比如四軸飛行器,再比如平衡小車……還有汽車的定速巡航、3D打印機上的溫度控制器….再比如動物園里的海獅,將一根桿子直立著頂在頭上(OOPS,這個也算..)就是類似于這種:需要將某一個物理量“保持穩定”的場合(比如維持平衡,穩定溫度、轉速等),PID都會派上大用場。在這篇文章中我制作了一個基本的電機控制器,來探究PID的原理以及如何去使用它。首先我要可以任意控制我的電機旋轉角度,在旋轉的過程中,電機需要保持穩定并且不會出現震蕩。
電機選型
要想完成這個實驗,單片機需要精確控制電機,從電機那獲得電機的轉速以及位置等信息。所以需要使用帶有編碼器的直流電機,通過編碼器,單片機即可獲得電機的轉速以及位置信息。市面上售賣的編碼器電機一般分為霍爾或者光電編碼器的,在這里我選擇的是一款來自Robot減速比為120的TT編碼器電機。
根據官網給出的數據手冊,他的編碼器一圈可以輸出16個脈沖信號,經過減速箱后,輸出軸旋轉一圈可以輸出16*120=1920個脈沖信號。
電機一共有六根線,左邊4根為編碼器的線,右邊兩根為電機的線。
電機驅動芯片
電機驅動芯片我選擇的是L293D,這是一個雙路的H橋有刷電機驅動芯片,使用2個輸入引腳以及一個使能腳就可以控制一路電機正反轉以及調速。
單片機用的是STM32F103C8T6系列的核心板。對于這款單片機來說,其定時器支持編碼器信號輸入,所以我只需要把電機的編碼器輸出引腳連接到定時器的的編碼器輸入引腳即可,即可實現定時器自動計數。
單片機與電機電路連接好后,下面就開始做軟件部分了。
PID控制器
PID控制器的名稱其實就解釋了它的基本原理,PID分別是三個單詞的縮寫,P(Proportion)I(Integration)D(Differential),那么解釋成中文意思就是比例、積分、微分控制器。如下圖所示。
其中,最左側作為PID控制器的輸入,最右側作為PID控制器的輸出,通過以上框圖不難看出,PID 控制其實就是對偏差的控制過程;如果偏差為 0, 則比例環節不起作用,只有存在偏差時,比例環節才起作用;積分環節主要是用來消除靜差,所謂靜差,就是系統穩定后輸出值和設定值之間的差值,積分環節實際上就是偏差累計的過程,把累計的誤差加到原有系統上以抵消系統造成的靜差;而微分信號則反應了偏差信號的變化規律,也可以說是變化趨勢,根據偏差信號的變化趨勢來進行超前調節,從而增加了系統的預知性;我們可以看到在輸出端又有一個箭頭指向了輸入端的累加器,并且其符號是負的,這也就說明了PID控制器是具有負反饋的,同時此時的誤差信號就為輸入信號減去輸出信號。通俗來說,拿我們實驗目的來舉例子就是當電機旋轉角度過多了,PID控制器會控制其轉回到原來角度。
所以總的來看,PID控制器的精髓就是三個運算過程。而在這個實驗中,我想要控制電機旋轉到特定的角度,那么我的輸入就為我想要旋轉的角度,經過使用PID控制器進行運算之后,他就會輸出一個PWM值去控制電機運動,并且在這同時編碼器會不斷反饋當前位置。經過這樣不斷的使用PID控制器進行計算,進而我的電機就可以快速穩定的轉到我指定角度。
代碼的實現
值得注意的是,對于上面PID結構圖中提到的三部分運算公式(比例,微分與積分)它都是對于連續信號來進行的操作,對于單片機來說,處理連續信號顯然是不可能的。可行的辦法就是每隔一定時間運行一次PID算法,所以對于離散的位置PID算法來說,其公式如下
對于三個變量來說,它們的計算方法如下
那么接下來就是實現整個程序了,由于我使用的單片機小板沒有串口通信芯片,不利于后期調試,所以我使用STM32自帶的一個USB接口模擬串口通信。接下來新建一個STM32工程,并添加相關的外設初始化代碼(電機編碼器等)。
接下來我根據上文提到的PID計算公式,編寫了PID運算函數。
為了定時運行PID算法,我設置了一個5ms的定時器,這樣每次到了定時器中斷時候,就可以運行PID算法了。從定時器的中斷函數中我們可以看到,每次的處理過程就是將當前位置和目標位置送入PID運算器并且得到輸出后,送入電機的控制函數中即可。
而在電機的控制函數Output中,其內容如下
通過PID控制器輸出的值來控制電機的旋轉方向,然后對PID輸出的值進行限幅,最后賦值給PWM發生器即可。
實驗
接下來我們開始實驗,首先我們將PID控制器的I和D參數全部調節為0,將Kp設置為一個較小值,接著編譯工程并且燒錄到STM32中。
給STM32上電,STM32使用USB模擬串口需要安裝一個軟件,我會附到文末資料中。打開串口調試助手,輸入h加上回車,點擊發送,幫助信息會被打印出來。可以看到支持的指令包括讀取編碼器位置,修改PID參數以及左右旋轉等等。
接著在串口調試助手中發送數據后,觀察到電機轉動過了九十度,但是電機出現晃動的情況,并且響應速度也較慢接著增大Kp值,直到晃動幅度減小并且電機響應速度逐漸增快,在目標位置附近抖動時,我們開始增大Kd值去抑制在目標位置附近的抖動。當調整到Kp值為500,Kd值為900時,電機晃動情況大幅改善。雖然抖動問題解決了,但是經過多次旋轉之后,電機的誤差逐漸顯現出來,旋轉一周后沒法回到原點。所以接下來增加Ki值,建議Ki值增加幅度不要過大,一般在零點幾的范圍。這里我設置Ki值為0.01,以修正每次旋轉之后產生的誤差。到這里,PID參數調整的基本就差不多了,電機可以很好的執行我的指令。
我發現當我的旋轉角度設定到很大的值時候,電機會先以滿速轉動,然后會逐步減速直到我的設定位置。這就帶來一個問題,當電機滿速的時候,PWM的占空比為100%,這時候電機等于直接接在電源兩端,此時電機的轉速我們沒法控制,那么如果這時候電源電壓不穩,電機轉速勢必會產生變化,造成轉動的不穩定,這當然不是我想看到的。所以這時候就需要引入速度環了。
由于電機轉動起來之后會具有一定的慣性,那么他的速度就不可能產生突變,所以在速度環控制器中,我只采用了PI控制。速度環控制器用于控制電機在轉動過程中的速度,那么它將會處于位置環控制器的內部,最終實現的代碼如下。
審核編輯:湯梓紅
-
單片機
+關注
關注
6035文章
44554瀏覽量
634641 -
控制器
+關注
關注
112文章
16332瀏覽量
177808 -
PID
+關注
關注
35文章
1472瀏覽量
85479
原文標題:【電機控制】一篇通俗的PID算法詳細講解
文章出處:【微信號:KY_QRS,微信公眾號:開源嵌入式】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論