Wszędzie, gdzie patrzę, czy to PID, wyprowadzenie, kontrola opóźnienia czy cokolwiek innego, są schematy Simulink z funkcjami transferu. To wszystko jest dobre dla symulacji odpowiedzi systemu, jednak obecnie muszę zaimplementować sterowanie PID z przefiltrowanym terminem pochodnym w ściśle certyfikowanym urządzeniu medycznym, które jest kontrolowane przez mikroprocesor z kontrolującym go kodem C ++.
Teraz, jeśli weźmiemy kontroler PID w jego dziedzinie częstotliwości jako
$$ C (s) = k_ \ mathrm {P} + \ frac {k_ \ mathrm {I}} {s} + k_ \ mathrm {D} s = \ frac {y (s)} {e (s)}, $$
możemy to zaimplementować jako
$$ y (t) = k_ \ mathrm {P} e (t) + k_ \ mathrm {I} \ int_ {0} ^ {t} e (\ tau) d \ tau + k_ \ mathrm {D} \ dot {e} (t), \ quad e (0) = 0, $$
które możemy zapisać w pseudokodzie jako
integra + = error * dtderivative = (error - prevError) / dty = kp * błąd + ki * całka + kd * pochodnaprevError = błąd
Jednak teraz bierzemy filtrowaną kontrolę PID jako
$$ C (s) = k_ \ mathrm {P} + \ frac {k_ \ mathrm {I}} {s} + k_ \ mathrm {D} \ frac {sN} {s + N} $$
Najlepsze, co przychodzi mi do głowy polega na utworzeniu odwrotności Laplace'a jako
$$ y (t) = k_ \ mathrm {P} e (t) + k_ \ mathrm {I} \ int_ {0} ^ {t} e (\ tau ) d \ tau + k_ \ mathrm {D} \ left (N \ delta (t) - N ^ 2e ^ {- Nt} \ right) e (t), \ quad e (0) = 0, $$
ale co to naprawdę oznacza? Całkowanie przez $ dt $ to jedno, ale wszystko, co widzę w $ e ^ {- Nt} $, to fakt, że po kilku sekundach, bez względu na to, co zrobię, będę miał tylko kolejną stałą proporcjonalności. Czy powinienem kiedyś zresetować czas? I jeszcze nie zapisaliśmy tego w C ++.
Jakie jest właściwe podejście?