首先幫大家解決一下什么是PID調節,為什么就要這樣的疑惑。
PID是比例,積分,微分的英文單詞的首字母的簡(jiǎn)稱(chēng)。
下面舉個(gè)例子說(shuō)明一下PID,讓大家有個(gè)感官的認識,。
一個(gè)人閉眼走路,假設他知道自己離目的地有100米遠,那么他就可以以每秒一米一步這樣的速度走向目的地,100米剛剛好是100步,這是一個(gè)非常理想化的現象。假設他不知道目的地有多遠,目的地可能是1000米也有可能是10000米,他用每秒每步3米得速度向前,很不巧的是這個(gè)目的地在80米處,他走了26步時(shí)剛剛好差2米,走27步有剛剛好又多出1米,這就是所謂的穩態(tài)誤差,如果這個(gè)人知道目的地在大概15米處得地方,開(kāi)始這個(gè)人以每秒一米一步的速度,走完一步然后目測一下離目的地還有多遠,結果發(fā)現還剩下大概14米,顯然一米一步太慢,因此這個(gè)人決定每秒大于一米一步走,得出一條式子,
y=Kpe(t)
其中y為下一次要每步要走的距離,e(t) 為目測距離,也就是偏差,換句話(huà)說(shuō)就是自己走了的距離跟要走的距離也就是目的地的誤差,Kp就是一個(gè)常數,假設我們把Kp設置為0.5,
y=KPe(t)可以得出y=7;也就是說(shuō)那個(gè)人下一步要以每秒7米得速度走,重復上述的過(guò)程,,7+1共走了8米,然后目測一下距離15米處還有多遠,還有7米得誤差,所以下一步要走3.5米,然后在重復,發(fā)現最后會(huì )出現一個(gè)穩態(tài)的誤差,也就是多走一步會(huì )超出目的地,少走一步又沒(méi)到目的地。當然這個(gè)上述的例子情況非常特殊,大家可能覺(jué)得最后那些誤差可以忽略,但是實(shí)際應用中,肯定沒(méi)有人走路的那么特殊,按照這種線(xiàn)性比例下去最后得到的誤差會(huì )非常大,所以就引入了一個(gè)積分的概念,積分的數學(xué)幾何定義是在區間[a, b]里連續的非負曲線(xiàn)與直線(xiàn)x=a,x=b圍成的圖形的面積。從積分的定義可以得到一個(gè)函數
其中Ti為積分時(shí)間,e(t)就是誤差了。Y就是輸出,它是個(gè)不定積分,事實(shí)上把它融入到上述人走路的例子它是個(gè)定積分,從0 到t時(shí)刻的誤差的對時(shí)間的積分,也就是說(shuō)誤差曲線(xiàn)e(t)與時(shí)間
軸圍成的面積,積分時(shí)間Ti是一個(gè)常量,也就是說(shuō)是自己規定大小,很明顯,由上式得y為e(t)與t所圍成的圖形的面積的除以Ti的值,Ti越大y越小,Ti越小y越大,大了系統會(huì )動(dòng)蕩,所以要慢慢調節系數。
下面是關(guān)于積分跟比例的專(zhuān)業(yè)闡述:
比例(P)控制
比例控制是一種最簡(jiǎn)單的控制方式。其控制器的輸出與輸入誤差信號成比例關(guān)系。當僅有比例控制時(shí)系統輸出存在穩態(tài)誤差(Steady-state error)。
積分(I)控制
在積分控制中,控制器的輸出與輸入誤差信號的積分成正比關(guān)系。對一個(gè)自動(dòng)控制系統,如果在進(jìn)入穩態(tài)后存在穩態(tài)誤差,則稱(chēng)這個(gè)控制系統是有穩態(tài)誤差的 或簡(jiǎn)稱(chēng)有差系統(System with Steady-state Error)。為了消除穩態(tài)誤差,在控制器中必須引入“積分項”。積分項對誤差取決于時(shí)間的積分,隨著(zhù)時(shí)間的增加,積分項會(huì )增大。這樣,即便誤差很小,積 分項也會(huì )隨著(zhù)時(shí)間的增加而加大,它推動(dòng)控制器的輸出增大使穩態(tài)誤差進(jìn)一步減小,直到等于零。因此,比例+積分(PI)控制器,可以使系統在進(jìn)入穩態(tài)后無(wú)穩 態(tài)誤差。
微分調節就是偏差值的變化率。例如,如果輸入偏差值線(xiàn)性變化,則在調節器輸出側疊加一個(gè)恒定的調節量。大部分控制系統不需要調節微分時(shí)間。因為只有時(shí)間滯后的系統才需要附加這個(gè)參數。如果畫(huà)蛇添足加上這個(gè)參數反而會(huì )使系統的控制受到影響。
舉個(gè)例子,人去調節窩爐的溫度,慢慢調節旋鈕,使得溫度慢慢變大,要使得溫度達到某個(gè)固定值,人可以慢慢調節,邊看溫度邊調節,如果開(kāi)始離這個(gè)這目標溫度遠就快速旋旋鈕(比例效果),到最后要使得溫度誤差小就微調(積分效果),然后實(shí)際上溫度是有一個(gè)慣性在那里,開(kāi)始你以很快速度調節旋鈕的時(shí)候溫度不會(huì )突變,不會(huì )一下子就達到穩定值,它慢慢增加到最后,但是不是每個(gè)人都是這么有經(jīng)驗,當他看到溫度值離目標溫度還差這么遠,又加快旋轉旋鈕,最終結果導致實(shí)際溫度跟目標溫度差別非常遠,微調也跟本沒(méi)法調整,最后導致系統的不穩定,但是如果這個(gè)人很有經(jīng)驗,他事先知道這個(gè)溫度是有慣性的,開(kāi)始它快速旋轉旋鈕看溫度上升率非常高,也就是溫度變化非???,他就放慢旋轉速度了,最后結果是準確的把溫度調整到最佳(微分效果)。
人可以是這樣子,但是計算機可不會(huì )這樣調節,那么就要通過(guò)一個(gè)PID得到一個(gè)輸出值來(lái)調節了。
下面是一段關(guān)于微分的專(zhuān)業(yè)闡述:
制器的輸出與輸入誤差信號的微分(即誤差的變化率)成正比關(guān)系。 自動(dòng)控制系統在克服誤差的調節過(guò)程中可能會(huì )出現振蕩甚至失穩。其原因是由于存在有較大慣性組件(環(huán)節)或有滯后(delay)組件,具有抑制誤差的作用, 其變化總是落后于誤差的變化。解決的辦法是使抑制誤差的作用的變化“超前”,即在誤差接近零時(shí),抑制誤差的作用就應該是零。這就是說(shuō),在控制器中僅引入 “比例”項往往是不夠的,比例項的作用僅是放大誤差的幅值,而目前需要增加的是“微分項”,它能預測誤差變化的趨勢,這樣,具有比例+微分的控制器,就能 夠提前使抑制誤差的控制作用等于零,甚至為負值,從而避免了被控量的嚴重超調。所以對有較大慣性或滯后的被控對象,比例+微分(PD)控制器能改善系統在 調節過(guò)程中的動(dòng)態(tài)特性。
綜上所述得到一個(gè)一條公式,這個(gè)就是模擬PID
下面是關(guān)于應用,增量式PID算法。其實(shí)PID的算法可以做很深,但沒(méi)必要,一般入門(mén)級的算法已經(jīng)在很多場(chǎng)合夠用了,這里之所以選用增量式PID算法(另外還有位置式PID等等),因為增量式PID算法運算量少,非常適合單片機的應用。
顯然要想給單片機運算,就必須是數字量,而上述的PID是模擬PID,我們要將他數字化,離散化。
其中積分在上面說(shuō)到的,他的幾何意義就是求e(t)與時(shí)間軸t圍成的圖形的面積,將這個(gè)面積分成T等分 ,T=0到T=1跟e(t)圍成的面積加上T=1到T=2跟e(t)圍成的面積一直累加。。。。。直到T-1到T跟e(t)圍成的面積剛好就是整個(gè)e(t)與t時(shí)間軸圍成的面積,剛剛好是e(t)對t的積分,如果T無(wú)限大,那么就可以分割成無(wú)限個(gè)小圖形那么這個(gè)圖形的面積就可以用T[e(1)+e(2)+………+e(T-1)+e(T)]來(lái)代替積分效果,而這個(gè)T等分就是AD在整個(gè)時(shí)間軸t中采樣的點(diǎn),顯然越快的AD在相同的時(shí)間t里面采樣的點(diǎn)越多,換句話(huà)說(shuō)就是T更接近無(wú)限大。因此積分可以用累和代替。
下面為積分的專(zhuān)業(yè)的解釋
設函數f(x)在[a,b]上有界,在[a,b]中任意插入若干個(gè)分點(diǎn)
a=x0<><><>
把區間[a,b]分成n個(gè)小區間
[x0,x1],...[xn-1,xn]。
在每個(gè)小區間[xi-1,xi]上任取一點(diǎn)ξi(xi-1≤ξi≤xi),作函數值f(ξi)與小區間長(cháng)度的乘積f(ξi)△xi,并作出和
如果不論對[a,b]怎樣分法,也不論在小區間上的點(diǎn)ξi怎樣取法,只要當區間的長(cháng)度趨于零時(shí),和S總趨于確定的極限I,
這時(shí)我們稱(chēng)這個(gè)極限I為函數f(x)在區間[a,b]上的定積分,
記作
微分用差分代替,先說(shuō)明一下微分的幾何意義

我們可以想象把上圖中的f(x)換成e(t),x軸換成t軸,把△x換成△t,當△t非常小的時(shí)候曲線(xiàn)MN等價(jià)于直線(xiàn)MN,△y就等于dy,所以

因此模擬PID離散化得到在k-1時(shí)刻的輸出

]
因此得到一個(gè)增量

其中的T為采樣時(shí)間
,如果計算機控制系統采用恒定的采樣周期T,一旦確定A、B、C(系數的選取是PID的關(guān)鍵這里不做討論)
增量式PID控制算法與位置式PID算法相比,計算量小得多,因此在實(shí)際中得到廣泛的應用。
位置式PID控制算法也可以通過(guò)增量式控制算法推出遞推計算公式:

就是目前在計算機控制中廣泛應用的數字遞推PID控制算法。
:
下面是程序
typedef struct PID
{
int SetPoint; //設定目標 Desired Value
long SumError; //誤差累計
double Proportion; //比例常數 Proportional Const
double Integral; //積分常數 Integral Const
double Derivative; //微分常數 Derivative Const
int LastError; //Error[-1]
int PrevError; //Error[-2]
} PID;
static PID sPID;
static PID *sptr = &sPID;
/*==================================================================================================== Initialize PID Structure PID參數初始化
=====================================================================================================*/
void IncPIDInit(void)
{
sptr->SumError = 0;
sptr->LastError = 0; //Error[-1]
sptr->PrevError = 0; //Error[-2]
sptr->Proportion = 0; //比例常數 Proportional Const
sptr->Integral = 0; //積分常數Integral Const
sptr->Derivative = 0; //微分常數 Derivative Const
sptr->SetPoint = 0;
}
/*====================================================================================================
增量式PID計算部分
=====================================================================================================*/
int IncPIDCalc(int NextPoint)
{
register int iError, iIncpid; //當前誤差
iError = sptr->SetPoint - NextPoint; //增量計算
iIncpid = sptr->Proportion * iError //E[k]項
- sptr->Integral * sptr->LastError //E[k-1]項
+ sptr->Derivative * sptr->PrevError; //E[k-2]項
//存儲誤差,用于下次計算
sptr->PrevError = sptr->LastError;
sptr->LastError = iError;
//返回增量值
return(iIncpid);
}
聯(lián)系客服