Hallo Ich habe einen funktionierenden PID regler inkl. Anti Wnd-UP vom I Anteil. Der PID Regler wird für die Geschwindigkeitsregelung eines Motors benutzt. Als Soll und Ist-Wert habe ich die aktuelle Encoderposition, somit eine Reglerdifferenz von einigen 1000. Der Speed vom Motor ist aber in rpm einstellbar und liegt normalerweise bei ca. 500-5000rpm. Der Ausgangswert vom PID Regler ist aber sehr gross, da ich mit Integer-Werten für P, I und D arbeite (long). Wird der Error zwischen aktueller Position und Sollposition vom Encoder klienr, soll auch die Geschwindigkeit abnehmen. Gibt es dazu eine elegantere Lösung als mit einer Division vom Ausgangswert zu arbeiten? Ich würde den maximalen Ausgangswert vom PID im Verhältnis zum aktuellen Speed rechnen und danach den Ausgangswert vom PID (der ja immer abnimmt) wieder durch diesen Faktor teilen, damit ich von z.Bsp 500rpm langsam auf 0 zurückfahre. Gibt es da keine bessere Lösung? Und nein, ich möchte keine float Berechnung im Regler. Vielen Dank
Domi --- schrieb: > Gibt es dazu eine elegantere Lösung als mit einer Division vom > Ausgangswert zu arbeiten? Wenn du die Division geschickt anlegst, als 2-er Potenz, dann ist diese Division für den µC Pipifax. So wie für dich eine Division durch eine 10-er Potenz (1, 10, 100, 1000, ...) Pipifax ist, weil du einfach nur Stellen wegstreichen brauchst und nicht rechnen musst. Was für dich 10 ist, ist für deinen µC die 2. Und da die Parameter im PID Regler sowieso niemandem irgendetwas sagen und einfach nur Zahlenwerte sind, ist es völlig unerheblich, ob dein Benutzer da jetzt 3 oder 24 einstellt und dein Programm danach noch mal durch 8 dividiert. Ausser natürlich, dass du durch die Fix Point Arithmetik ein paar 'Kommastellen' mit durch die Rechnung geschleust hast :-) Was ja auch das Ziel der Sache war. Aber 24 sagt deinem Benutzer genausowenig, wie es 3 getan hätte.
ok, danke für den Input Aber das ist so wie ich verstehe schon der korrekte Lösungsansatz mit der Division? Oder wäre es sinnvoller den PID Algorythmus so umzustellen, dass der Ausgangswert des PID nicht mehr skaliert werden muss? Ich bin mir einfach nicht sicher, ob in diesem Fall mit sehr hohen Differenzen zwischen Soll und Ist und einer verhältnismässig kleinen Stellgrösse die Division wirklich die einzige Lösung ist oder ob ich da die Differenz für den Reglereingang besser verkleinern sollte, was aber wieder Geanuigkeit kostet, was ich nicht will. Gruss
Domi --- schrieb: > ok, danke für den Input > > Aber das ist so wie ich verstehe schon der korrekte Lösungsansatz mit > der Division? > Oder wäre es sinnvoller den PID Algorythmus so umzustellen, dass der > Ausgangswert des PID nicht mehr skaliert werden muss? Den Algorithmus tangiert (bis auf mögliche Overflows und daher notwendige Zahlenwertbegrenzungen) das überhaupt nicht. PID steht und fällt mit den Reglerkonstanten! Die sind dein Werkzeug um einen PID-Regler anzupassen.
Irgendwie ist das alle Käse was du da schreibst, das fängt schon damit an, dass du keine Geschwindikgkeitsregelung (wie du schreibst) sondern offensichtlich eine Positionsregelung realisieren willst. Deine Faktoren die du berechnen willst scheinen mir reichlich konfus. Und warum die Geschwindigkeit immer abnehmen soll bleibt dein Geheimnis. Was ist mit deinen Faktoren für P, I und D Anteil? Du kannst z.B. deine P-Verstärkung so wählen, dass bei einer Positionsabweichung x die Stellgröße y (z.B. maximale Geschwindikgeit) rauskommt. Dann musst du nicht nachher mit weiteren Faktoren rumfrickeln.
Es geht um eine Positionsregelung, aber da ich ebenfalls die Geschwindigkeit stabil haben muss, werde ich den Fehler der Positionsregelung auf den Rampengenerator geben, der anschliessend die Geschwindigkeit regelt, und bei Abweichung von Soll-Ist = 0 ist die Geschwindigkeit 0 und somit die Position erreicht. Kaese schrieb: > Was ist mit deinen Faktoren für P, I und D Anteil? > > Du kannst z.B. deine P-Verstärkung so wählen, dass bei einer > > Positionsabweichung x die Stellgröße y (z.B. maximale Geschwindikgeit) > > rauskommt. Dann musst du nicht nachher mit weiteren Faktoren > > rumfrickeln. Ja könnte ich, wenn aber die P-Verstärkung in int ist und der Fehler von Soll zu Ist 40'000 wird es schwierig ohne Division auf eine Ausgangsgrösse von 500 zu kommen...
Kaese schrieb: > > Deine Faktoren die du berechnen willst scheinen mir reichlich konfus. > Und warum die Geschwindigkeit immer abnehmen soll bleibt dein Geheimnis. > Damit ich eine Position anfahren kann, muss logischerweise die Geschwindigkeit vom Motor abnehmen.
@ Domi --- Möchtest Du mit Deinem Regler nur elektrische Antriebe ansteuern? Dabei solltest Du bedenken, dass zum Beispiel in Frequenzumrichtern auch schon Regler eingebaut sind und sich ein Antrieb (je nach Last) auch nicht immer "linear" verhält. Wenn der Antrieb über seine Sollposition gefahren ist, ist auch nicht immer ein direktes Gegensteuern möglich. Solltest Du damit zum Beispiel auch hydraulische Antriebe betreiben, dann wirst Du merken, dass diese Dinger "sauschnell" auf Änderungen reagieren. Der ganze Aufbau (besonders wenn mehrere geregelte Hydrauliken gleichzeitig arbeiten) gerät dann schon mal ins Schwingen. Auch sollte Deine Positionsmessung direkt die Auslenkung des Hydraulikzylinders bestimmen und nicht irgendwo an dem Aufbau messen (das verringert nicht gerade die Schwingneigung oder irgendwelche Regelabweichungen).
Domi --- schrieb: > Es geht um eine Positionsregelung, aber da ich ebenfalls die > Geschwindigkeit stabil haben muss, werde ich den Fehler der > Positionsregelung auf den Rampengenerator geben, wow, wow, wow. Welcher Rampengenerator? Der Positionsregler sieht sich die Positionen an und rechnet aus, mit welcher Geschwindigkeit er in welche Richtung fahren will. Mehr nicht. DIe Rampe ergibt sich doch ganz von selbst, in dem der PID Regler bei Annäherung die Geschwindigkeit zurücknimmt. Damit sich dieses Verhalten einstellt, werden die Kp, Ki und Kd des Positionsreglers entsprechend eingestellt. Mir hat sehr viel geholfen, dass ich mir auf dem PC mal eine Simulation gemacht habe, in der ich die jeweiligen Werte grafisch aufgemalt habe und mir angesehen habe, wie sich Regelabweichung, Stellgröße und auch interne Werte im Laufe der Zeit verändern. Aus den Diagrammen ist, mir zumindest, einiges klar geworden, wie die Dinge zusammenarbeiten.
Ja es wird ein BLDC Motor über eine H-Brücke (alle 3 Phasen) angesteuert. Die Speedregelung ist schon im Application Note vom EvalBoard integriert, aber die Positionsregelung leider nicht. Aber ich habe nachgelesen und bei Roboter und CNC Maschinen, die genau einen Speed und Position anfahren müssen, wird es so gemacht, dass der Fehler zwischen Soll und Ist-Position auf den PID vom Speedregler gegeben wird (über den Rampengenerator vom Speed) Es funktioniert grundsätzlich, aber das Problem mit dem Verhältnis zwischen PID Positionsregler Ausgang und Stellgrösse für den Speed habe ich noch nicht gelöst
Karl Heinz Buchegger schrieb: > Welcher Rampengenerator? Der Teil, der zuständig für die Soll und Ist-geschwindigkeit zuständig ist, damit ich kontrolliert und einstekllbar anfahren bzw. Bremsen kann.
Karl Heinz Buchegger schrieb: > Welcher Rampengenerator? > > > > Der Positionsregler sieht sich die Positionen an und rechnet aus, mit > > welcher Geschwindigkeit er in welche Richtung fahren will. Mehr nicht. > > DIe Rampe ergibt sich doch ganz von selbst, in dem der PID Regler bei > > Annäherung die Geschwindigkeit zurücknimmt. Das stimmt, hast du vollkommen recht, aber in diversen CNC Steuerungen und Roboterarmen-Regler wird dies anscheinend so gemacht. Ich versuche mal beides und werde die Resultate danach posten.
Grundsätzlich dient der Rampengenerator dazu, den SollSpeed langsam (über eine einstellbare Rampe hochzufahren bzw. wieder runterzufahren. Der PID Regler vom Speed folgt dann dieser Rampe und somit ist die Beschleunigungsrampe und Bremsrampe einstellbar und der Motor beschleunigt gemäss einer vorgegebenen Rampe. Aber eventuell kann ich das auch direkt ohne Rampe realisieren. Natürlich muss die Rampe so schnell sein, damit der PID Ausgang auch korrekt verarbeitet wird.
Sehen wir doch mal, wie es die Industrie macht: - P-Regler für Position, Istwert ist die aktuelle Position Ausgang ist der Lagefehler. - Ausgang dieses PI-Regler auf Sollwerteingang des Geschwindigkeitsregler, Istwert dieses Regler ist die aktuelle Geschwindigkeit Ausgang dieses Reglers ist der Momenten/Kraft/Druck/Stromsollwert - Ausgang dieses Reglers auf den Strom/Druckregler Und jetzt das Wunder: Du brauchst für den ersten Regler einen Sollwert, dieser schimpft sich meist Lagesolltwertinterpolator (oder Rampengenerator). So arbeiten zumindest alle mir bekannten Servoantriebe. Jörg
Danke Joerg, genau so dachte ich es mir auch, habe es vielleicht etwas kompliziert beschrieben.
Sinnvollerweise ueberlaesst man nicht die ganze Arbeit dem dummen PID. Sondern rechnet was man rechnen kann und legt den PID oben drueber. Wenn man das Stellglied zum approximativen manuellen Anfahren der Position auf 256*F(Error) stellen muss, so sollte man das auch schon so verwenden. Dazu wird das Stellglied durch die Stellgliedskalierung zurueckgerechnet, zB, mal 512. Dann erscheint der Algorithmus als Stellglied : = (1/512)*(Error*P + Integrator div 1024 + Diff() + 512*256*F(Error))
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.