Soll der Fehlerterm von PID normalisiert werden?

Mit "normalisiert" meine ich +/-1 ~= der maximale Fehler, den das System vernünftigerweise erwarten kann, oder geteilt durch den Sollwert.

Hintergrund: Ich arbeite an einem PID-Regler für eine SSR-Heizung, der sehr reaktionsschnell ist (5 ° C / s aufwärts, 0,5-1 ° C / s Abkühlung). Der Sollwert liegt im Bereich von 100-400°C. Im Code wird dies wie folgt implementiert:

u ( T ) = K P e ( T ) + K ich T e ( T ) D T + K D [ e ( T ) e ( T 1 ) ] D T 1 + K k

(Die Summierung ist nur ein Akkumulator und Kk ist eine kleine stationäre Korrektur)

Diese Form ist in vielen Open-Source-PID-Codes weit verbreitet. Mir ist jedoch aufgefallen, dass meine K-Terme plötzlich um 1,8 abweichen würden, wenn ich auf °F umstellen würde. Das fühlt sich für mich mathematisch nicht sehr "rein" an. Außerdem stellte ich fest, als ich versuchte, es nach Ziegler-Nichols zu stimmen, dass meine kritische Oszillation ~ 24 s beträgt, aber wenn ich dies als Ki ausdrücke, bekam ich wilde Schwankungen. Nach einigem Graben fand ich die Gleichung aufgeführt als

u ( T ) = K C ( e ( T ) + 1 T ich T e ( T ) D T + T D Δ e ( T ) D T 1 + K k )

Und ich hatte einen Aha-Moment. Ist dies die "reine" Form zu verwenden? Dies ist sinnvoller, wenn es um Transferfunktionsanalysen und dergleichen geht.

Ich habe die Frage genossen und Sie haben bereits einige nachdenkliche Antworten bekommen. Ich wollte nur eine Anmerkung hinzufügen, die Sie ebenfalls berücksichtigen sollten, wenn Sie damit fortfahren. Die Verzögerungszeit vom Sensor bis zur Steuerung sollte so kurz wie möglich gehalten werden. Kürzer ist nicht nur linear besser, es ist exponentiell besser. Halten Sie auch die Variabilität als Prozentsatz der Verzögerung auf dem kleinstmöglichen Wert. Es ist sehr schwierig, ein schnelles PID-System zu „tunen“, wenn es Schwankungen in der Verzögerung gibt. Es ist eigentlich nie richtig. (Ich habe an RTP-Systemen mit gearbeitet > 300 C S Rampenraten.)
@jonk Danke! Ja, ich habe den Prozess zum Testen mit 4 Hz gefahren, aber der TC-Chip kann ein absolutes Maximum von 10 Hz bewältigen. Ich habe es gerade auf 10 Hz hochgedreht, und der Fehler liegt jetzt innerhalb des Grundrauschens: D. Die tatsächliche Schleifenzeit variiert zwischen 102 und 104 ms.
Ich erhielt einen Anruf von jemandem in Vancouver, BC, der am Ziehen von GaAs-Kugeln unter Verwendung von PID zur Steuerung des Prozesses arbeitete. Er benutzte mein Messgerät für die Temperatur, aber einen PID-Regler von Omega Engineering (großes Unternehmen). Wir hatten damals kein PID auf unserem Gerät. Also nahm ich mir ein paar Tage Zeit und schrieb einen für ihn. Unser Gerät hatte bereits 0-10 V und 4-20 mA Ausgänge. Also gut dort. Sagte ihm, er solle einfach das Omega ablegen und unsere Software benutzen. Bekam eine Woche später einen Rückruf – total geschockter und aufgeregter Typ am anderen Ende. Keine Wellen. Perfekte Kugeln kommen heraus!
Der EINZIGE Unterschied besteht wirklich darin, dass ich große Verzögerungen und große Schwankungen in diesen Verzögerungen entfernt habe. Anstatt die Temperatur auf meinem Gerät über 0-10 V/4-20 mA auszugeben, von Omega zu lesen und dann in einer sehr schlampigen Zyklusperiode eine eigene Ausgabe zu erzeugen, hatten wir einfach durch das Chaos gekürzt und den Temperatursensor gelassen selbst den Prozess direkt antreiben. Ich habe keine Ahnung, wie viel Slop tatsächlich eingespart wurde, oder seine Variabilität, aber es hat ihre Probleme auf einen Schlag vollständig gelöst.
Wenn Sie können, versuchen Sie eines Tages, Ihren PID-Regler auf eine "Anlage" anzuwenden, deren EINZIGE Funktion darin besteht, den Eingang zu VERZÖGERN. Eingang lesen, X-Zeit verzögern, Eingang als Ausgang schreiben. Dann verbinden Sie Ihre PID damit. Sehen Sie, was mit großen X-Werten passiert. Es ist hässlich. Dann setz dich hin und rechne. Es sieht genauso schlecht aus, wie es in der Praxis funktioniert. Selbst ein schlechter PID-Algorithmus funktioniert bei sehr kurzen Verzögerungen überraschend gut. Das erste, was ich tue, wenn es Probleme mit der Regelung im geschlossenen Regelkreis zu lösen gilt, ist, zuerst die Verzögerungen zu beheben . Ich schneide alles aus, was ich kürzen kann, und verkürze die Zeit. Erst dann kümmere ich mich um den Rest.
@jonk Irgendwelche Vorschläge zum Umgang mit Lärm? Im Moment verwende ich eine Einzelterm-Differenzgleichung IIR (grundsätzlich exponentieller gleitender Durchschnitt), um die Messwerte zu glätten, die auf 1/4 °C quantisiert sind und ungefähr so ​​viel Jitter aufweisen.
Ist dies eine bestimmte Anwendung, die Sie lösen? Ich war mir nicht sicher, ob Sie ein Allzweck-PID-Modul erstellen, wie es Omega tut, oder ob dies eine bestimmte Situation war. Klingt jetzt konkret. Meine erste Richtung ist also, nach dem Temperatursensor zu fragen. Was ist das und warum verwendest du genau dieses? Was schaust du dir das an? 100 400 C ? Manchmal ist das Wechseln des Sensors die richtige Richtung. Wenn nicht, müsste ich wissen, wie dein Geräusch aussieht. Rohdaten sind hier von entscheidender Bedeutung.
Außerdem ist IIR so ziemlich die falsche Richtung für alles PID. Denken Sie daran: "DELAY ÜBER ALLES." Ihr IIR kann die Daten hübsch aussehen lassen. Aber es fügt meistens "Verzögerung hinzu". Und das ist im PID-Land nie gut. Wenn Sie es könnten, würden Sie fast immer den anderen Weg gehen und herausfinden wollen, wie Sie schnellere und lautere Messwerte erhalten.
Die Anwendung ist ziemlich spezifisch, mehr kann ich nicht verraten. Schauen Sie sich meine andere Frage "Thermoelementrauschen" an. Ich verwende den MAX31855, weil er in Bezug auf Kosten, Leistung, Verfügbarkeit und Modularität optimal ist. Es ist lustig, dass Sie Lärm erwähnen; Sobald ich die Parameter auf ZN eingewählt habe, scheint das Leitungsrauschen die Stabilität tatsächlich zu verbessern . Stochastische Resonanz bei der Arbeit? Ich werde versuchen, mit weniger Filterung herumzuspielen, aber wird das den D-Beitrag nicht lauter machen? Oder ist es im positiven Sinne lauter?
Sie wollen kurze Verzögerungen. Ich denke, das erinnert mich an den geschrienen Satz: "Verdammt die Torpedos, volle Kraft voraus!" Um dies zu paraphrasieren: "Verdammt den Lärm und gib mir einfach volle Geschwindigkeit auf diesem ADC!" Soweit der abgeleitete Begriff geht, ist es, was es ist. Setzen Sie sich irgendwann mit Ihrem IIR (oder einem anderen gewünschten "Rauschfilter") zusammen und führen Sie eine Ableitungsfunktion darauf aus, gefolgt von der Anwendung der Ideen einer Erzeugungsfunktion, um dies zu lösen. Könnte pädagogisch sein. Wenn Sie das Allerbeste wollen, dann schauen Sie nach Kalman-Filtern, Weiner-Filtern und Kalman-Bucy-Filtern. Aber ich würde mich nicht darum kümmern.

Antworten (2)

Wenn e(t) und u(t) dimensionslos sind, dann ist Kp einheitslos, Ki hat Zeiteinheiten^-1 und Kd hat Zeiteinheiten. Ansonsten haben sie Einheiten aus dem Prozess.

Bei der zweiten Formulierung haben Sie sich vertan. Dies ist die zu verwendende.

u ( T ) = K C ( e ( T ) + 1 T ich T e ( T ) D T + T D Δ e ( T ) D T 1 ) + K k

Dann hat Kc Einheiten aus dem Prozess und Ti und Td haben Zeiteinheiten. Das ist gut, weil Ti und Td auf der gleichen Skala liegen und nur Kc Prozesseinheiten hat. e(t) und u(t) müssen nicht normalisiert werden, da nur Kc ihre Einheiten in Beziehung setzt.

Hoppla! Sie haben Recht, Td sollte im Zähler stehen. Danke!
Würde es in irgendeiner Weise schaden , den Fehler (T_set - T_read) durch T_set zu teilen? Temp ist garantiert positiv. Ich könnte sogar Kelvin gebrauchen :grin:
@DeusXMachina Ja. Wenn Sie beispielsweise T_set auf einen sehr niedrigen Wert ändern, haben Sie Kc effektiv erhöht, was das System instabil machen könnte.
@DeusXMachina man sollte Kk wohl auch nicht mit Kc multiplizieren. Wenn es etwas über die Ausgabe u (t) korrigiert, sollte es Einheiten der Ausgabe haben. Wenn es etwas über die Eingabe korrigiert, sollte e(t) es wahrscheinlich enthalten.

Für Simulations- und Vergleichszwecke kann die Normalisierung nützlich sein. Das Umschalten von °C auf °F innerhalb des Regelkreises macht für mich keinen Sinn. Versuchen Sie, wann immer möglich, SI-Einheiten zu verwenden. Wenn Sie einen merkwürdigen Sensor haben, der °F liefert, wandeln Sie die Messung einfach in °C um, bevor Sie sie in den Regelkreis einspeisen.

Bei der Implementierung kommt es auf die Zielarchitektur an. Wenn Sie einen Gleitkomma-DSP haben, können Sie die Normalisierung beibehalten. Wenn Sie einen kleineren Mikrocontroller verwenden, sollten Sie ganzzahlige Berechnungen (z. B. als Festkomma) verwenden, um die Leistung zu verbessern und die Speicherkosten zu senken.

Die Temperaturregelung – wie in dieser Anwendung – ist normalerweise langsam. Geschwindigkeit ist kein großes Problem, daher werden Sie wahrscheinlich keinen DSP verwenden, aber Sie möchten auch nicht andere Programmteile mit allzu komplizierten Berechnungen blockieren.

Tipp für kleineren und schnelleren Code: Du kannst bereits eine Skalierung in deinen einbauen K C der zu Ihrer Ausgangssteuerung passenden Regelgleichung (zB das Vergleichsregister eines PWM-Moduls). Dies kostet Sie jedoch Portabilität, also tun Sie es nur, wenn Sie sehr begrenzte Hardware-Ressourcen haben.

Vermeiden Sie auch die Verwendung der Form mit der Division durch T ich . Die Division kostet viel mehr Zyklen als die Multiplikation, da sie selten in Hardware implementiert wird.

Ich sage nicht, dass ich es ändern würde , ich bevorzuge auch SI, und der Sensor ist °C. Ich sage, dass sich der Algorithmus mathematisch gesehen nicht um eine Änderung der Basis kümmern muss. Ich bin auf einem Cortex M4, also ist FP nicht zu teuer. Mein begrenzender Faktor in dieser Anwendung ist eigentlich I/O.
@DeusXMachina: Sie könnten die Temperatur zuerst basierend auf der maximalen und minimalen Temperatur des Systems normalisieren. Auf diese Weise kann Ihr Algorithmus auch unabhängig sein. Aber das würde ich nur in der Simulation machen. Bei der Umsetzung sehe ich lieber den Bezug zu den physikalischen Werten. Überprüfen Sie auch, ob Sie eine integrierte Gleitkommaeinheit haben (M4F, wenn ich mich richtig erinnere), da nicht alle M4s dies haben. Software-Gleitkomma fügt eine Menge Code hinzu, der gespeichert und ausgeführt werden muss. Je nach Anwendung spielt das natürlich keine Rolle.
Ja, es hat eine Float-FPU mit einfacher Genauigkeit. Danke für den Tipp!
Wenn T ich ist eine Konstante 1 T ich ist auch eine Konstante, multipliziere einfach damit.
°C ist nicht SI, das wäre K, aber wenn Sie nur den Fehler betrachten, haben beide die gleiche Skala.
@Jasen: °C ist eine abgeleitete SI-Einheit. Siehe: en.wikipedia.org/wiki/SI_derived_unit . Die Multiplikation mit dem Kehrwert ist natürlich ein möglicher Ansatz für Ti.