這次萌生出寫一篇Arduino和PID算法結合的文章,其實是因為剛忙完實驗的事情,而實驗進行過程中曾嘗試著應用PID算法。雖然最后并沒有用上,思考之后,我決定還是把它貼出來。
什么是PID?
PID控制是二階線性控制,對輸入偏差進行比例(P)、積分(I)、微分(D)運算來控制輸出,一般用于閉環控制。
比例(P)控制積分(I)控制在積分控制中,控制器的輸出與輸入誤差信號的積分成正比關系。對一個自動控制系統,如果在進入穩態后存在穩態誤差,則稱這個控制系統是有穩態誤差的 或簡稱有差系統(System with Steady-state Error)。為了消除穩態誤差,在控制器中必須引入“積分項”。積分項對誤差取決于時間的積分,隨著時間的增加,積分項會增大。這樣,即便誤差很小,積 分項也會隨著時間的增加而加大,它推動控制器的輸出增大使穩態誤差進一步減小,直到接近于零。因此,比例+積分(PI)控制器,可以使系統在進入穩態后幾乎無穩 態誤差。微分(D)控制在微分控制中,控制器的輸出與輸入誤差信號的微分(即誤差的變化率)成正比關系。自動控制系統在克服誤差的調節過程中可能會出現振蕩甚至失穩。其原因是由于存在有較大慣性組件(環節)或有滯后(delay)組件,具有抑制誤差的作用, 其變化總是落后于誤差的變化。解決的辦法是使抑制誤差的作用的變化“超前”,即在誤差接近零時,抑制誤差的作用就應該是零。這就是說,在控制器中僅引入 “比例”項往往是不夠的,比例項的作用僅是放大誤差的幅值,而需要增加的是“微分項”,它能預測誤差變化的趨勢,這樣,具有比例+微分的控制器,就能 夠提前使抑制誤差的控制作用等于零,甚至為負值,從而避免了被控量的嚴重超調。所以對有較大慣性或滯后的被控對象,比例+微分(PD)控制器能改善系統在 調節過程中的動態特性。
詳細點的引用某位網友
比例調節作用:是按比例反應系統的偏差,系統一旦出現了偏差,比例調節立即產生調節作用用以減少偏差。比例作用大,可以加快調節,減少誤差,但是過大的比例,使系統的穩定性下降,甚至造成系統的不穩定。積分調節作用:是使系統消除穩態誤差,提高無差度。因為有誤差,積分調節就進行,直至無差,積分調節停止,積分調節輸出一常值。積分作用的強弱取決與積分時間常數Ti,Ti越小,積分作用就越強。反之Ti大則積分作用弱,加入積分調節可使系統穩定性下降,動態響應變慢。積分作用常與另兩種調節規律結合,組成PI調節器或PID調節器。微分調節作用,微分作用反映系統偏差信號的變化率,具有預見性,能預見偏差變化的趨勢,因此能產生超前的控制作用,在偏差還沒有形成之前,已被微分調節作用消除。因此,可以改善系統的動態性能。在微分時間選擇合適情況下,可以減少超調,減少調節時間。微分作用對噪聲干擾有放大作用,因此過強的加微分調節,對系統抗干擾不利。此外,微分反應的是變化率,而當輸入沒有變化時,微分作用輸出為零。微分作用不能單獨使用,需要與另外兩種調節規律相結合,組成 PD或PID控制器。
PID應用于Arduino
PID可分為位置式PID、增進式PID和步進式PID。具體區別我也不能說出一二,利用Arduino通過L298N實現對pwm控制的是采用位置式PID,主要用PD,可不用I。
位置式PID的公式:
PD控制器應用于Arduino中,主要是將誤差送至pwm中來控制電路電流。
公式為:u(k)=Kp*e(k)+Kd*[e(k)-e(k-1)]?? 其中e(k)為誤差(目標與實際之差)
代碼例子
double v, error;
? error = readValue1 - Pid1.target;
? v = error - Pid1.preError;
? Pid1.power = (int) Pid1.Kd * v + Pid1.Kp * error;//公式
? Pid1.flag = Pid1.power > 0;//設定方向
? Pid1.power = abs(Pid1.power);
? if(Pid1.power>255) Pid1.power = 255;
? Pid1.preError = error;
??? digitalWrite(i1Pin, Pid1.flag);
??? digitalWrite(i2Pin, !Pid1.flag);
??? analogWrite(power1Pin, Pid1.power);
參考資料:
http://blog.gkong.com/liaochangchu_117560.ashx
http://lql990832.blog.163.com/blog/static/75304655200992434744316/