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
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)
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:> @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
Eine eigene Frage?
Dieser Thread ist über 14 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.