1PID控制算法
什么是PID
PID 控制器以各種形式使用超過了 1 世紀,廣泛應用在機械設備、氣動設備 和電子設備.在工業應用中PID及其衍生算法是應用最廣泛的算法之一,是當之無愧的萬能算法
PID 實指“比例 proportional”、“積分 integral”、“微分 derivative”,這三項構 成 PID 基本要素。每一項完成不同任務,對系統功能產生不同的影響。它的結構簡單,參數易 于調整,是控制系統中經常采用的控制算法。
PID:比例單元(P)、積分單元(I)和微分單元(D)組成
其中:u(t)為控制器輸出的控制量;(輸出)
e(t)為偏差信號,它等于給定量與輸出量之差;(輸入)
KP 為比例系數;(對應參數 P)
TI 為積分時間常數;(對應參數I)
TD 為微分時間常數。(對應參數 D)
數字 PID 控制算法通常分為位置式 PID 控制算法和增量式 PID 控制算法。
位置式 PID 算法 :
e(k): 用戶設定的值(目標值) - 控制對象的當前的狀態值
比例P : e(k)
積分I : ∑e(i) 誤差的累加
微分D : e(k) - e(k-1) 這次誤差-上次誤差
也就是位置式PID是當前系統的實際位置,與你想要達到的預期位置的偏差,進行PID控制
因為有誤差積分 ∑e(i),一直累加,也就是當前的輸出u(k)與過去的所有狀態都有關系,用到了誤差的累加值;(誤差e會有誤差累加),輸出的u(k)對應的是執行機構的實際位置,,一旦控制輸出出錯(控制對象的當前的狀態值出現問題 ),u(k)的大幅變化會引起系統的大幅變化
并且位置式PID在積分項達到飽和時,誤差仍然會在積分作用下繼續累積,一旦誤差開始反向變化,系統需要一定時間從飽和區退出,所以在u(k)達到最大和最小時,要停止積分作用,并且要有積分限幅和輸出限幅
所以在使用位置式PID時,一般我們直接使用PD控制
而位置式 PID 適用于執行機構不帶積分部件的對象,如舵機和平衡小車的直立和溫控系統的控制
結合代碼可以很好理解
typedef struct PID
{
float P,I,D,limit;
}PID;
typedef struct Error
{
float Current_Error;//當前誤差
float Last_Error;//上一次誤差
float Previous_Error;//上上次誤差
}Error;
/*!
* @brief 位置式PID
* @since v1.0
* *sptr :誤差參數
* *pid: PID參數
* NowPlace:當前位置
* Point: 預期位置
*/
// 位置式PID控制
float PID_Realize(Error *sptr,PID *pid, int32 NowPlace, float Point)
{
int32 iError, // 當前誤差
Realize; //實際輸出
iError = Point - NowPlace; // 計算當前誤差
sptr->Current_Error += pid->I * iError; // 誤差積分
sptr->Current_Error = sptr->Current_Error > pid->limit?pid->limit:sptr->Current_Error;//積分限幅
sptr->Current_Error = sptr->Current_Error <-pid->limit?-pid->limit:sptr->Current_Error;
Realize = pid->P * iError //比例P
+ sptr->Current_Error //積分I
+ pid->D * (iError - sptr->Last_Error); //微分D
sptr->Last_Error = iError; // 更新上次誤差
return Realize; // 返回實際值
}
增量式PID
比例P : e(k)-e(k-1) 這次誤差-上次誤差
積分I : e(i) 誤差
微分D : e(k) - 2e(k-1)+e(k-2) 這次誤差-2*上次誤差+上上次誤差
增量式PID根據公式可以很好地看出,一旦確定了 KP、TI 、TD,只要使用前后三次測量值的偏差, 即可由公式求出控制增量
而得出的控制量▲u(k)對應的是近幾次位置誤差的增量,而不是對應與實際位置的偏差 沒有誤差累加
也就是說,增量式PID中不需要累加??刂圃隽喀(k)的確定僅與最近3次的采樣值有關,容易通過加權處理獲得比較好的控制效果,并且在系統發生問題時,增量式不會嚴重影響系統的工作
總結:增量型 PID,是對位置型 PID 取增量,這時控制器輸出的是相鄰兩次采樣時刻所計算的位置值
之差,得到的結果是增量,即在上一次的控制量的基礎上需要增加(負值意味減少)控制量。
typedef struct PID
{
float P,I,D,limit;
}PID;
typedef struct Error
{
float Current_Error;//當前誤差
float Last_Error;//上一次誤差
float Previous_Error;//上上次誤差
}Error;
/*!
* @brief 增量式PID
* @since v1.0
* *sptr :誤差參數
* *pid: PID參數
* NowPlace:實際值
* Point: 期望值
*/
// 增量式PID電機控制
int32 PID_Increase(Error *sptr, PID *pid, int32 NowPlace, int32 Point)
{
int32 iError, //當前誤差
Increase; //最后得出的實際增量
iError = Point - NowPlace; // 計算當前誤差
Increase = pid->P * (iError - sptr->Last_Error) //比例P
+ pid->I * iError //積分I
+ pid->D * (iError - 2 * sptr->Last_Error + sptr->Previous_Error); //微分D
sptr->Previous_Error = sptr->Last_Error; // 更新前次誤差
sptr->Last_Error = iError; // 更新上次誤差
return Increase; // 返回增量
}
增量式與位置式區別:
1增量式算法不需要做累加,控制量增量的確定僅與最近幾次偏差采樣值有關,計算誤差對控制 量計算的影響較小。而位置式算法要用到過去偏差的累加值,容易產生較大的累加誤差。
2增量式算法得出的是控制量的增量,例如在閥門控制中,只輸出閥門開度的變化部分,誤動作 影響小,必要時還可通過邏輯判斷限制或禁止本次輸出,不會嚴重影響系統的工作。 而位置式的輸出直接對應對象的輸出,因此對系統影響較大。
3增量式PID控制輸出的是控制量增量,并無積分作用,因此該方法適用于執行機構帶積分部件的對象,如步進電機等,而位置式PID適用于執行機構不帶積分部件的對象,如電液伺服閥。
4在進行PID控制時,位置式PID需要有積分限幅和輸出限幅,而增量式PID只需輸出限幅
位置式PID優缺點:
優點:
①位置式PID是一種非遞推式算法,可直接控制執行機構(如平衡小車),u(k)的值和執行機構的實際位置(如小車當前角度)是一一對應的,因此在執行機構不帶積分部件的對象中可以很好應用
缺點:
①每次輸出均與過去的狀態有關,計算時要對e(k)進行累加,運算工作量大。
增量式PID優缺點:
優點:
①誤動作時影響小,必要時可用邏輯判斷的方法去掉出錯數據。
②手動/自動切換時沖擊小,便于實現無擾動切換。當計算機故障時,仍能保持原值。
③算式中不需要累加??刂圃隽喀(k)的確定僅與最近3次的采樣值有關。
缺點:
①積分截斷效應大,有穩態誤差;
②溢出的影響大。有的被控對象用增量式則不太好;
編輯:hfy
-
電機控制
+關注
關注
3534文章
1879瀏覽量
268800 -
PID
+關注
關注
35文章
1472瀏覽量
85515
發布評論請先 登錄
相關推薦
評論