PID詳解1(理論+整定方法)
PID詳解(理論+應用)
~~~~ 最近研究智能小車這個方面,發現這個課題貌似已經被研究透了,僅僅在CSDN中就能搜索到無數的相關博文。但我查看一些博文的時候,隱隱感覺出作者君似乎也僅僅處于似懂非懂的階段,又或者他用的是春秋筆法所以模糊了一些關鍵點?為了記錄下自己看過的博文并且自我總結一些相關方面,在此提筆記錄一下自己的研究過程。
理論基礎:
PID是什么?
工業過程中廣泛采用的三作用控制器,也稱PID控制器(PID controller).
P: (Proportional)比例;
I : (Integral)積分;
D:(Derivative)微分;
時域輸出方程:
u ( t ) = K P ? e ( t ) + K I ? ∫ e ( t ) + K D ? d e ( t ) d t u(t)=K_P*e(t) +K_I*\int e(t)+K_D*\frac{de(t)}{dt} u(t)=KP??e(t)+KI??∫e(t)+KD??dtde(t)?
編程中我們更多用到的是這個方程的數字式:
U [ k ] = K P ? e r r [ k ] + K I ? ∑ e r r [ k ] + K D ? ( e r r [ k ] ? e r r [ k ? 1 ] ) U[k]=K_P*err[k]+K_I*\sum err[k]+K_D*(err[k]-err[k-1]) U[k]=KP??err[k]+KI??∑err[k]+KD??(err[k]?err[k?1])
由基本的自控知識可得到傳遞函數:
G c ( s ) = U ( s ) E ( s ) = K P + K I s + K D ? s Gc(s)=\frac{U(s)}{E(s)}=K_P+\frac{K_I}{s}+K_D*s Gc(s)=E(s)U(s)?=KP?+sKI??+KD??s
其中可調的三個參數就是:
K
P
K_P
KP?:比例增益 Proportional gain
K
I
K_I
KI? :積分增益 Integral gain
K
D
K_D
KD?:微分增益 Derivative gain
- 但很多情況下,我們不需要使用到全部的三種手段,經過排列組合就出現了P、PI、PD這種不完全版的控制器。
在工業中,更多采用傳統的PID控制器:
u ( t ) = 100 P ( e ( t ) + 1 T 1 ∫ e ( t ) d t + T D d e ( t ) d t ) ~~~~~~~u(t)=\frac{100}{P}(e(t)+\frac{1}{T_1}\int e(t)dt+T_D\frac{de(t)}{dt}) u(t)=P100?(e(t)+T1?1?∫e(t)dt+TD?dtde(t)?)
其中:
P : 比例帶(%)
T
1
T_1
T1? :積分時間(s)
T
D
T_D
TD?:微分時間(s/min)
對比之前的公式,我們得到:
K
P
=
100
P
K_P = \frac{100}{P}
KP?=P100?
K
I
=
100
P
?
1
T
1
K_I = \frac{100}{P}*\frac{1}{T_1}
KI?=P100??T1?1?
K
D
=
100
P
?
T
D
K_D=\frac{100}{P}*T_D
KD?=P100??TD?
~~~~ 在工業的高精度要求與復雜處理環境下,我們對微積分時間的關注度更高。但在平時的小設計沒有必要采用這一套體系。
~~~~ 在實際應用中,反饋測量信號往往混雜高頻噪聲,微分處理則會放大這些噪聲,所以這里我們需要濾波來去除高頻噪聲。
~~~~ 所以這里我們的微分項在實際實現是采用:
G d ( s ) = K D s τ d s + 1 ~~~~~G_d(s)=\frac{K_Ds}{\tau_d s+1} Gd?(s)=τd?s+1KD?s?
其中:
τ
d
\tau_d
τd? 作為濾波時間常數,遠遠小于過程本身的時間,可以忽略。
位置式PID和增量式PID
位置式PID:
還是這個公式:

其中誤差
P
:
e
(
k
)
=
設定值
?
當前狀態值
P: e(k) = 設定值 - 當前狀態值
P:e(k)=設定值?當前狀態值
I
:
∑
e
(
i
)
=
誤差的累加
I : \sum e(i) = 誤差的累加
I:∑e(i)=誤差的累加
D
:
e
(
k
)
?
e
(
k
?
1
)
=
本次誤差
?
上一次的誤差
D: e(k) - e(k-1) = 本次誤差 - 上一次的誤差
D:e(k)?e(k?1)=本次誤差?上一次的誤差
位置式PID是對:當前系統的實際位置與你預期位置的偏差 進行PID控制。
通常PD控制器就可以滿足位置式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
Δ
u
[
k
]
=
u
[
k
]
?
u
[
k
?
1
]
\Delta u[k] = u[k]-u[k-1]
Δu[k]=u[k]?u[k?1]
=
K
P
[
e
[
k
]
?
e
[
k
?
1
]
]
+
K
I
e
(
k
)
+
K
D
[
e
[
k
]
?
2
e
[
k
?
1
]
+
e
[
k
?
2
]
]
=K_P[e[k]-e[k-1]]+K_Ie(k)+K_D[e[k]-2e[k-1]+e[k-2]]
=KP?[e[k]?e[k?1]]+KI?e(k)+KD?[e[k]?2e[k?1]+e[k?2]]
P : e ( k ) ? e ( k ? 1 ) = P: e(k)-e(k-1)= P:e(k)?e(k?1)= 本次誤差 - 上一次的誤差
I : e ( i ) = I : e(i) = I:e(i)= 誤差
D : e [ k ] ? 2 e [ k ? 1 ] + e [ k ? 2 ] ¥ D: e[k]-2e[k-1]+e[k-2]¥ D:e[k]?2e[k?1]+e[k?2]¥ = 本次誤差 - 2*上一次的誤差+上上次誤差
增量式PID的控制量
Δ
u
(
k
)
\Delta u(k)
Δu(k)是最近幾次誤差的增量,而不是實際的誤差,沒有誤差累加
所以增量式PID不需要累加,只需要最近的相鄰三次誤差就可以通過加權獲得比較好的控制效果,而系統出問題時這種PID不會嚴重影響系統工作。
總結:增量型 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優缺點:
優點:
①誤動作時影響小,必要時可用邏輯判斷的方法去掉出錯數據。
②手動/自動切換時沖擊小,便于實現無擾動切換。當計算機故障時,仍能保持原值。
③算式中不需要累加。控制增量Δu(k)的確定僅與最近3次的采樣值有關。
缺點:
①積分截斷效應大,有穩態誤差;
②溢出的影響大。有的被控對象用增量式則不太好;
下面理論分析PID的作用
G c ( s ) = K P + K I s + K D s = K D s 2 + K P s + K I s = K D ( S 2 + a s + b ) s = K D ( s + z 1 ) ( s + z 2 ) s G_c(s)=K_P+ \frac{K_I}{s}+K_Ds =\frac{K_Ds^2+K_Ps+K_I}{s}\\ =\frac{K_D(S^2+as+b)}{s}=\frac{K_D(s+z_1)(s+z_2)}{s} Gc?(s)=KP?+sKI??+KD?s=sKD?s2+KP?s+KI??=sKD?(S2+as+b)?=sKD?(s+z1?)(s+z2?)?
根據數學知識可得:
a
=
K
P
K
D
,
b
=
K
I
K
D
a=\frac{K_P}{K_D},b=\frac{K_I}{K_D}
a=KD?KP??,b=KD?KI??
所以我們可以得知,引用PID會為系統帶來一個純積分環節和兩個零點。
原點處的極點可以提高系統的型數,改善穩態性能
兩個零點理論上可以在任何位于左半S平面的任意位置
PID整定方法
對于有數學模型的系統,自然可以仿真完成整定,但對于一個實際系統,我們可以通過實驗來標定。
1.手動標定
1.系統閉環,采取P控制器,設置Ki = 0, Kd = 0, Kp取一個較小的數,
滿足系統穩定即可
2.逐漸增加Kp,每次改變控制器參數,都要觀察一段時間系統輸出量、控
制量,直到閉環系統達到臨界穩定,輸出量產生等幅度、等周期的持續震蕩
記錄此時的Kp
3.將Kp減少一半,繼續采用P控制器,逐步減少Kp,直到獲得4:1衰減震蕩
4.固定Kp,設置Kd = 0,采用PI控制器,將Ki從0開始逐漸增大,每次改變
控制器參數,都要觀察一段時間系統輸出、控制量,直到閉環系統對擾動
的抑制 和/或 對設定值的階躍響應 達到最佳。
5.固定Kp和Ki,采用PID控制器,將Kd從0開始逐漸增大,每次改變控制器參數
觀察系統輸出、控制量,直到閉環系統對擾動的抑制 和/或 對設定值的階躍
相應達到最佳
6.采用PID控制器,在已獲得的Kp,Ki,Kd附近,進一步精調控制器參數,直到
得到最滿意的系統響應
對于PID的三個參數,對系統階躍相應的影響:
| PID增益 | 百分比超調量 | 調整時間 | 穩態誤差 |
|---|---|---|---|
| 增大Kp | 增大 | 影響很小 | 減小 |
| 增大Ki | 增大 | 增大 | 為0 |
| 增大Kd | 減小 | 減小 | 沒有影響 |
上表僅為參考,現實中情況錯綜復雜,一定要積極變通。
2.臨界比例帶法:Z-N法(Zigler-Nichols)
閉環:
這是一套實驗得出的方法,目標是使得閉環系統得到4:1衰減振蕩的階躍相應,閉環相應速度較快、振蕩適中、擾動抑制能力強。
1.設置Ki = 0, Kd = 0, 采用純P控制器
2.增大Kp,觀測輸入、輸出,直到系統達到臨界穩定,產生幅值和周期不變
的持續振蕩
3.記錄Kp,成為臨界增益Ku;振蕩周期稱為臨界振蕩周期Tu
4.選定控制器類型,按閉環Z-N整定規則計算PID各個增益
整定規則:
| 控制器類型 | Kp | Ki | Kd |
|---|---|---|---|
| P Gc(s)=Kp | 0.5Ku - | - | |
| PI Gc(s)=Kp+Ki/s | 0.45Ku | 0.54Ku/tu | - |
| PID Gc(s)=Kp+Ki/s+Kds | 0.6Ku | 1.2Ku/Tu | 0.6KuTu/8 |
其實還有一種開環Z-N手段,這里不再贅述
3.經驗法:
1.P控制器:Ki = 0, Kd = 0,選擇初始Kp, 觀測擾動曲線或設定值響應曲線,
增大或減小Kp,觀測曲線是否有所改善,若改善,則繼續按此方向整定Kp,
反之,反向整定Kp,直到得到較好的曲線
2.Kp減小0.8倍,從0開始增大Ki,觀測曲線,得到較好的響應曲線
3.固定Ki,精調Kp,增大或減小Kp,直到得到較好的響應曲線
4.同里,精調Ki
5.由此得到較好的Kp、Ki
6.若增加微分,則采用類似方法,從0開始整定Kp,并進一步精調Kp、Ki、Kd
也可按照以下初始試湊范圍設定PID控制器初始值,然后精調
| 系統類型 | P(%) | Ti(s) | Td(s) |
|---|---|---|---|
| 溫度 | 20-60 | 180-600 | 30-180 |
| 流量 | 40-100 | 6-60 | - |
| 壓力 | 30-70 | 124-180 | |
| 液壓 | 20-80 |
var code = “7794f5a6-3484-4545-91d8-e7d01462725e”

浙公網安備 33010602011771號