PID-Regler für Anfänger
-
Ich hoffe jmd kann mir hier weiterhelfen
Mein Problem ist folgendes. Ich soll mittels 2 kleinen Elektromotoren die Gier- und Nickbewegung einer Platte (die ein Flugzeug darstellen soll) ausgleichen. Das habe ich soweit über ein Messgerät, dass mir die sich ändernden Winkel ausgibt bereits realisiert. Ebenfalss kann ich die aktuelle Stellung der Servomotoren auslesen. Nun muss ich diese Information irgendwie in einen Regelkreislauf einbringen aber ich habe keine Ahnung wie kann mir das jmd step by step erklären?
-
Hallo,
im wesentlichen versuchst Du erst mal das System zu verstehen.
Schau dir erst mal nur eine Kippbewegung/Achse an.
Ist die Platte "zu weit nach im Uhrzeigersinn" oder dagegen gedreht? Wie sieht also der Regelfehler e=Phi_soll - Phi_ist aus. Wenn der Regelfehler größer als 0 ist, was bedeutet das? Wenn er kleiner als 0 ist, was bedeutet das? Bei einem musst Du "nach links" drehen, beim anderen nach rechts. Und falls das Flugzeug auf dem Kopf fliegen und drehen kann, musst Du noch irgendwie deinen Winkel normieren, so das er immer zw. -pi und pi liegt oder so.
Gut, jetzt hast Du einen Regelfehler gebildet. Den steckst Du jetzt in deinen PID-Regler, also letztlich in ein Stück Software, und ziehst ein paar Parameter aus dem Hut, je nachdem, welches Verfahren in der Vorlesung dran war oder durch rumprobieren (zum Anfang ist es immer gut, D-Komponenten auf 0 zu setzen, Integrator-Komponenten klein zu wählen und mit dem P-Anteil zu spielen).
-
Vielen Dank erstmal für die Antwort. Also mein Problem liegt eben darin, dass ich nich weiß wie ich den Regler als Code realisieren kann, da ich in einigen Bsp, die ich durch eigene Recherche gefunden habe die Abweichung nach der Zeit differenzieren bzw integrieren muss. Also ich habe das hier gefunden:
esum = esum + e
y = Kp * e + Ki * Ta * esum + Kd * (e – ealt)/Ta
ealt = e
wie kann ich das durch einen Code ausdrücken?
-
double pid_ctrl(double e) { static double esum; static double ealt; double y; esum = esum + e; y = Kp * e + Ki * Ta * esum + Kd * (e – ealt)/Ta; ealt = e; return y; }
?
-
Sieht schonmal gut aus aber was ist mit esum und ealt? wie kann ich beispielsweise in einer schleife alle bisher aufgetretenen Abweichungen e aufsummieren um das esum zu erhalten und wie kann ich das e des zum Beispiel 1. Durchganges zurückgreifen, da es ja im zweiten Durchgang mein ealt ist.
-
Das esum ist static (d.h. der speicherbereich bleibt auch nach verlassen der Funktion reserviert) und daher stellt esum immer die aktuelle summe aller bisher aufgetretenen abweichungen e dar.