PID-Regler Grundlagen & Tutorial: Implementierung von PID in Arduino
Für diejenigen, die in der industriellen Steuerung arbeiten, ist die Theorie der Proportional-Integral-Derivative-Regelung (PID) wahrscheinlich ein bekanntes Konzept. Für die meisten Menschen ist der Begriff völlig fremd, aber Sie könnten damit vertrauter sein, als Sie denken. Wenn Sie das Gaspedal in einem Auto betätigen, berücksichtigen Sie nicht nur, wie weit Sie von Ihrer Idealgeschwindigkeit entfernt sind – der proportionale Teil von PID –, sondern auch, wie Ihr Fahrzeug beschleunigt und Bedingungen wie Hügel.
Für diejenigen, die in der industriellen Steuerung arbeiten, ist die Theorie der Proportional-Integral-Derivative-Regelung (PID) wahrscheinlich ein bekanntes Konzept. Für die meisten Menschen ist der Begriff völlig fremd, aber Sie könnten damit vertrauter sein, als Sie denken. Wenn Sie das Gaspedal in einem Auto betätigen, berücksichtigen Sie nicht nur, wie weit Sie von Ihrer Idealgeschwindigkeit entfernt sind – der proportionale Teil von PID –, sondern auch, wie Ihr Fahrzeug beschleunigt und Bedingungen wie Hügel.
Diese subtileren Effekte werden mathematisch durch die I- und D-Terme berücksichtigt. In diesem Beispiel würden sie verhindern, dass die Geschwindigkeit eines Autos zwischen einem oberen und einem unteren Limit schwankt, und wir können dasselbe Konzept auf eine Vielzahl von Steuerungssituationen anwenden. Während eine auf Begrenzungen basierende Steuerung Ihnen in etwa die richtige Richtung weist, wird Ihr System dazu tendieren, etwas unberechenbar zu agieren.
PID-Gleichung
Wir können die PID-Regelung mathematisch mit der folgenden Gleichung ausdrücken. P, I und D werden durch die drei Terme dargestellt, die hier addiert werden. Kp, Ki und Kd sind Konstanten, die bestimmen, wie das System auf jeden Faktor reagiert:
Wir können auch Ki und Kd mit 1/Ti und Td ersetzen. Diese Änderung verleiht der Gleichung eine bessere Beziehung zu ihrer physikalischen Bedeutung und ermöglicht es, dass die Einheiten sich zu einer dimensionslosen Zahl korrekt ergeben:
Wir können die Gleichung auch umstellen, um den Kp-Wert zu extrahieren und ihn auf die gesamte Gleichung anwenden, in der sogenannten Standardform. Ein Vorteil dieser Form ist, dass wir die gesamte Kp-Konstante für die gesamte Gleichung auf einmal anpassen können:
All dies mag ein wenig einschüchternd wirken, möglicherweise sogar für jemanden, der einen Abschluss im Ingenieurwesen gemacht hat. Die gute Nachricht ist, dass Sie Ihr Modeling and Analysis of Dynamic Systems-Lehrbuch nicht ausgraben müssen, um zu verstehen, was hier vor sich geht. Und auch wenn es nie schadet, müssen Sie nicht in der Lage sein, Differentialrechnung zu machen.
Wenn wir die erste Gleichung aufschlüsseln, erzeugen wir u(t) - die einheitenlose Steuerungsausgabe auf der linken Seite der Gleichung -, indem wir drei mathematische Elemente auf der rechten Seite des Gleichheitszeichens hinzufügen: P, I und D. Jedes Element hat einen konstanten K-Wert davor (Kp, Ki und Kd), der das Gewicht jedes Elements angibt, während sie u(t) bilden, oder die Steuerausgabe zu einem bestimmten Zeitpunkt. Wir können jeden K-Wert individuell abstimmen, um die Systemleistung zu verbessern, und dies werden wir weiter unten genauer erklären:
Proportional (P—Kp)
Der erste und wichtigste Begriff in dieser Gleichung ist das e(t). Daher ist der Kp-Wert, der davor steht, im Allgemeinen größer als die anderen K-Werte in der Gleichung. Hier ist e(t) einfach der momentane Fehler zu einem bestimmten Zeitpunkt - der tatsächliche Wert eines gesteuerten Geräts minus dem gewünschten Wert. Multiplizieren Sie dies mit Kp und Sie haben seinen Beitrag zur Gesamtausgabe des Reglers.
Integral (I—KI)
Der zweite Begriff in dieser Gleichung bezieht sich auf den kombinierten Fehler über die Zeit. Es ist die Summe aller auf dem Gerät erlebten Fehler:
Jedes Mal, wenn ein Regler u(t) berechnet, fügt er den momentanen Fehler einem laufenden Tally hinzu.
Diese Zahl wird dann mit Ki multipliziert und zu u(t) hinzugefügt.
Betrachten Sie eine Situation, in der eine Kraft einen Motor an Ort und Stelle hält und ihn nicht unter normalen Bedingungen zum Sollwert zurückkehren lässt. Da er länger und länger außerhalb der Spezifikation ist, wird der I-Term weiter ansteigen, schließlich diese Kraft überwinden oder die Grenzen der Motorfähigkeit erreichen.
Derivative (D—Kd)
Der dritte Begriff in dieser Gleichung bezieht sich darauf, wie schnell sich der Fehler ändert:
Theoretisch, wenn Sie nur einen D-Term in dieser Gleichung hätten und Ihr Prozess den falschen Wert konstant halten würde, würde dieser Term null bleiben und nicht zur richtigen Ausgabe beitragen. Andererseits, wenn einer der anderen beiden Begriffe versucht, die Ausgabe des Geräts zu schnell zurückzusetzen, kann die Ableitung dazu beitragen, die Wirkung zu dämpfen.
Obwohl der auf Differentialrechnung basierende Ausdruck dieses Konzepts nützlich sein kann, ist die Realität der PID-Regelung viel weniger magisch, als es zunächst erscheint. Praktisch ausgedrückt berechnen wir die Ausgabe nur mit Addition, Subtraktion und Multiplikation, wobei wir den Fehler und die Zeit zwischen den Messungen berücksichtigen. Tatsächlich haben wir pneumatische Systeme verwendet, um frühe Formen der PID-Regelung zu implementieren, indem wir mechanische Mittel zur Eingabe jedes "Terms" verwendet haben.
- Regler nehmen eine momentane Fehlermessung vor.
- Ziehen Sie die vorherige Momentanmessung davon ab.
- Multiplizieren Sie diesen resultierenden Wert mit Kd, um seinen Beitrag zu u(t) zu berechnen.
Arduino PID-Regler-Tutorial
In many situations, it's expedient to plug in a dedicated PID controller to your process, but you can make your own with an Arduino or other similar dev board. You can even write your own PID routine. Express each term in your code in a manner similar to:
- P:instanteneousError = setpoint – input;
- I:cumulativeError = += error * elapsedTime;
- D:rateOfError = (error – errorLastCalculation)/elapsedTime
To get the necessary output, multiply each of these terms by its respective K value and add them together. On the other hand, if you'd like to avoid reinventing the wheel, you can jump in with Brett Beuregard's PID library. This library takes care of the details for you and lets you focus on tuning P, I, and D constant values as needed.
Um die PID-Theorie in der Praxis zu demonstrieren, habe ich einen Arduino Nano Every aus meinem Werkzeugkasten genommen, zusammen mit:
- Motortreiberplatine
- Infrarotsensor
- Motor aus einer Hubsan H107C Drohne
Ich habe eine Steckbretthalterung für den Motor gedruckt sowie einen "Ventilator", der das Licht 50% der Zeit blockiert, um zu vermeiden, dass Impulse beim Drehen verpasst werden. Der Motortreiber ist die Eingabe für den (ansonsten ungesteuerten) Motor, und das Feedback basiert auf der Zeit zwischen den Impulsen.
Als ich schließlich den Code ausgearbeitet und die 3D-gedruckten Teile erhalten hatte, war ich in der Lage, den Motor auf eine raffiniertere Weise zu steuern, als den Netzschalter mit konstantem PWM (Pulsweitenmodulation) Ausgang zu bedienen.
Bemerkenswerte Codeabschnitte umfassen die Verwendung einer Interrupt-Routine, um jeden Impuls zu registrieren, während sich das blockierende Gerät dreht, und die Berechnung der Zeit zwischen den Impulsen mit millis(). Ich habe den PID im ersten Teil des Codes außerhalb der Funktionen eingerichtet mit:
PID myPID(&difference, &driverOut, &setPoint,Kp,Ki,Kd, DIRECT)
Kp, Ki und Kd sind vor dieser Zeile im Code definiert, und &difference steuert &driverOut, wobei &setPoint durch den seriellen Monitor modifiziert wird. Wir können diese Mathematik manipulieren, um diesen Zeitunterschied in Umdrehungen pro Minute (RPM) umzuwandeln, aber die PID-Einstellungen funktionieren als DIRECT Ausgaben, da dieser spezielle Treiber einschaltet, wenn der Eingang auf niedrig gezogen wird. Wenn der analoge Ausgang steigt (Motoren aus), erhöht sich auch die Verzögerung zwischen den Impulsen.
Eine frühere Version der PID-Routine. Beachten Sie, dass CH1 Eingangsimpulse liest, während CH2 als Ausgabe unter Verwendung der PID-Routine berechnet wird – niedrige Impulse sind Eingaben für den Motor.
Dieses einfache Beispiel eines PID-Reglers wurde mit verfügbaren Teilen betrieben (einschließlich des neuen Arduino Nano Every) und einem Motor, mit dem ich lose vertraut war. Aber ich konnte demonstrieren, wie man PID-Steuerung in einer Vielzahl von Situationen anwendet, selbst ohne alle Fakten. Sei es Motorsteuerung, Temperaturregelung eines Ofens oder das Balancieren eines Roboters, eine kleine PID-Einrichtung und -Abstimmung gibt Ihnen endlose Experimentiermöglichkeiten.
Artikel tags