理想的PID算法往往不能滿足實際使用中的很多場景,比如積分飽和的問題,因此需要在此基礎上對積分器做抗飽和處理,積分anti windup的優化。這不,隆哥這次面試,直接掛在這么基礎的知識點上,腸子悔青,在這里簡單總結一下。
1、什么是積分飽和
積分飽和(Integral windup或integrator windup)是指PID控制器或是其他有積分器的控制器中可能會發生的一種現象。
這種現象往往發生在誤差有大幅變化(例如大幅增加),積分器因為誤差的大幅增加有很大的累計量,因為積分器的輸出滿足下式;
離散化形式表示為:
所以隨著時間的增加,每次累積較大的誤差 ,很容易造成積分飽和并產生較大的過沖,而且當誤差變為負時,其過沖仍維持一段時間之后才恢復正常的情形。
2、實際的例子
這里舉一個直流電機調速例子,先看下圖;
隆哥設定了轉速為 ,這里可以是100 rpm,但是由于某種原因電機一開始堵轉了,所以反饋的轉速 為0;
這時候仍然處于堵轉狀態,那偏差 就會一直處于很大的狀態,積分器對偏差 進行累積,便迅速達到一個很大的值,導致PID的輸出已經接近輸出的 上限,導致最終輸出的PWM的占空比很大;
此時,堵轉忽然消失,但是前面提到PID的輸出已經接近輸出的 上限,因此電機轉速也急劇上升,當 時, ,此時偏差都處于負數狀態;
雖然誤差變成負數,并且積分器開始累加負數,但是由于之前積分器累積的值已經很大,于是,PID依然會保持較大的輸出一段時間,從而產生了很大的過沖;
通常會產生的輸出如下圖所示;

從圖中我們不難發現,這里有三個過程;
過程①:因為這個過程存在 較大幅度變化的誤差,因此積分器累積了較大的值,從圖中可以看到,積分器的面積比較大(陰影部分);過程②:此時積分已經飽和,產生了較大的過沖,并且在較長的一段時間內,一直處于過沖的狀態;過程③:積分脫離飽和狀態,產生了積極的調節作用,消除靜差,系統輸出達到設定值;
3、負面影響
積分器的作用是消除系統穩態誤差,如果出現積分飽和,往往會對系統造成負面的影響;
系統輸出會產生較大的過沖(超調量);
如果產生正向飽和(圖一所示)則系統對于反向的變化會偏慢;
系統產生了較大的過沖 ,并且較大的一段時間 都處于過沖的狀態;具體如下圖所示;

4、如何防止積分飽和
為了防止PID控制器出現積分飽和,需要在算法加入抗積分飽和(anti-integral windup)的算法;通常有以下幾種措施;
積分分離或者稱為去積分算法;
在飽和的時候將積分器的累計值初始化到一個比較理想的值;
若積分飽和因為目標值突然變化而產生,將目標值以適當斜率的斜坡變化可避免此情形;
將積分累計量限制上下限,避免積分累計量超過限制值;
如果 PID輸出已經飽和,重新計算積分累計量,使輸出恰好為合理的范圍;
TI文檔中的方法
下面是TI的位置式PI算法所做的改進,如下圖所示;

比例部分的輸出:
積分部分的輸出:
未做處理的PID輸出:
最終PID輸出 :
抗積分飽和用的系數
根據我的理解,由上述輸出和①式可知,判斷系統是否處于飽和的狀態;
如果 ,說明積分器處于飽和狀態,此時使 系數為0,這樣防止積分進一步進行累積。
反計算抗飽和法
反計算Anti-Windup法,簡稱AW法,就是在輸出限幅部分根據輸入信號和輸出信號的差值,把 作為反饋值輸入到積分部分,從而達到抑制積分飽和現象的目的;
具體如下圖所示;

不難發現,在輸出未飽和的情況下, 因此不會對積分器造成影響;當系統發生飽和時,則 ;
現在假設此時為正向飽和,則 ,那么 ,所以最終將 反饋到積分部分;那么從圖中可知,相當于從 中減去了 ,這樣可以削弱積分,讓它退出飽和的狀態;
關于 系數, 越大,積分器退出飽和的作用越強,反之則越弱;
當然,積分抗飽和的方法還有很多 遇限積分削弱法,遇限保留積分法 ,這只是其中的一種,下面給出TI的位置式PID算法,增量式的抗飽和處理也是類似的做法。
5、PID算法(抗飽和)
TI的算法中只實現了比例和積分,如果需要微分項,可以去除結尾部分的注釋;
/* ===========
File name: PID_REG3.H (IQ version)
=*/ #ifndef __PIDREG3_H__ #define __PIDREG3_H__ typedef struct { _iq Ref;
// Input: Reference input _iq Fdb;
// Input: Feedback input _iq Err; // Variable: Error
_iq Kp; // Parameter: Proportional gain _iq Up; // Variable: Proportional output
_iq Ui; // Variable: Integral output _iq Ud; // Variable: Derivative output
_iq OutPreSat; // Variable: Pre-saturated output _iq OutMax; // Parameter: Maximum output
_iq OutMin; // Parameter: Minimum output _iq Out; // Output: PID output
_iq SatErr; // Variable: Saturated difference _iq Ki; // Parameter: Integral gain
_iq Kc; // Parameter: Integral correction gain _iq Kd; // Parameter: Derivative gain
_iq Up1; // History: Previous proportional output } PIDREG3;
typedef PIDREG3 *PIDREG3_handle;
/*-----------------------------------------------------------------------------
Default initalizer for the PIDREG3 object.
--*/ #define PIDREG3_DEFAULTS { 0, \
0, \
0, \
_IQ(1.3), \
0, \
0, \
0, \
0, \
_IQ(1), \
_IQ(-1), \
0, \
0, \
_IQ(0.02), \
_IQ(0.5), \
_IQ(1.05), \
0, \
}
/*------------------------------------------------------------------------------
PID Macro Definition
------------------------------------------------------------------------------*/
#define PID_MACRO(v) \
v.Err = v.Ref - v.Fdb; /* Compute the error */ \
v.Up= _IQmpy(v.Kp,v.Err); /* Compute the proportional output */ \
v.Ui= v.Ui + _IQmpy(v.Ki,v.Up) + _IQmpy(v.Kc,v.SatErr); /* Compute the integral output */ \
v.OutPreSat= v.Up + v.Ui; /* Compute the pre-saturated output */ \
v.Out = _IQsat(v.OutPreSat, v.OutMax, v.OutMin); /* Saturate the output */ \
v.SatErr = v.Out - v.OutPreSat; /* Compute the saturate difference */ \
v.Up1 = v.Up;
/* Update the previous proportional output */ #endif // __PIDREG3_H__ // Add the lines below if derivative output is needed following the integral update //
v.Ud = _IQmpy(v.Kd,(v.Up - v.Up1)); // v.OutPreSat = v.Up + v.Ui + v.Ud;
編輯:hfy
-
直流電機
+關注
關注
36文章
1781瀏覽量
73907 -
PID
+關注
關注
38文章
1499瀏覽量
91154 -
積分器
+關注
關注
4文章
102瀏覽量
29377
發布評論請先 登錄
變頻器內置PID控制參數的含義
變頻器PID參數設置步驟
變頻器pid怎么啟用
PID控制的算法
C語言實現PID算法介紹
CW32L012的PID溫度控制——算法基礎
松下抗硫化厚膜片式電阻(抗浪涌型):技術解析與使用注意事項
怎樣理解變頻器內置PID控制參數的含義
Aerodiode高帶寬激光鎖定PID控制器
一文解析PID的積分抗飽和原理
評論