智慧型控制 Intelligent Control

傳統 PID 控制

PID 控制器是工業上用得最多的回授控制器:溫度、流量、壓力、馬達轉速與位置,大多數迴路都是 PID。它由三項組成,所以也叫「三項控制器」(three-term controller)。(本頁文字為依原講義改寫的中文說明)

項名稱看的是主要作用
P比例 Proportional現在的誤差誤差越大推得越用力,決定反應快慢;單獨使用會留下穩態誤差
I積分 Integral過去累積的誤差只要還有誤差就持續累加,消除穩態誤差,提供精確度
D微分 Derivative誤差變化的趨勢提早踩煞車,增加阻尼、減少超越量;但會放大量測雜訊

PID 演算法 Algorithms

e(t)比例 PKp​現在的誤差積分 IKi​ ∫ e dt過去累積的誤差微分 DKd​ de/dt誤差變化的趨勢三項相加u(t)→ 致動器

控制器比較設定值(SP)與量測值(PV)得到誤差 \(e = SP - PV\),輸出 \(u(t)\) 有兩種常見寫法。理想式(ISA 標準式)以一個增益 \(K_p\) 乘上整個括號,積分、微分強弱用時間常數表示:

$$u(t) = K_p\left(e(t) + \frac{1}{T_i}\int_0^t e(\tau)\,d\tau + T_d\,\frac{de(t)}{dt}\right)$$

把括號展開就是並聯式,三項各有獨立的增益:

$$u(t) = K_p\,e(t) + K_i\int_0^t e(\tau)\,d\tau + K_d\,\frac{de(t)}{dt},\qquad K_i = \frac{K_p}{T_i},\quad K_d = K_pT_d$$

取拉氏轉換,控制器的轉移函數為

$$C(s) = \frac{U(s)}{E(s)} = K_p + \frac{K_i}{s} + K_d\,s = \frac{K_d s^2 + K_p s + K_i}{s} = K_p\left(1 + \frac{1}{T_i s} + T_d s\right)$$
編註:原講義第二式寫成 \(\dfrac{E(s)}{U(s)} = \dfrac{1}{K_p + K_i/s + K_d s} = \dfrac{K_d s^2+K_p s+K_i}{s}\),第二個等號不成立——\(\dfrac{1}{K_p + K_i/s + K_d s}\) 應等於 \(\dfrac{s}{K_d s^2+K_p s+K_i}\)。原意是控制器 \(U(s)/E(s)\) 的轉移函數,如上式。

實作細節(取樣、梯形積分、微分只作用在量測值、輸出限制)見數位實作;用運算放大器做的版本見類比實作。

例題:直流馬達轉速控制 DC Motor Speed Control

以原講義 DCMotorData.m 的參數建模:電感 \(L\) = 0.5 H、電阻 \(R\) = 1 Ω、轉子慣量 \(J_m\) = 0.01 kg·m²、黏滯摩擦 \(B\) = 0.1 N·m·s、反電動勢常數 \(K_e\) = 轉矩常數 \(K_t\) = 0.01。

電樞1/(Ls+R)Kt​轉子1/(Jm​s+B)Ke​V(電壓)+−i+−TL​負載轉矩ω反電動勢電樞迴路:L di/dt = V − R i − Ke ω  轉子:Jm dω/dt = Kt i − B ω − TL $$L\frac{di}{dt} = V - Ri - K_e\,\omega,\qquad J_m\frac{d\omega}{dt} = K_t\,i - B\,\omega - T_L \quad\Longrightarrow\quad \frac{\Omega(s)}{V(s)} = \frac{K_t}{(Ls+R)(J_m s+B)+K_eK_t}$$

穩態增益 \(K_t/(RB+K_eK_t)\) = 0.01/0.1001 ≈ 0.0999 (rad/s)/V。

開迴路

012345678910-0.25-0.2-0.15-0.1-0.0500.050.1時間(s)轉速 ω(rad/s)加負載開迴路:輸入 0.6 V,t = 4 s 加負載

輸入 0.6 V,轉速只到 0.6 × 0.0999 ≈ 0.060 rad/s;在 \(t\) = 4 s 加上負載(原模型以 \(T_L/J_m\) = 3 rad/s² 加在角加速度上,即 \(T_L\) = 0.03 N·m),轉速再掉 \(R\,T_L/(RB+K_eK_t)\) ≈ 0.30 rad/s,變成 −0.24 rad/s——馬達被負載拖著反轉,開迴路完全無法應付。

加上 PID 回授

00.511.522.5300.20.40.60.811.21.4時間(s)轉速 ω(rad/s),設定值 1Kp=100, Ki=1, Kd=1Kp=100, Ki=200, Kd=1Kp=100, Ki=200, Kd=10同上,微分作用在誤差(理想)

設定值 1 rad/s 的步階響應(三組增益與原講義相同):

編註(補充):原講義的 Simulink 圖其實相當於「微分只作用在量測值」。Simulink 的步階方塊設在 \(t\) = 0 時,一開始就輸出 1,微分方塊看不到那一下跳動,所以沒有「微分踢」。以 verify_pid.py 重算,三條曲線的峰值(1.08、1.25、1.12)與峰值時間都和原圖吻合。若微分真的作用在誤差上(虛線),設定值的步階會在 \(t=0^+\) 產生一個電壓脈衝,曲線反而幾乎沒有超越量,但實際的驅動器根本送不出這種脈衝。這也是工業 PID 多半讓微分只作用在量測值的原因。

下面的模擬可以自己調整三個增益、切換微分的作用對象,並在 1.5 s 加上負載:

自製動畫(依控制理論數值模擬)

加負載

01234567891000.10.20.30.40.50.60.7時間(s)轉速 ω(rad/s)加負載PID(Kp=100, Ki=200, Kd=10):設定 0.6 rad/s,t = 4 s 加負載
▶ 在 Colab 開啟原課程的 MATLAB 程式已改寫成 Python 筆記本(第 1~4 節:DCMotorData/DCMotorDataPID.m 與三個直流馬達的 Simulink 模型),可以直接在瀏覽器執行、修改參數。⬇ 下載 PID.ipynb

設定 0.6 rad/s、\(t\) = 4 s 加上同樣的負載:PID 迴路只讓轉速短暫下降,積分項很快就把它拉回 0.6 rad/s。原講義附檔:開迴路模型、PID 模型、PID 加負載模型、DCMotorData.m、DCMotorDataPID.m。

P、I、D 各自的影響 Effects of Kp, Ki, Kd

增益加大上升時間超越量安定時間穩態誤差
\(K_p\)縮短增加小幅變化減小(不會歸零)
\(K_i\)縮短增加增加消除
\(K_d\)小幅變化減少縮短小幅變化

這張表只是趨勢:三個增益會互相影響,調了其中一個,另外兩個的效果也跟著變,只能當調整時的參考。設計 PID 的一般步驟:

  1. 先看開迴路響應,找出要改善什麼。
  2. 加比例控制縮短上升時間。
  3. 加微分控制壓低超越量。
  4. 加積分控制消除穩態誤差。
  5. 反覆微調 \(K_p\)、\(K_i\)、\(K_d\) 到滿意為止。

三項不一定都要用:PI 夠好就不必加 D,控制器越簡單越好。另見Simulink 示範、用 SISOTool 設計、PID 與根軌跡(舊站)↗。

Ziegler–Nichols 調整法 Ziegler–Nichols Tuning

Ziegler 與 Nichols 在 1942 年提出的經驗法則,至今仍是現場調 PID 的起點。以理想式 \(C(s) = K_p(1 + 1/(T_is) + T_ds)\) 表示,分成兩種方法。為了說明,以下用範例受控體 \(G(s) = 1/(s+1)^3\) 示範(補充)。

反應曲線法(開迴路)

01234567891000.20.40.60.81時間(s)輸出(輸入在 t = 0 加單位步階)反曲點LTL = 0.805 s,T = 3.695 s增益 K = Δ輸出/Δ輸入 = 1

對受控體做步階測試,在響應的反曲點畫切線,量出延遲時間 \(L\) 與時間常數 \(T\),並算出製程增益 \(K = \Delta PV/\Delta OP\),令 \(K_c = T/(K L)\):

控制器\(K_p\)\(T_i\)\(T_d\)
P\(K_c\)∞0
PI\(0.9\,K_c\)\(3.3\,L\)0
PID\(1.2\,K_c\)\(2\,L\)\(0.5\,L\)

範例:\(1/(s+1)^3\) 的步階響應反曲點在 \(t\) = 2 s,切線得 \(L\) = 0.805 s、\(T\) = 3.695 s、\(K\) = 1,\(K_c\) = 4.59,所以 PID 取 \(K_p\) = 5.50、\(T_i\) = 1.61 s、\(T_d\) = 0.40 s。

臨界增益法(閉迴路)

0369121500.511.52時間(s)輸出(設定值步階 1)K = 0.6 Ku = 4.8:振盪衰減K = Ku = 8:持續等幅振盪Tu = 3.63 s範例受控體 G(s) = 1/(s+1)³ 加比例控制:增益加到 Ku 時輸出持續振盪
  1. 只用比例控制(關掉積分、微分)。
  2. 逐步加大比例增益,直到輸出出現持續的等幅振盪,此時的增益稱為臨界增益 \(K_u\)(原講義記為 \(K_c\))。
  3. 量出振盪週期 \(T_u\)(原講義記為 \(T_c\))。
控制器\(K_p\)\(T_i\)\(T_d\)
P\(0.5\,K_u\)∞0
PI\(0.45\,K_u\)\(0.833\,T_u\)0
PID\(0.6\,K_u\)\(0.5\,T_u\)\(0.125\,T_u\)

範例:閉迴路特徵方程式 \(s^3+3s^2+3s+1+K=0\),以羅斯判別法得臨界 \(K_u\) = 8,此時極點在 \(s = \pm j\sqrt3\),週期 \(T_u = 2\pi/\sqrt3\) = 3.63 s;PID 取 \(K_p\) = 4.8、\(T_i\) = 1.81 s、\(T_d\) = 0.45 s。

0369121500.511.52時間(s)輸出(設定值步階 1)反應曲線法:Kp=5.50, Ti=1.61, Td=0.40臨界增益法:Kp=4.80, Ti=1.81, Td=0.45兩組 ZN 參數都有明顯超越量:只是起點,還要再微調

Ziegler–Nichols 的目標是「每週期衰減到四分之一」,參數偏積極,通常會有不小的超越量,只能當起點,還要再微調。

▶ 在 Colab 開啟原課程的 MATLAB 程式已改寫成 Python 筆記本(第 8 節:兩種 Ziegler–Nichols 調整法的計算與比較),可以直接在瀏覽器執行、修改參數。⬇ 下載 PID.ipynb

延伸閱讀(原講義附檔):Iterative Feedback Tuning of PID、PIDTuning、PID Tuning、PID_Tuning1;Automation.com ↗(原講義另列 ExperTune 公司網站,已無法連線)。

原圖對照(演算法)
原圖
原圖
原圖
原圖
原圖
原圖
原圖對照(直流馬達例題的 Simulink 模型與響應)
原圖
原圖
原圖
原圖
原圖
原圖
原圖
原圖
原圖對照(Ziegler–Nichols)
原圖
原圖
原圖
原講義的 PID 介紹動畫(Flash)