So implementieren Sie einen selbstoptimierenden PID-ähnlichen Controller

Ich versuche, ein Mikrocontroller-Programm zur Temperaturregelung in einem System mit den folgenden Eigenschaften zu schreiben:

  • Ausgang kann nur Ein oder Aus sein, mit festen Zyklusfrequenzen (~2-10 pro Stunde)
  • Die Anlage reagiert träge (messbare Temperaturänderungen dauern lange > 10 Minuten).
  • Die Pflanze verliert je nach Umgebungsbedingungen an Temperatur.
  • Der Sollwert kann je nach Benutzeranforderung in großen Schritten variieren.

Ich schreibe einen Controller, der darauf abzielt, Fehler zu minimieren und die als Eingabe bereitgestellte Zyklusrate einzuhalten.

Dies könnte leicht mit einem PI-Regler erfolgen und dessen Ausgang in das Tastverhältnis umgewandelt werden. Das Problem besteht darin, dass sich das Programm automatisch einstellen und die richtigen Kp- und Ki-Konstanten auswählen und sich an unterschiedliche Umgebungsbedingungen und Änderungen der Heizleistung anpassen muss. Daher ist es nicht sehr sinnvoll, den PI-Regler im Voraus abzustimmen.

Die Verwendung eines tatsächlichen PI oder PID ist nicht erforderlich. Ich bin offen für die Verwendung von Fuzzy-Logic, wenn es hilft, habe auch einen maschinellen Lernalgorithmus auf dem Chip, der die Systemreaktion und den Wärmeverlust (ungefähr linear) modelliert, was Informationen über die gemessene Sprungantwort vorschlägt . Weiß nur nicht, was ich mit diesen Informationen anfangen soll.

Ein paar Beiträge schlagen vor, dass ich die Modellierungsdaten verwenden könnte, um den PI online abzustimmen, sowie das Lab-View- Handbuch, das vorschlägt, dass ich Fuzzy-Logic verwenden könnte, um den PI abzustimmen.

Meine Frage ist, was der beste Ansatz für diese Art von Szenario ist (z. B. PID, Fuzzy-PID, Faltung usw.) und wie ich es tatsächlich in Software/Praxis implementieren würde.

Ich bin kein EE, daher wäre jede Eingabe sehr willkommen.

Ich habe eine Antwort über die Verwendung eines Simplex-Algorithmus zur automatischen Abstimmung von PID-Reglern auf der Robotics SE geschrieben , die von Interesse sein könnte.
@embedded.kyle großartig, ich verstehe simplex/greatest-acent. Kannst du sagen, was er früher für x1,x2 gemacht hat? Ich habe Probleme, sie mit PID-Konstanten in Beziehung zu setzen.
Es ist schon eine Weile her, aber ich glaube, wir haben so etwas wie x1 = P, x2 = I, x3 = D verwendet. x0, der Schwerpunkt, ist das Maß für die Stabilität, das für Sie am wichtigsten ist. In meiner Anwendung, der Motorsteuerung, hatten wir zwei Schleifen. Das x0 des einen war die Geschwindigkeit und das x0 des anderen war der Strom. Siehe hier für mehr.
@embedded.kyle macht es Ihnen etwas aus, Ihren Kommentar in eine Antwort umzuwandeln? fügen Sie zusätzliche Informationen hinzu, wenn Sie möchten. -Vielen Dank
Ein Kopfgeld? Oh Junge! Gemacht und gemacht.

Antworten (5)

Ich würde nicht so weit gehen, PID als veraltet zu bezeichnen. Aber es gibt sicherlich Raum für Verbesserungen. Eine Möglichkeit, PID-Regelkreise automatisch abzustimmen, besteht darin, die Nelder-Mead-Methode zu verwenden, die eine Form des Hill-Climbing - Simplex-Algorithmus ist . Es hat den Vorteil, dass es auf einen Zielparameter konvergieren und rekonvergieren kann, der sich im Laufe der Zeit bewegt.

Bergsteigen nach der Nelder-Mead-Methode

Aus diesem Papier :

Zum Beispiel ist in unserem Fall der PID-Parametereinstellung {K P , K I , K D } ein Simplex ein Tetraeder. Nelder-Mead erzeugt eine neue Testposition von Simplex durch Extrapolation des Verhaltens der Zielfunktion, die an jedem als Simplex angeordneten Testpunkt gemessen wird. Der Algorithmus entscheidet sich dann dafür, einen dieser Testpunkte durch den neuen Testpunkt zu ersetzen, und so schreitet die Technik fort.

Meine spezielle Anwendung war die Motorsteuerung. Wir hatten zwei Schleifen, eine PID-Stromregelschleife und eine PI-Geschwindigkeitsregelschleife. Wir setzen unsere Scheitelpunkte auf P, I bzw. D und führen Statistiken über die Ausgabe der Schleife aus. Dann ließen wir die Reflexion, Expansion, Kontraktion und Reduzierung immer wieder laufen, bis die erzeugten Strom- oder Geschwindigkeitssteuerungsziele innerhalb weniger Standardabweichungen lagen.

Bei unserem Produkt war der VP sehr darauf bedacht, wie der Motor "klang". Und wie sich herausstellte, "klang" es besser, wenn das aktuelle Ziel etwas mehr abprallte, als es mathematisch optimal war. Unser Tuning wurde also "live" durchgeführt, indem wir den Algorithmus suchen ließen, während der Motor lief, damit auch die Wahrnehmung des Benutzers des Motorgeräuschs berücksichtigt wurde. Nachdem wir Parameter gefunden hatten, die uns gefielen, wurden sie fest codiert und nicht geändert.

Dies wäre wahrscheinlich nicht ideal für Sie, da Sie sagen: "Das System in Schwingung zu versetzen, selbst als Teil des Autotunings, ist für die Benutzer nicht akzeptabel". Unser System würde mit Sicherheit oszillieren und andere schreckliche Dinge tun, während es sich automatisch einstellt.

Sie könnten jedoch zwei Kopien des PID-Controllers ausführen. Eine, die „live“ war und den Prozess tatsächlich steuerte. Und eine zweite, die ständig automatisch abgestimmt wurde, während sie mit den gleichen Eingängen wie der "Live" -Controller gespeist wurde. Wenn die Ausgabe des automatisch abgestimmten Controllers „besser“ oder stabiler wurde, konnten Sie die Koeffizienten in den „Live“-Controller tauschen. Der Controller würde dann Korrekturen am Prozess vornehmen, bis die gewünschte Leistung erreicht ist. Dies würde Schwingungen verhindern, die vom Benutzer während des Autotunings wahrgenommen werden können. Wenn sich die Eingänge jedoch drastisch ändern und der PID-Regler nicht mehr optimal ist, kann die automatische Abstimmung neue Koeffizienten austauschen, sobald sie verfügbar sind.

Das NM-Verfahren erfordert es, seine wilden Punkte auf der Zielfunktion (dh der realen Welt des Benutzers) laufen zu lassen. Ich glaube jedoch, dass ein grobes Modell (Raumzustand?) Auf der Grundlage von Sensormessungen auf dem Mikrocontroller selbst aufgebaut werden kann. Es würde dann Ihren vorgeschlagenen „Schatten“-PI-Controller während der Optimierung ausführen. Ich bin mir nicht sicher, ob dies ein Overkill ist, da es möglich sein kann, einen PI auf eine bekannte Einstellung einzustellen und dann Kp und Ki basierend auf den Sensorwerten und der Systemreaktion zu skalieren . Wie auch immer, gut gemacht, Sir.
@MandoMando Vielen Dank! Und ich mag den Begriff „Schatten“-PI-Controller sehr.

Ein PID-Regler ist in Situationen nützlich, in denen das Verhalten des zu regelnden Systems angemessen angenähert werden kann als eine Summe des Regelstimulus, des Integrals des Regelstimulus und des Integrals dieses ersten Integrals. Einige Temperaturregelsysteme können ein solches Kriterium erfüllen, wenn es ein Objekt gibt, das durch den Stimulus gleichmäßig erwärmt wird, und wenn dieses Objekt Wärme gleichmäßig auf ein anderes Objekt mit einer Rate überträgt, die proportional zu der Temperaturdifferenz zwischen ihnen ist. Beispielsweise könnte das erste Objekt ein Heizelement sein und das zweite Objekt könnte die Luft sein, die in einem Raum zirkuliert, wenn es genügend Luftzirkulation gibt, damit die Luft so angesehen werden kann, als hätte sie eine einzige einheitliche Temperatur. Für kompliziertere thermische Modelle (z. B. solche, die thermische Gradienten innerhalb eines festen Mediums beinhalten können),

Ich würde vorschlagen, dass ein guter Ansatz darin bestehen könnte, den Regler bei eingeschalteter Heizung kontinuierlich zu schätzen, wie heiß das zu regelnde Gerät werden würde, wenn der Ausgang sofort abgeschaltet würde, und auf welche Temperatur es schließlich abkühlen würde, wenn danach wurde die Heizung schnellstmöglich eingeschaltet. Schätzen Sie auch, wie hoch diese Werte wären, wenn die Heizung noch eine Sekunde, zwei Sekunden, drei Sekunden usw. eingeschaltet bleiben würde. Schalten Sie die Heizung aus, wenn diese Werte so gut wie möglich sind. Sobald die Heizung ausgeschaltet ist, führen Sie ähnliche Berechnungen durch, tauschen Sie jedoch die Rollen Ein/Aus, Heiß/Kalt usw., um zu entscheiden, wann sie wieder eingeschaltet werden soll. Abhängig vom thermischen Verhalten des Systems kann es notwendig sein, eine „Min/Max“-Vorausschaustrategie zu verwenden, um ein oder zwei Schritte vorauszuschauen.

In der Lage zu sein, den Zustand der Steuerung (ein oder aus) 2-10 Mal pro Stunde zu ändern, eignet sich nicht für die Steuerung des Tastverhältnisses. Der Ausgang einer PI-Schleife wird ein Steuersignal sein, dessen Größe als Funktion des Fehlers variiert, und Ihre Anlage kann (realistisch) nur eine binäre Eingabe (aus oder ein) akzeptieren, da die „Frequenz“ der Steuerung Ein akzeptables Tastverhältnis liegt bei einem Bruchteil eines Hertz.

Vielleicht möchten Sie die Dinge vereinfachen und mit der hysteretischen Kontrolle fortfahren:

  • Das System schaltet sich ein, wenn die Temperatur eine untere Grenze überschreitet
  • das System schaltet ab, wenn die Temperatur eine Obergrenze überschreitet
  • zwischen oberer und unterer Grenze genügend Abstand ist, um ein Prellen des Regelausgangs zu vermeiden
Die Idee ist, den PI-Ausgang zu nehmen, sagen wir: 60% und in Einschaltzeit umzuwandeln = 60% des Zyklus -> 0,6 x 30 Minuten -> 18 Minuten an und 12 Minuten aus während des 30-Minuten-Zyklus. Der von Ihnen vorgeschlagene Bang-Bang-Controller garantiert nicht die Einhaltung der erforderlichen Zyklusrate (z. B. Einschalten, nicht mehr als n-mal pro Stunde) und gleichzeitig einen niedrigen Fehler. Es kann erforderlich sein, dass das System vorübergehend für einen Zeitraum überschwingt, um den Verlust während der Auszeit auszugleichen.

Ein typischer (wenn auch zugegebenermaßen vereinfachter Weg, dies zu tun) wird Gain-Scheduling genannt. Es ist ein klassischer Ansatz zur nichtlinearen Steuerung, wenn Sie eine beobachtbare Variable (oder Variablen) haben, mit denen sich Ihr System ändert (Planungsparameter). In Ihrem System wäre diese Variable höchstwahrscheinlich die Temperatur. Die Idee ist, dass Sie eine Liste von Controller-Verstärkungen bei verschiedenen Werten des Planungsparameters (Temperatur) erstellen und diese Verstärkungen in Ihrem Controller verwenden, wenn sich der Planungsparameter ändert (sei es PI, PID, Zustandsrückmeldung oder was auch immer). Wenn das wirklich einfach klingt, liegt es daran, dass es so ist. Es funktioniert jedoch und wird in einigen sehr komplizierten Systemen verwendet.

Wenn Sie Lust haben, können Sie einen maschinellen Lernalgorithmus implementieren, um Ihre Verstärkungsmatrix zu generieren. Dies würde zu dem sich entwickelnden und lernenden Controller führen, den Sie zu beschreiben scheinen. Es könnte jedoch zu viel des Guten sein, wenn das System vollständig charakterisiert werden kann.

Edit: Entschuldigung, ich habe mich etwas verlesen. Sie versuchen, die Temperatur zu kontrollieren, damit die "Umgebungsbedingungen", von denen Sie sprachen, Ihre Planungsparameter wären.

Sie könnten einen ausgewachsenen rekursiven Least-Squares-Controller verwenden, vgl . Astrom und Wittenmark , Adaptive Control, aber ich weiß nicht, ob der Mikrocontroller genug Schwung hat, um dies zu tun.