Hallo, ich finde momentan keine Lösung für ein Problem, welches allerdings in der Praxis schon öfters vorkommt. Ich habe ein System, bestehend aus einem DC-Motor, Absolutwertgeber 13-Bit für den Drehwinkel der Motorachse und einen Software PI-Regler. Das ganze Aufgebaut mit einem SPS-System. Der Softwareregler funktioniert und wurde schon mehrfach eingesetzt (weitere Achsen), sowie die Ermittlung des Drehwinkels. Nun mein eigentliches Problem: Der Drehwinkelgeber liefert eine Zahlenbereich 0...8192 (13-Bit) für eine volle Umdrehung 0...360°. Nun stellt der Nullübergang 359°->0° bzw. 359°<-0° einen unstetigen Übergang dar, auf den sich mit einem PI-Regler nicht regeln lässt. Im Klartext bedeutet dies: Soll die Position 0° von der aktuellen Position 50° angefahren werden, dreht der DC-Motor seine Achse gegen den Uhrzeigersinn und erreicht zunächst 0°. Mit einem leichten Überschwingen der Sprungantwort(<5%) dreht die Motorachse sich anschließend auf -1° bzw. 359° und die Differenz (Soll- zu Istwert) wird schlagartig sehr hoch. Wenn ich mit Differenzen arbeite z.B. alle Winkelangaben zwischen 180°...359° werden als negativ betrachtet. IF( Winkel > 180°) { Winkel = 360°-Winkel; } Diese Variante behebt das Problem allerdings nicht, denn es verschiebt den Unstetigen Übergang nun auf 180°, bei dem der Wert zwischen -178° -> -179° -> +180° -> +179° Ich hoffe ihr habt weitere Ideen. Grüße Alex
Wenn du von Anfang an 360° zu Ist und Sollwinkel dazuaddierst, sollte das Problem nicht auftauchen. Grüsse
Hmm. Du könntest folgende Idee versuchen. Da klar ist, dass sich der Winkel nicht in kurzer Zeit extrem ändern kann, könnte man einen Zusatz einbauen, der besagt: wenn die Winkeländerung negativ ist UND der sich daraus ergebende Absolutwinkel vom vorhergehenden Ergebnis um (Hausnummer) 20 Grad unterscheidet, dann war da ein 0-Durchgang dazwischen und der Absolutwinkel wird um 360° korrigiert. Aus 358° werden -2°. Selbiges in umgekehrter Richtung bei "positiver" Winkeländerung. Ändert sich der WInkelwert von 355° auf 5°, dann werden die 5 zu 365° korrigiert, weil es physikalisch nicht möglich ist, dass sich von einer Abtastung zur nächsten der Winkel um (5 - 355; -350°) ändern kann. 365 - 355 hingegen (= 10°) ist physikalisch plausibel. (Auch wenn -350 und +10 ja eigentlich dasselbe sind). D.h. 'diese' eine Messung ist zur Bestimmung der Regelabweichung als +365 zu lesen und nicht als +5. (Edit: Ich merk grad, dass die Idee noch etwas unausgegoren in den Details ist. Aber so in etwa als Idee könnte es funktionieren)
Geht auch nicht: Istwinkel = 350°, Sollwinkel = 15° Reglerdifferenz = Sollwinkel - Istwinkel = -335° Oder dein Vorschlag: Reglerdifferenz = (Sollwinkel + 360°) - (Istwinkel + 360°) = -335° Oder in die andere Richtung: Istwinkel = 15°, Sollwinkel = 350° Reglerdifferenz = Sollwinkel - Istwinkel = 335°
Was haltet ihr davon, alle Angaben nur noch relativ zu treffen? Spricht der Regler bekommt als Sollwert den Wert 0. Als Messwert (Istwert), wird nur die Winkeldifferenz zwischen Sollwinkel und Istwinkel an den Regler übergeben. Habe mir das ungefähr so wie im Bild gedacht. Müsste man nur sinnvoll berechnen können.
Bevor ich den Regler starte, kann ich folgende zwei Dinge bestimmen: 1. Anhand des Soll- und Istwinkels, kann ich zunächst bestimmen, ob ich um Uhrzeigersinn oder entgegengesetzt fahren will (je nach kürzester Distanz). 2. Angabe des Quadranten für aktuellen Soll- und Istwinkel. Mit der Drehrichtung und der Information über den Quadranten, ergeben sich begrenzte Quadrantenübergänge. Uhrzeigersinn: II -> I oder III -> I: Sollwert + 360° Entgegengesetzter Uhrzeigersinn: I -> III oder IV -> II: Istwert + 360° Somit dürfte bei positiver Drehrichtung der Sollwert auch überfahren werden und es ergibt sich dementsprechend eine negative Differenz.
Alexander Liebhold schrieb: > 1. Anhand des Soll- und Istwinkels, kann ich zunächst bestimmen, ob ich > um Uhrzeigersinn oder entgegengesetzt fahren will (je nach kürzester > Distanz). Und da du immer den kürzeren Weg fährst (fahren willst), weißt du auch, dass die Regelabweichung niemals größer als 180° sein kann Abweichung = Soll - Ist; if( Abweichung > 180 ) Abweichung -= 360; if( Abweichung < -180) Abweichung += 360; Das erledigt dir dann auch gleich so nebenher die Wahl des jeweils kürzeren Weges.
Die Stelle im Regelkreis, wo vom Sollsignal das Istsignal abgezogen wird, macht bei Festkommaarithmetik keine Probleme mehr. Es kommt immer nur die Differenz raus, weil du sowieso mit einem zirkulären Zahlenbereich arbeitest. Das einzige, was getan werden muss, ist das aufblasen der Zahlen auf den "Maximalbereich" oder eben zirkuläres beschränken des Bereichs. Beispiele mit Zahlenbereich signed 8bit(geht von -128 bis +127): a) Ist = 8 Soll = 15 Error = 7 b) Ist = 47 Soll = 11 Error = -36 c) Ist = -128 Soll = 127 Error = wäre 255, also -1 d) Ist = 127 Soll = -128 Error = 1 mfg mf
@Karl heinz: Leider verschiebt mir diese Lösung das problem lediglich. Fahre ich genau 180° an, und habe ein leichtes Überschwingen, so springe ich ständig zwischen -179° und +179° umher. @Mini Float: Klingt für mich erst einmal logisch. Muss ich mal ausprobieren, ob ich einen eigenen "13-Bit Datentyp" hinbekomme.
Alexander Liebhold schrieb: > @Mini Float: Klingt für mich erst einmal logisch. Muss ich mal > ausprobieren, ob ich einen eigenen "13-Bit Datentyp" hinbekomme. Entweder vor der Rechnung den Wal, äh die Operanden um 3 "nach vorn" schieben, rechnen, Ergebnis wieder zurückschieben... Oder eben die "zirkuläre Begrenzung" vom Mr. Buchegger benutzen... Ein eigener Datentyp, der das intrinsich für genau deinen Zweck kann, ist in C++ schnell erstellt. Vielleicht auch als Template-Klasse? mfg mf
Also ganz verstehe ich das jetzt nicht: Ist = -124 Soll = +126 Error = -250 ?????? Zudem geht der Wertebereich doch nur von -127 (0x80) bis +127 (0x7F).
Alexander Liebhold schrieb: > Error = -250 also +6 Schreib -250 mal binär im Zweierkomplement und streich die führenden Einsen... mfg mf
Danke Mini Float, funktioniert, habe es gerade in Code gegossen.
Alexander Liebhold schrieb: > @Karl heinz: > > Leider verschiebt mir diese Lösung das problem lediglich. Fahre ich > genau 180° an, und habe ein leichtes Überschwingen, so springe ich > ständig zwischen -179° und +179° umher. Nö. Wieso sollte das so sein? Die Korrektur wird auf die Regelabweichung gemacht! Nicht auf den Absolutwinkel. Bei der Regelabweichung geht es aber darum: wie nahe bin ich schon an der Sollposition. Und durch die Korrektur wird sichergestellt, dass diese Differenz eine saubere größer/kleiner Relation einhält.
Alexander Liebhold schrieb: > Danke Mini Float, funktioniert, habe es gerade in Code gegossen. Aber schön im Code kommentieren, was da passiert. Sonst tritt später mal eine der häufigsten Kombinationen aus Theorie und Praxis auf: Es funktioniert nicht (mehr), und keiner weiß (mehr), warum... mfg mf
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.