PID算法基本知識講解

首先幫大家解決一下什麼是PID調節,爲什麼就要這樣的疑惑。
PID是比例,積分,微分的英文單詞的首字母的簡稱。

下面舉個例子說明一下PID,讓大家有個感官的認識,。
一個人閉眼走路,假設他知道自己離目的地有100米遠,那麼他就可以以每秒一米一步這樣的速度走向目的地,100米剛剛好是100步,這是一個非常理想化的現象。假設他不知道目的地有多遠,目的地可能是1000米也有可能是10000米,他用每秒每步3米得速度向前,很不巧的是這個目的地在80米處,他走了26步時剛剛好差2米,走27步有剛剛好又多出1米,這就是所謂的穩態誤差,如果這個人知道目的地在大概15米處得地方,開始這個人以每秒一米一步的速度,走完一步然後目測一下離目的地還有多遠,結果發現還剩下大概14米,顯然一米一步太慢,因此這個人決定每秒大於一米一步走,得出一條式子,
y=Kp*e(t)
其中y爲下一次要每步要走的距離,e(t) 爲目測距離,也就是偏差,換句話說就是自己走了的距離跟要走的距離也就是目的地的誤差,Kp就是一個常數,假設我們把Kp設置爲0.5,
y=Kp*e(t)可以得出y=7;也就是說那個人下一步要以每秒7米得速度走,重複上述的過程,,7+1共走了8米,然後目測一下距離15米處還有多遠,還有7米得誤差,所以下一步要走3.5米,然後在重複,發現最後會出現一個穩態的誤差,也就是多走一步會超出目的地,少走一步又沒到目的地。當然這個上述的例子情況非常特殊,大家可能覺得最後那些誤差可以忽略,但是實際應用中,肯定沒有人走路的那麼特殊,按照這種線性比例下去最後得到的誤差會非常大,所以就引入了一個積分的概念,積分的數學幾何定義是在區間[a, b]裏連續的非負曲線與直線x=a,x=b圍成的圖形的面積。從積分的定義可以得到一個函數
其中Ti爲積分時間,e(t)就是誤差了。Y就是輸出,它是個不定積分,事實上把它融入到上述人走路的例子它是個定積分,從0 到t時刻的誤差的對時間的積分,也就是說誤差曲線e(t)與時間軸圍成的面積,積分時間Ti是一個常量,也就是說是自己規定大小,很明顯,由上式得y爲e(t)與t所圍成的圖形的面積的除以Ti的值,Ti越大y越小,Ti越小y越大,大了系統會動盪,所以要慢慢調節係數。
下面是關於積分跟比例的專業闡述:

   比例(P)控制

比例控制是一種最簡單的控制方式。其控制器的輸出與輸入誤差信號成比例關係。當僅有比例控制時系統輸出存在穩態誤差(Steady-state error)。

  積分(I)控制
在積分控制中,控制器的輸出與輸入誤差信號的積分成正比關係。對一個自動控制系統,如果在進入穩態後存在穩態誤差,則稱這個控制系統是有穩態誤差的或簡稱有差系統(System with Steady-state Error)。
爲了消除穩態誤差,在控制器中必須引入“積分項”。積分項對誤差取決於時間的積分,隨着時間的增加,積分項會增大。這樣,即便誤差很小,積分項也會隨着時間的增加而加大,它推動控制器的輸出增大使穩態誤差進一步減小,直到等於零。
因此,比例+積分(PI)控制器,可以使系統在進入穩態後無穩態誤差。
微分調節就是偏差值的變化率。例如,如果輸入偏差值線性變化,則在調節器輸出側疊加一個恆定的調節量。大部分控制系統不需要調節微分時間。因爲只有時間滯後的系統才需要附加這個參數。如果畫蛇添足加上這個參數反而會使系統的控制受到影響。
舉個例子,人去調節窩爐的溫度,慢慢調節旋鈕,使得溫度慢慢變大,要使得溫度達到某個固定值,人可以慢慢調節,邊看溫度邊調節,如果開始離這個這目標溫度遠就快速旋旋鈕(比例效果),到最後要使得溫度誤差小就微調(積分效果),然後實際上溫度是有一個慣性在那裏,開始你以很快速度調節旋鈕的時候溫度不會突變,不會一下子就達到穩定值,它慢慢增加到最後,但是不是每個人都是這麼有經驗,當他看到溫度值離目標溫度還差這麼遠,又加快旋轉旋鈕,最終結果導致實際溫度跟目標溫度差別非常遠,微調也跟本沒法調整,最後導致系統的不穩定,但是如果這個人很有經驗,他事先知道這個溫度是有慣性的,開始它快速旋轉旋鈕看溫度上升率非常高,也就是溫度變化非常快,他就放慢旋轉速度了,最後結果是準確的把溫度調整到最佳(微分效果)。
人可以是這樣子,但是計算機可不會這樣調節,那麼就要通過一個PID得到一個輸出值來調節了。
下面是一段關於微分的專業闡述:
控制器的輸出與輸入誤差信號的微分(即誤差的變化率)成正比關係。 自動控制系統在克服誤差的調節過程中可能會出現振盪甚至失穩。其原因是由於存在有較大慣性組件(環節)或有滯後(delay)組件,具有抑制誤差的作用,其變化總是落後於誤差的變化。解決的辦法是使抑制誤差的作用的變化“超前”,即在誤差接近零時,抑制誤差的作用就應該是零。這就是說,在控制器中僅引入 “比例”項往往是不夠的,比例項的作用僅是放大誤差的幅值,而目前需要增加的是“微分項”,它能預測誤差變化的趨勢,這樣,具有比例+微分的控制器,就能 夠提前使抑制誤差的控制作用等於零,甚至爲負值,從而避免了被控量的嚴重超調。所以對有較大慣性或滯後的被控對象,比例+微分(PD)控制器能改善系統在 調節過程中的動態特性。
綜上所述得到一個一條公式,這個就是模擬PID
下面是關於應用,增量式PID算法。其實PID的算法可以做很深,但沒必要,一般入門級的算法已經在很多場合夠用了,這裏之所以選用增量式PID算法(另外還有位置式PID等等),因爲增量式PID算法運算量少,非常適合單片機的應用。
顯然要想給單片機運算,就必須是數字量,而上述的PID是模擬PID,我們要將他數字化,離散化。
其中積分在上面說到的,他的幾何意義就是求e(t)與時間軸t圍成的圖形的面積,將這個面積分成T等分 ,T=0到T=1跟e(t)圍成的面積加上T=1到T=2跟e(t)圍成的面積一直累加……直到T-1到T跟e(t)圍成的面積剛好就是整個e(t)與t時間軸圍成的面積,剛剛好是e(t)對t的積分,如果T無限大,那麼就可以分割成無限個小圖形那麼這個圖形的面積就可以用T[e(1)+e(2)+………+e(T-1)+e(T)]來代替積分效果,而這個T等分就是AD在整個時間軸t中採樣的點,顯然越快的AD在相同的時間t裏面採樣的點越多,換句話說就是T更接近無限大。因此積分可以用累和代替。

下面爲積分的專業的解釋
定義
  設函數f(x)在[a,b]上有界,在[a,b]中任意插入若干個分點
  a=x0

typedef struct PID
{
       intSetPoint; //設定目標 DesiredValue
       longSumError; //誤差累計
       doubleProportion; //比例常數Proportional Const
       doubleIntegral; //積分常數 IntegralConst
       doubleDerivative; //微分常數Derivative Const
       intLastError; //Error[-1]
       intPrevError; //Error[-2]
} PID;


static PID sPID;
static PID *sptr = &sPID;
/*====================================================================
       InitializePID 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; //積分常數IntegralConst
       sptr->Derivative= 0; //微分常數Derivative Const
       sptr->SetPoint= 0;
}

/*==================================================================== 增量式PID計算部分 
====================================================================*/
int IncPIDCalc(int NextPoint)
{
       registerint 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);
}
發佈了95 篇原創文章 · 獲贊 36 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章