Fortsetzung:
Heute geht es darum, wie das bisherige Wissen in einen Code umsetzt wird.
Hierzu eine Zusammenstellung der Formeln. Wer eine Herleitung der Formeln will, kann sich im WWW informieren, es gibt darüber genügend Literatur.
Begriffsdefinitionen:
W = Sollwert X = Istwert Xw = Regelabweichung Y = Stellgrösse Yp = P-Anteil von Y Yi = I-Anteil von Y Yd = D-Anteil von Y Kp = Proportionalbeiwert Ki = Integrierbeiwert Kd = Differenzierbeiwert dt = Taktzeit des Reglers
Formeln zur Berechnung:
Xw = W - X
Yp = Kp * Xw
Yi = Ki * (Isum + Xw * dt)
Isum: ist die Summe aller vergangenen (Xw * dt) Berechnungen Yd = Kd * (Xw - Xwalt)/dt
Xwalt: ist der Xw-Wert des letzten Zyklus
Y = Yp + Yi + Yd
Zum besseren Verständnis habe ich in das Blockschaltbild die benützten Kürzel eingetragen (siehe Bild). Der Regler ist jetzt detailierter dargestellt.
Der Sollwert W ist in unserem Fall Null. Der Istwert X ist der ausgelesene Wert des Liniensensors. Die berechnete Stellgrösse Y ist die Korrektur, die auf den PWM-Wert zur Ausregelung gebracht wird. Man hat die Wahl, entweder die Stellgrösse Y je zur Hälfte im entgegengesetzten Sinn auf beide Motore zu geben oder nur einen Motor zu verlangsamen oder zu beschleunigen. Auf das Vorzeichen muss geachtet werden, sonst regelt er nicht aus.
So, jetzt kann mit dem Programmieren losgelegt werden! Wer will es selbst versuchen?
Mit den Parametern aus dem letzten Beitrag hat man alles, was man dazu braucht. Kp = 3; Ki = 10; Kd = 0.225;
dt = 0.0016
Während Ihr inzwischen fleissig programmiert, werde ich mein vorläufiges Programm noch auf Vordermann bringen, um es hier reinstellen zu können.
Tipps:
Mit etwas Geschick kann man auf floating point verzichten und man kommt mit Integer aus.
Sorgfalt ist geboten um Überläufe zu verhindern.
Beim D-Anteil kommt prinzipbedingt ein sehr hoher Wert in der Berechnung vor. Die Weitergabe an den PWM-Wert muss begrenzt werden, aber der Rest darf nicht verworfen werden, sonst stimmt das Verhalten nicht mehr.
Lesezeichen