Forum: Mikrocontroller und Digitale Elektronik Regler zur Lageregelung des Drehwinkels


von Alexander L. (lippi2000)


Lesenswert?

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

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


Lesenswert?

Wenn du von Anfang an 360° zu Ist und Sollwinkel dazuaddierst, sollte 
das Problem nicht auftauchen.

Grüsse

von Karl H. (kbuchegg)


Lesenswert?

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)

von Alexander L. (lippi2000)


Lesenswert?

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°

von Alexander L. (lippi2000)


Angehängte Dateien:

Lesenswert?

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.

von Alexander L. (lippi2000)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Achim M. (minifloat)


Lesenswert?

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

von Alexander L. (lippi2000)


Lesenswert?

@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.

von Achim M. (minifloat)


Lesenswert?

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

von Alexander L. (lippi2000)


Lesenswert?

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).

von Achim M. (minifloat)


Lesenswert?

Alexander Liebhold schrieb:
> Error   = -250

also +6

Schreib -250 mal binär im Zweierkomplement und streich die führenden 
Einsen...

mfg mf

von Alexander L. (lippi2000)


Lesenswert?

Danke Mini Float, funktioniert, habe es gerade in Code gegossen.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Achim M. (minifloat)


Lesenswert?

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
Noch kein Account? Hier anmelden.