這次萌生出寫(xiě)一篇Arduino和PID算法結(jié)合的文章要出,其實(shí)是因?yàn)閯偯ν陮?shí)驗(yàn)的事情巢价,而實(shí)驗(yàn)進(jìn)行過(guò)程中曾嘗試著應(yīng)用PID算法捷兰。雖然最后并沒(méi)有用上立叛,思考之后,我決定還是把它貼出來(lái)贡茅。
什么是PID秘蛇?
PID控制是二階線性控制,對(duì)輸入偏差進(jìn)行比例(P)顶考、積分(I)赁还、微分(D)運(yùn)算來(lái)控制輸出,一般用于閉環(huán)控制驹沿。
比例(P)控制比例控制是一種最簡(jiǎn)單的控制方式艘策。其控制器的輸出與輸入誤差信號(hào)成比例關(guān)系。當(dāng)僅有比例控制時(shí)系統(tǒng)輸出存在穩(wěn)態(tài)誤差(Steady-state error)甚负。積分(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)誤差的 或簡(jiǎn)稱有差系統(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ú)穩(wěn) 態(tài)誤差。微分(D)控制在微分控制中盲憎,控制器的輸出與輸入誤差信號(hào)的微分(即誤差的變化率)成正比關(guān)系嗅骄。自動(dòng)控制系統(tǒng)在克服誤差的調(diào)節(jié)過(guò)程中可能會(huì)出現(xiàn)振蕩甚至失穩(wěn)。其原因是由于存在有較大慣性組件(環(huán)節(jié))或有滯后(delay)組件饼疙,具有抑制誤差的作用溺森, 其變化總是落后于誤差的變化。解決的辦法是使抑制誤差的作用的變化“超前”窑眯,即在誤差接近零時(shí)屏积,抑制誤差的作用就應(yīng)該是零。這就是說(shuō)伸但,在控制器中僅引入 “比例”項(xiàng)往往是不夠的肾请,比例項(xiàng)的作用僅是放大誤差的幅值,而需要增加的是“微分項(xiàng)”更胖,它能預(yù)測(cè)誤差變化的趨勢(shì),這樣隔显,具有比例+微分的控制器却妨,就能 夠提前使抑制誤差的控制作用等于零,甚至為負(fù)值括眠,從而避免了被控量的嚴(yán)重超調(diào)彪标。所以對(duì)有較大慣性或滯后的被控對(duì)象,比例+微分(PD)控制器能改善系統(tǒng)在 調(diào)節(jié)過(guò)程中的動(dòng)態(tài)特性掷豺。
詳細(xì)點(diǎn)的引用某位網(wǎng)友
比例調(diào)節(jié)作用:是按比例反應(yīng)系統(tǒng)的偏差捞烟,系統(tǒng)一旦出現(xiàn)了偏差薄声,比例調(diào)節(jié)立即產(chǎn)生調(diào)節(jié)作用用以減少偏差。比例作用大题画,可以加快調(diào)節(jié)默辨,減少誤差,但是過(guò)大的比例苍息,使系統(tǒng)的穩(wěn)定性下降缩幸,甚至造成系統(tǒng)的不穩(wěn)定。積分調(diào)節(jié)作用:是使系統(tǒng)消除穩(wěn)態(tài)誤差竞思,提高無(wú)差度表谊。因?yàn)橛姓`差,積分調(diào)節(jié)就進(jìn)行盖喷,直至無(wú)差爆办,積分調(diào)節(jié)停止,積分調(diào)節(jié)輸出一常值课梳。積分作用的強(qiáng)弱取決與積分時(shí)間常數(shù)Ti距辆,Ti越小,積分作用就越強(qiáng)惦界。反之Ti大則積分作用弱挑格,加入積分調(diào)節(jié)可使系統(tǒng)穩(wěn)定性下降,動(dòng)態(tài)響應(yīng)變慢沾歪。積分作用常與另兩種調(diào)節(jié)規(guī)律結(jié)合漂彤,組成PI調(diào)節(jié)器或PID調(diào)節(jié)器。微分調(diào)節(jié)作用灾搏,微分作用反映系統(tǒng)偏差信號(hào)的變化率挫望,具有預(yù)見(jiàn)性,能預(yù)見(jiàn)偏差變化的趨勢(shì)狂窑,因此能產(chǎn)生超前的控制作用媳板,在偏差還沒(méi)有形成之前,已被微分調(diào)節(jié)作用消除泉哈。因此蛉幸,可以改善系統(tǒng)的動(dòng)態(tài)性能。在微分時(shí)間選擇合適情況下丛晦,可以減少超調(diào)奕纫,減少調(diào)節(jié)時(shí)間。微分作用對(duì)噪聲干擾有放大作用烫沙,因此過(guò)強(qiáng)的加微分調(diào)節(jié)匹层,對(duì)系統(tǒng)抗干擾不利。此外锌蓄,微分反應(yīng)的是變化率升筏,而當(dāng)輸入沒(méi)有變化時(shí)撑柔,微分作用輸出為零。微分作用不能單獨(dú)使用您访,需要與另外兩種調(diào)節(jié)規(guī)律相結(jié)合铅忿,組成 PD或PID控制器。
PID應(yīng)用于Arduino
PID可分為位置式PID洋只、增進(jìn)式PID和步進(jìn)式PID辆沦。具體區(qū)別我也不能說(shuō)出一二,利用Arduino通過(guò)L298N實(shí)現(xiàn)對(duì)pwm控制的是采用位置式PID识虚,主要用PD肢扯,可不用I。
位置式PID的公式:
PD控制器應(yīng)用于Arduino中担锤,主要是將誤差送至pwm中來(lái)控制電路電流。
公式為:u(k)=Kp*e(k)+Kd*[e(k)-e(k-1)]?? 其中e(k)為誤差(目標(biāo)與實(shí)際之差)
代碼例子
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;//設(shè)定方向
? 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/