Moduł 02 · klasyczne

Regulator PID

Człony P/I/D w izolacji i razem, tuning Z-N, anti-windup, derivative kick, feed-forward.

Wzór i intuicja

Trzy człony, jedna definicja, każdy z jasną rolą:

u(t)=Kpe(t)  +  Ki ⁣0te(τ)dτ  +  Kde˙(t),e=ry.u(t) = K_p\,e(t) \;+\; K_i\!\int_0^t e(\tau)\,d\tau \;+\; K_d\,\dot e(t), \qquad e = r - y.
  • P (proportional) — natychmiastowa odpowiedź na błąd. Większe KpK_p oznacza szybszą reakcję, ale i większe oscylacje. Dla plant typu 1/(ms2+cs+k)1/(ms^2 + cs + k) sam P daje uchyb ustalony ess=k/(k+Kp)e_{ss} = k/(k + K_p).
  • I (integral) — akumuluje błąd w czasie. Tak długo jak e0e \neq 0, całka rośnie i sygnał sterowania się zmienia. Konsekwencja: jedyny sposób na uzyskanie zerowego uchybu ustalonego pod stałym zaburzeniem. Cena: opóźnienie fazowe (90°), które przyczynia się do oscylacji.
  • D (derivative) — reaguje na tempo zmiany błędu. Działa jak „przewidywanie": jeśli błąd rośnie szybko, D dorzuca dodatkowe sterowanie wcześniej, niż zrobiłby to sam P. Tłumi oscylacje. Cena: wzmacnia szum pomiarowy (różniczka szumu jest jeszcze hałaśliwsza) i ma problem z derivative kick przy skokach referencji.
wzorzec liczbowy

PID na MSD — 4 pierwsze kroki krok-po-kroku

scenariusz
Plant MSD: m=1m = 1, c=2c = 2, k=4k = 4. Stan początkowy x0=0x_0 = 0, x˙0=0\dot x_0 = 0. Referencja r=1r = 1 (skok w t=0t=0). PID: Kp=8K_p = 8, Ki=4K_i = 4, Kd=2K_d = 2. Całkowanie: jawny Euler z Δt=0.01\Delta t = 0{.}01. Aproksymacja pochodnej: e˙(ekek1)/Δt\dot e \approx (e_k - e_{k-1})/\Delta t, całka: Ik=Ik1+ek1ΔtI_k = I_{k-1} + e_{k-1} \cdot \Delta t.

Iteracja kontrolera: uk=Kpek+KiIk+Kde˙ku_k = K_p\,e_k + K_i\,I_k + K_d\,\dot e_k. Dynamika plant: x¨=(ucx˙kx)/m\ddot x = (u - c\dot x - k x)/m. Schemat Euler: xk+1=xk+Δtx˙kx_{k+1} = x_k + \Delta t \cdot \dot x_k, x˙k+1=x˙k+Δtx¨k\dot x_{k+1} = \dot x_k + \Delta t \cdot \ddot x_k.

ktxeIėu
00.00000.00000.00001.00000.00000.00008.00008.0000
10.01000.00000.08001.00000.01000.00008.04007.8800
20.02000.00080.15880.99920.0200−0.08007.91367.5928
30.03000.00240.23470.99760.0300−0.15887.78327.3043
40.04000.00470.30780.99530.0400−0.23477.63007.0234
▸ Wyprowadzenie wiersza k=2k = 2 ręcznie

Z wiersza k=1k=1 mamy x=0x=0, x˙=0.08\dot x = 0{.}08, x¨=7.88\ddot x = 7{.}88. Aktualizacja Euler:

x2=0+0.010.08=0.0008x_2 = 0 + 0{.}01 \cdot 0{.}08 = 0{.}0008

x˙2=0.08+0.017.88=0.1588\dot x_2 = 0{.}08 + 0{.}01 \cdot 7{.}88 = 0{.}1588

e2=10.0008=0.9992e_2 = 1 - 0{.}0008 = 0{.}9992

I2=I1+e1Δt=0.01+10.01=0.02I_2 = I_1 + e_1 \cdot \Delta t = 0{.}01 + 1 \cdot 0{.}01 = 0{.}02

e˙2=(0.99921)/0.01=0.08\dot e_2 = (0{.}9992 - 1) / 0{.}01 = -0{.}08

u2=80.9992+40.02+2(0.08)=7.9936+0.080.16=7.9136u_2 = 8 \cdot 0{.}9992 + 4 \cdot 0{.}02 + 2 \cdot (-0{.}08) = 7{.}9936 + 0{.}08 - 0{.}16 = 7{.}9136

x¨2=(7.913620.158840.0008)/1=7.5928\ddot x_2 = (7{.}9136 - 2 \cdot 0{.}1588 - 4 \cdot 0{.}0008)/1 = 7{.}5928

Wszystkie liczby wyliczone ręcznie i zaokrąglone do 4 miejsc. Wpisz te wartości startowe do swojego kodu — jeśli kolejne kroki masz inne, masz błąd w implementacji.

1. Człony P, I, D w izolacji

Cztery konfiguracje na tym samym plant (mass-spring-damper z modułu 1), pod tym samym skokiem referencji. Pokazują, co każdy człon robi w izolacji i jak składają się razem.

wzmocnienia (wspólne dla wszystkich wariantów)

K_p8.0
K_i4.00
K_d2.00
Plant: masa-sprężyna-tłumik z modułu 1 (m=1, c=2, k=4). Skok referencji r=1r = 1 w t=0t = 0, czas symulacji 6 s. Cztery panele poniżej pokazują tę samą plant pod czterema różnymi konfiguracjami regulatora — Twoje suwaki wpływają na wszystkie naraz.
tylko PK_p=8.0 · K_i=0.00 · K_d=0.00
00.450.91.351.801.22.43.64.86ry
e_ss: 0.330M_p: 0.0%
Błąd ustalony niezerowy — brak mechanizmu eliminacji uchybu.
P + IK_p=8.0 · K_i=4.00 · K_d=0.00
00.450.91.351.801.22.43.64.86ry
e_ss: 0.040M_p: 9.0%
Człon I zeruje uchyb ustalony, ale wprowadza opóźnienie fazowe — większe oscylacje.
P + DK_p=8.0 · K_i=0.00 · K_d=2.00
00.450.91.351.801.22.43.64.86ry
e_ss: 0.330M_p: 0.0%
D tłumi pochodną błędu — mniej oscylacji, ale uchyb ustalony zostaje.
P + I + DK_p=8.0 · K_i=4.00 · K_d=2.00
00.450.91.351.801.22.43.64.86ry
e_ss: 0.030M_p: 0.0%
Pełny PID — i bez uchybu, i z tłumieniem oscylacji.
Co tu widać. Tylko-P stabilizuje, ale na poziomie poniżej referencji — to uchyb ustalony regulatora P na plant typu 1/(ms²+cs+k). Wartość: ess=k/(k+Kp)e_{ss} = k/(k + K_p), dla Kp=8K_p = 8 i k=4k = 4 daje ess=4/12=0.33e_{ss} = 4/12 = 0.33. Dorzucenie I-członu zeruje błąd kosztem oscylacji (faza całki to −90°). D dodaje tłumienie ale sam nie radzi sobie z błędem ustalonym. Pełny PID łączy zalety. Zwiększ KpK_p przy Kd=0K_d = 0 — zobaczysz, że oscylacje rosną. Dorzuć KdK_d i wracają pod kontrolę.

2. Strojenie — Ziegler-Nichols i ręczne

Ziegler i Nichols zaproponowali w 1942 dwie recepty empiryczne — z ich pomocą można dostroić PID bez znajomości modelu. Pierwsza, którą tu prezentujemy, polega na doprowadzeniu zamkniętej pętli do oscylacji na granicy stabilności i odczytaniu dwóch liczb: wzmocnienia krytycznego KuK_u i okresu drgań TuT_u.

Dla naszego prostego mass-spring-damper'a Z-N nie zadziała — układ drugiego rzędu z dodatnim tłumieniem nigdy nie osiąga granicznych oscylacji pod sterowaniem czysto proporcjonalnym (bieguny pozostają w lewej półpłaszczyźnie dla Kp>0K_p > 0). Potrzebujemy plant wyższego rzędu; tutaj używamy kanonicznego G(s)=1/(s+1)3G(s) = 1/(s+1)^3, dla którego Ku=8K_u = 8 i Tu=2π/33.63T_u = 2\pi/\sqrt{3} \approx 3.63 s.

wzmocnienia

K_p4.80
K_i2.65
K_d2.18
presety Z-N
Klasyczna recepta Z-N. ~25% przeregulowania. Standardowy punkt startowy w przemyśle.
dane Z-N dla tego planta
K_u (gain ultim.)8.00T_u (okres)3.628 speak |y|1.530M_p53.0 %t_s (±2%)10.11 s
-0.20.350.91.4520510152025ryt [s]y-21.558.5120510152025u (sterowanie)t [s]u

Recepta Zieglera-Nicholsa (zamknięta pętla, 1942). Procedura w trzech krokach:

  1. Wyłącz I i D (Ki=Kd=0K_i = K_d = 0), zwiększaj KpK_p aż pętla zacznie oscylować ze stałą amplitudą — to jest wzmocnienie krytyczne KuK_u.
  2. Zmierz okres oscylacji TuT_u.
  3. Odczytaj wzmocnienia z tabeli:
Z-N classic:Kp=0.6Ku,Ti=Tu/2,Td=Tu/8    Ki=Kp/Ti,  Kd=KpTd.\text{Z-N classic:}\quad K_p = 0.6\,K_u,\quad T_i = T_u/2,\quad T_d = T_u/8 \;\Rightarrow\; K_i = K_p/T_i,\; K_d = K_p\,T_d.

Recepta jest punktem startowym, nie końcowym — daje typowo ~25% przeregulowania, co dla wielu zastosowań jest za dużo. Standardowo dostraja się dalej ręcznie albo wybiera wariant „no overshoot" / „some overshoot". Dla układów z dużym opóźnieniem transportowym (procesowych) bardziej miarodajna jest druga metoda Z-N — z odpowiedzi skokowej w otwartej pętli (parametry LL, TT). Tutaj pokazujemy wariant z domkniętą pętlą jako pedagogicznie najprostszy.

Spróbuj: wybierz preset „P @ K_u" — zobaczysz oscylacje stałej amplitudy z okresem ≈ 3.63 s. Dla wartości KpK_p nieco większej niż KuK_u układ się rozbiega; mniejszej — oscylacje wygasają. Punkt krytyczny jest „na ostrzu noża".

3. Anti-windup — clamping i back-calculation

Każdy aktuator fizyczny ma graniczne wartości — silnik prądu stałego nie wytwa moment większy niż Ktia,maxK_t \cdot i_{a,max}, zawór nie otworzy się więcej niż na 100%. Z perspektywy regulatora to saturacja: uu przycinane do [umin,umax][u_{min}, u_{max}].

W obecności saturacji zwykłe PID popełnia subtelny błąd: integrator dalej akumuluje, mimo że jego wkład KieK_i \int e nie ma wpływu na faktyczne sterowanie. Po wyjściu z saturacji regulator musi „odkręcić" zgromadzone napięcie — odpowiedź ma długi ogon i często duże przeregulowanie. Anti-windup to dwie standardowe poprawki: clamping (warunkowa integracja) i back-calculation.

wzmocnienia regulatora

K_p6.0
K_i8.0
K_d2.0
scenariusz

MSD (m=1, c=2, k=4), saturacja u ∈ [-1.5, 1.5], skok r=1 w t=0, zaburzenie d=−1.5 w t=5 s. Trzy regulatory na tych samych wzmocnieniach, różniące się tylko strategią obsługi saturacji.

-0.60.050.71.35202.44.87.29.612drbez AWAW: clampingAW: back-calct [s]y-2-101202.44.87.29.612u_max = 1.5u_min = -1.5u — bez AWu — AW: clampingu — AW: back-calct [s]u-3-0.252.55.25802.44.87.29.612K_i·∫e — bez AWK_i·∫e — AW: clampingK_i·∫e — AW: back-calct [s]człon I

Wind-up (rozbieganie integratora) pojawia się, gdy uu wpada w saturację, ale błąd ee nadal jest niezerowy — integrator akumuluje, mimo że dodatkowy wkład KieK_i \int e nie ma wpływu na sterowanie. Kiedy saturacja ustaje, regulator musi „odkręcić" zgromadzony zapas — to długi ogon w odpowiedzi.

Clamping (warunkowa integracja): gdy uu jest na granicy i błąd pcha sterowanie głębiej w saturację, integrator po prostu zatrzymuje się — nie przyrasta i nie maleje. Prosta i niezawodna technika; standard w PLC.

Back-calculation: integrator dostaje aktywną korektę proporcjonalną do różnicy (uuraw)(u - u_{raw}) (nasza „dziura"):

I˙=e+Kbc(usaturaw)\dot I = e + K_{bc}\,(u_{sat} - u_{raw})

Domyślnie Kbc=1/KpK_{bc} = 1/K_p. Daje gładsze przejścia w obie strony saturacji niż clamping, kosztem dodatkowego parametru do dostrojenia. Spójrz na panel członu I — bez AW całka osiąga ekstremalne wartości po impulsie zaburzenia, podczas gdy z AW pozostaje w sensownym przedziale i odbicie y do referencji jest szybsze.

4. Derivative kick i filtr na D

Druga klasyczna pułapka PID: derivative kick. Gdy referencja zmienia się skokowo, klasyczne D=Kde˙D = K_d \cdot \dot e generuje impulsowy strzał w sterowaniu, który może uszkodzić aktuator albo wprowadzić go w głęboką saturację. Dwa rozwiązania: liczyć D od pomiaru zamiast od błędu, lub przepuścić D przez filtr dolnoprzepustowy.

parametry regulatora

K_p8.0
K_i2.00
K_d3.00
pasmo filtra D (N)20 rad/s
peak |u| (mierzone)
D na e (klasyczny)608.00D na −y (PI-D form)8.00D na e + filtr LP62.55

Ostry skok r w t=0.5s wymusza idealnie pochodną delty, której Kd · de/dt aproksymuje skokiem sięgającym aż 1/dt razy większym niż w wariancie z D na −y.

-0.20.250.71.151.601.22.43.64.86skok rr (skok)D na e (klasyczny)D na −y (PI-D form)D na e + filtr LPt [s]y-30-150153001.22.43.64.86D na e (klasyczny)D na −y (PI-D form)D na e + filtr LPt [s]u (uwaga: skala)

Derivative kick. Klasyczne PID liczy D=Kde˙=Kdddt(ry)D = K_d \cdot \dot e = K_d \cdot \tfrac{d}{dt}(r - y). Gdy rr jest sygnałem skokowym, r˙\dot r jest impulsem Diraca, a e˙\dot e w jednej chwili sięga Δr/dt\Delta r / \mathrm{d}t — w cyfrowej implementacji równe Δr/Ts\Delta r / T_s, czyli setki razy większe niż wartości robocze. Aktuator dostaje krótki potężny impuls, co może uszkodzić sprzęt albo wyjść w saturację głęboko.

Rozwiązanie 1: D na pomiarze. Zauważ, że e˙=r˙y˙\dot e = \dot r - \dot y. Dla układu z ciągłą dynamiką y˙\dot y jest gładkie. Możemy więc liczyć D=Kdy˙D = -K_d \cdot \dot y — sterowanie zadziała tak samo dla zaburzeń (gdzie r˙=0\dot r = 0 i tak), ale nie zareaguje impulsowo na skok referencji. Ten wariant nazywa się formalnieI-PD albo typu B (P + I po e, D po −y).

Rozwiązanie 2: filtr dolnoprzepustowy na D. Zostawiamy D=Kde˙D = K_d \cdot \dot e, ale przepuszczamy przez filtr 1. rzędu o paśmie NN:

Df(s)=Kds1+s/Ne(s)D_f(s) = \frac{K_d \cdot s}{1 + s/N} \cdot e(s)

Filtr zamienia idealną pochodną na pochodną „pasmowo-ograniczoną" — dla skoku rr, DfD_f osiąga maksimum KdNK_d \cdot N (nie nieskończoności), a potem opada eksponencjalnie. Im większe NN, tym ostrzejszy filtr; NN \to \infty odzyskuje idealne D.

W praktyce: D-na-y używa się gdy referencja jest „brutalna" (skoki, kwadratowe sygnały), filtra — gdy mamy szum pomiarowy i łagodne referencje. Często łączy się obie techniki naraz.

Co ten moduł świadomie pomija

  • Feed-forward dla śledzenia trajektorii (uff=mr¨+cr˙+kru_{ff} = m\ddot r + c\dot r + k r obok PID na uchybie) — częściowo pokazane w module 0 §2.
  • Druga metoda Z-N z odpowiedzi skokowej w otwartej pętli (parametry L,TL, T) — bardziej użyteczna w przemyśle procesowym.
  • Cohen-Coon, IMC, lambda-tuning — alternatywne recepty empiryczne, każda ze swoimi zaletami w specyficznych klasach planta.
  • PID dla manipulatora odwróconego (cart-pole) — w module 0 §5 pokazaliśmy, że PID stabilizuje, ale jest to regulator wbudowany w schemat full-state. Pełen projekt PID dla cart-pole wymaga zewnętrznej pętli położeniowej i wewnętrznej kątowej (struktura kaskadowa).