Wie funktioniert ein PID-Regler? Eine nicht-wissenschaftliche Erklärung

Da in letzter Zeit im Forum immer wieder die Diskussion um den PID-Regler auftaucht, hier mal ein Versuch meinerseits den Regler ohne grosses wissenschaftliches Brimborium zu erklären. Dadurch entstehenden Unschärfen bitte ich zu entschuldigen. Wers genauer wissen will, finden im Netz mannigfache Erklärungen.

Wie funktioniert ein PID-Regler?

Eine Erklärung (fast) ohne Formeln.

Dem PID-Regler wird nachgesagt, dass er das “Universalgenie” unter den Reglern sei. Zum Teil stimmt das. Mit einem gut abgestimmten PID-Regler kriegt man fast jedes System in den Griff. Trotzdem sollte man sich fragen, obs ein einfacher Zweipunktregler nicht auch in vielen Fällen tut.

Aber was macht den PID so universell?

Der PID ist ein 3-in-1 Regler. Es sind eigentlich 3 Regler, die zusammenwirken: ein Proportionalregler, ein Integralregeler und ein Differenzialregler. Wie “stark” jeder Regler agiert wird über die drei zugehörigen Parameter Kp, Ki und Kd bestimmt.
Um zu verstehen, wie ein PID funktioniert, muss man sich erst mal die drei einzelnen Regler ansehen.

Da ist zunächst der P-Regler- P wie Proportional.
Der einfachste aber auch der Hauptregler des PID.
Der misst die Abweichung Soll-Ist, also des gewünschten Wertes minus des aktuellen, tatsächlichen Wertes. Der Reglerausgang ist die Abweichung (=error) multipliziert mit Kp.
Er reagiert sofort und unvermittelt auf Änderungen.
Als Formel:
OutP = (Soll - Ist ) * Kp

Beispiel:
Ein Temperaturregler soll auf 25°C regeln. Ausgang ist die Arduino PWM, die eine Heizung steuert.
Kp wählen wir zu Kp = 50; Die aktuelle Temperatur beträgt 23°C

OutP = (25 - 23 ) * 50 = 100;
Wenn nach einiger Zeit die Temperatur gestiegen ist:
OutP = (25 - 24 ) * 50 = 50;

PID_wie funktioniert er Bild1.jpg

Man sieht schön, wir er zunächst die Abweichung ausregelt, aber diese nicht völlig ausgleichen kann.
Logisch: Wenn die Abweichung Soll-Ist gleich Null wird, ist Out auch null, und es wird nicht mehr geheizt.

Das könnte man doch verbessern, in dem man den Kp erhöht?

Probieren wir doch ein Kp von 100:
PID_wie funktioniert er Bild2.jpg
die Differenz wird kleiner, aber wir sehen auch schon einen schönen Überschwinger. Je nach System kann man das so abstimmen, vor allem wenn man schnelle Ausregelzeiten haben möchte. Hier wollen wird das nicht, also zurück zu Kp=50.

Aber wie geht die Regelabweichung weg, wie bekommt man das System dazu genau auf 25°C zu regeln?

Hier kommt nun der I-Regler ins Spiel:
Der I-Regler (I wie integrierend) soll so eingestellt werden, dass er eher langfristig wirkt.
Er schaut sich das Ergebnis des P-Reglers an, und wenn er merkt, das der das nicht hinkriegt, dann greift er ein und erhöht Stücken für Stückchen den Ausgang.
Im Gegensatz zum P-Regler, der immer nur von einem Moment zum anderen agiert, hat der I-Regler die Vergangenheit im Blick.
Er addiert jede noch so kleine Abweichung auf und vergisst nie.
in C sieht das dann so aus:
OutI += (Soll - Ist) * Ki; // Ki = 0,2
OUT = OutP + OutI;

PID_wie funktioniert er Bild3.jpg
Man kann schön sehen, wie, während OutP abfällt, OutI langsam anwächst um schliesslich die Lücke zwischen Soll und Ist zu schliessen.

Nun ist es eigentlich perfekt?!
Aber da ist doch noch das “D” im Regler.
Für den D-Regler ist das Beispiel zugegebenermaßen schlecht gewählt.
Der D-Regler (D wie Differenziell) ist der Regleranteil, der versucht in die Zukunft zu sehen.
Er beobachtet die Veränderung des Eingangssignal, des Istwertes. Wenn der Istwert plötzlich wegdriftet, dann versucht der D-Regler sofort Gegenmaßnahmen zu ergreifen.
Er reagiert sofort auf Störungen.

Das kann man z.B. bei Lagereglern gut nutzen. Eine Windbö, die einen Quadrokopter kippt.
Bevor der P-Regler merkt, was los ist, haut der D-Regler sofort dagegen um die ungewünschte Bewegung aufzufangen.
Bei trägen Systemen eher kontraproduktiv: Macht man die Tür des Ofen auf, sackt die Lufttemperatur ab, der D-Regler powert Leistung rein.
Ist die Tür wieder zu, ist die Luft schnell wieder heiß, aber die zusätzliche Leistung, die schon in der Heizspirale steckt, führt zur Temperaturüberhöhung.
Ich habe im Gegenteil bei meinem Ofen eine “Door open” Erkennung eingebaut, die auf schnellen Temperaturabfall reagiert, und den PID-Regler stoppt, damit mir mein I-Anteil nicht zu sehr ansteigt.

Sehr schön.
P berücksichtigt die Abweichung
I summiert die Abweichung auf
D reagiert auf Änderungen der Abweichung

I und D sind übrigens zeitabhängige Größen: man braucht eine feste Abtastrate und man muss wissen, ob eine Änderung der Abtastrate schon im Regler berücksichtigt wird oder andere Parameter erfordert.

Den D Anteil kann man anschaulich auch so erklären:

Wenn die Abweichung zunimmt, reagiert der Regler stärker.
Wenn die Abweichung abnimmt, geht der Reglerausgang stärker zurück, als durch P und I Anteil allein vorgegeben, weil der OUTD-Anteil schon negativ wird, bevor der Sollwert erreicht ist. Es wird also schon früher und mehr gegengesteuert als ohne D Anteil.
Das kann Überschwingen vermindern, erlaubt schnelle Reaktionen auf Störungen, ist aber auch empfindlich bei verrauschten, zappelnden Messwerten.

Hallo Gunther, großes Lob!

Hast Du die Kurven mit einem Arduino berechnet? Könnte man den D-Anteil durch einen Sollwertsprung verdeutlichen?

hi,

schöne erklärung, ich war bisher zu faul, mir das anzusehen (hab's ja nicht wirklich gebraucht, nur aus neugier). wikipedia ist ja sehr ausführlich. ZU AUSFÜHRLICH, eine einfache erklärung wie Deine finde ich klasse.

aber, plötzlich:

multipliziert mit Kp. ........ Kp wählen wir zu Kp = 50;

Kp taucht unvermittelt auf. wer ist das? ich könnte jetzt bei wikipedia nachsehen :) :) :)

ansonsten vielen dank für die erleuchtung, spitzen idee...

gruß stefan

@agmue: Ist korrigiert, danke.

Die Kurven sind in Excel entstanden. Und da ich im Excel keine vernünftige Strecke abgebildet habe, wirkt sich der Sollwertsprung nicht aus. Wenn ich mal wieder Zeit habe und mich die Finger jucken... :)

@ Eisbaer: Danke, ich nehm's mit auf

Sehr anschaulich - danke!

Danke @Gunther für die schöne Erklärung!

Der PID-Regler gehört zu den eher geheimnisvollen "Softwaregeräten" für den Arduino. Ich muss gestehen dass ich den auch noch nicht so ganz im Griff habe. Ich hatte viel mit Reglern zu tun die ein Ki nicht kannten. Dort wurde der I-Anteil über Tn eingestellt Tn war dort die "Nachstellzeit". Ki ist 1/Tn. Wobei mir dann aber der Bezug für die Zeiteinheit fehlt und ich deshalb bei der Umrechnung öfter mal daneben liege.

Gruß Peter

Hallo Gunther,
käme sowas als Sprungantwort PT1+PT2 in Betracht?

Sprungantwort.png

// Quelle: http://webber.physik.uni-freiburg.de/~hon/vorlss02/Literatur/Ingenieurswiss/Regelungstechnik/ProgrammiereRegelung.pdf Seite 9

// PT1-Glied
double pt1(double e) {
  const double V1 = 1.0;    // Verstärkung
  const double T_T1 = 0.4;  // relative Zeitkonstante T/T1
  static double a = 0;         // Ausgang
  double da = T_T1 * (V1 * e - a);
  a = a + da;
  return a;
}

double pt2(double e) {
  const double V = 1.0;     // Verstärkung
  const double T_T0 = 0.1;  // relative Zeitkonstante T/T0
  const double D = 2 * 0.7; // Dämpfung
  static double a = 0;         // Ausgang y
  static double b = 0;         // internes Signal x
  double da = T_T0 * b;
  double db = T_T0 * (V * e - a - D * b);
  a = a + da;
  b = b + db;
  return a;
}

void setup() {
  Serial.begin(9600);
  for (byte j = 0; j < 100; j++) {
    int w = pt2(pt1(100));
    Serial.println(w);
  }
}
void loop() {}

agmue: Hallo Gunther, käme sowas als Sprungantwort PT1+PT2 in Betracht?

Bitte verzeih mir, aber ich verstehe die Frage nicht. in Betracht wofür?

agmue: Hast Du die Kurven mit einem Arduino berechnet? Könnte man den D-Anteil durch einen Sollwertsprung verdeutlichen?

guntherb: Die Kurven sind in Excel entstanden. Und da ich im Excel keine vernünftige Strecke abgebildet habe, wirkt sich der Sollwertsprung nicht aus. Wenn ich mal wieder Zeit habe und mich die Finger jucken... :)

Um Dich zu unterstützen, habe ich versucht, mittels Arduino eine Strecke zu programmieren, auf die Du Deine Kurven loslassen könntest, um einen Sollwertsprung oder eine Störgröße (Windbö) zu veranschaulichen. Und damit dann den D-Anteil genauer zu beschreiben. Oder bin ich da auf dem Holzweg?

Ah, jetzt habe ich es verstanden!

Dass ich Excel verwende hat 2 Gründe: zum einen kann ich in Excel die Ergebnisse immer gleich grafisch darstellen, zum anderen habe ich hier in der Arbeit keinen Arduino. :-[

zum anderen habe ich hier in der Arbeit keinen Arduino

das sollte eigentlich den sofortausschluß aus dem forum nach sich ziehen :)

gruß stefan