智慧型控制 Intelligent Control

Digital Implementation

用電腦或微控制器實作 PID 時,誤差每隔一個取樣週期 \(T\) 才讀一次,連續的積分與微分要改成用取樣值近似。(說明依原講義改寫)

01234誤差 e(橫軸:第 k 次取樣)e1​e2​e3​e4​積分 ≈ 矩形面積和 Σ e·T01234誤差 e(橫軸:第 k 次取樣)e2​e3​TΔe微分 ≈ 相鄰兩點的斜率 Δe/T

三項的離散化 Discretizing P, I, D

記第 \(k\) 次取樣的誤差為 \(e_k = SP_k - PV_k\)。

編註:原講義梯形積分一段的文字提到「誤差越大、積分作用越小」的非線性調整,但所列公式只是單純的梯形積分,並沒有包含這個非線性因子。原講義的流程圖則採理想式:先算 \(E + \Sigma_I + \Delta_D\),最後才乘上 \(K_p\),其中的 \(K_I\)、\(K_D\) 相當於 \(1/T_i\)、\(T_d\)。下面的流程與程式採並聯式(三項各有增益),兩者只差增益的定義。

每個取樣週期的計算流程 Algorithm Flow

等待下一個取樣時刻讀入設定值 SP、量測值 PV誤差 e = SP − PV積分(梯形):S = S + Ki·T·(e + e_old)/2微分(對量測值):D = −Kd·(PV − PV_old)/T輸出 u = Kp·e + S + D限制 u 在 [u_min, u_max],飽和時退回這次積分送出 u(D/A);e_old = e、PV_old = PV每個取樣週期 T 重複
e_old = 0; S = 0                     # 初始化
每隔 T 秒:
    e = SP - PV                       # 誤差
    S = S + Ki * (e + e_old) / 2 * T  # 梯形積分
    D = -Kd * (PV - PV_old) / T       # 只對量測值微分
    u = Kp * e + S + D
    if u > u_max: u = u_max; S = S - Ki * (e + e_old) / 2 * T   # 飽和時退回這次積分
    if u < u_min: u = u_min; S = S - Ki * (e + e_old) / 2 * T
    輸出 u(D/A);e_old = e;PV_old = PV
▶ 在 Colab 開啟原課程的 MATLAB 程式已改寫成 Python 筆記本(第 7 節:照這段虛擬碼寫的數位 PID,含輸出限制與防積分飽和),可以直接在瀏覽器執行、修改參數。⬇ 下載 PID.ipynb

取樣週期要遠小於受控體的時間常數(常取閉迴路上升時間的 1/10 以下);太慢的話,上面的近似失真,閉迴路會變差甚至不穩定。

原講義附檔:PID_Digital.pdf、CarPIDControl.zip(LabVIEW 範例)。

原圖對照
原圖
原圖
原圖
原圖
原圖
原圖
原圖
原圖
原圖
原圖