Forum: Mikrocontroller und Digitale Elektronik Drehzahlregelung zweier Motoren über die aktuellen Positionen


von Korbi (som_k)


Lesenswert?

Hallo zusammen,

ich habe eine Frage bzgl. einer Drehzahlregelung von zwei gleichen 
Motoren. Ich möchte das beide Motoren von der gleichen Startposition zu 
einer definierten Endposition fahren. Dabei soll die aktuelle Position 
beider Motoren im Idealfall über den gesamten Zeitraum konstant sein. 
Meine aktuelle Regelung bildet die Differenz von beiden aktuellen 
Positionen und damit gehe ich in einen PID-Regler. Der Ausgangswert des 
PID-Reglers ist zwischen 0-1 begrenzt, da ich den Wert mit der maximalen 
Drehzahl des jeweiligen Motors multipliziere. Meine aktuelle 
Implementierung funktioniert auch ganz gut, aber wenn ich beispielsweise 
den einen Motor vor dem Start ein bisschen verdrehe (Differenz der 
Positionen zwischen beiden Motoren), dann laufen beide Motoren, aber die 
Differenz beider Positionen wird nicht so eliminiert, wie ich mir das 
vorgestellt habe.
In meinem Kopf müsste der Motor, der weiter vorne startet, warten, bis 
der andere ihn eingeholt hat.

Hat jemand eine Idee für eine Umsetzung?

Über einen Tipp würde ich mich freuen.

Vielen Dank schon einmal im Voraus.

von Wolfgang (Gast)


Lesenswert?

Korbi schrieb:
> ich habe eine Frage bzgl. einer Drehzahlregelung von zwei gleichen
> Motoren.
> ...
> Hat jemand eine Idee für eine Umsetzung?

Vergiss die Drehzahlregelung und setze statt dessen eine 
Positionsreglung ein.

Um was für einen Motortyp handelt es sich?

von Korbi (som_k)


Lesenswert?

Wolfgang schrieb:
> Korbi schrieb:
>> ich habe eine Frage bzgl. einer Drehzahlregelung von zwei gleichen
>> Motoren.
>> ...
>> Hat jemand eine Idee für eine Umsetzung?
>
> Vergiss die Drehzahlregelung und setze statt dessen eine
> Positionsreglung ein.
>
> Um was für einen Motortyp handelt es sich?
Vielen Dank für deine Rückmeldung!

Es handelt sich um einen permanentmagneterregten 
Drehstrom-Synchron-Motor.

Ich verstehe aktuell noch nicht ganz, wie ich die Regelstrecken 
handhaben soll. Vorher habe ich zwei Regelstrecken aufgebaut - eine für 
jeden Motor. Dann ist mir aber schnell aufgefallen, dass die Differenzen 
der aktuellen Positionen bei beiden Motoren gleich sind (nur mit 
umgekehrten Vorzeichen). Durch meine Regelung ist es deshalb nicht 
möglich, eine vorher eingestellte Differenz der Lagen auszugleichen...
Mein Ziel ist es, dass die Differenz der Positionen über die gesamte 
Fahrt so gering wie möglich ist.

Ich komme leider nicht weiter und stehe auf dem Schlauch. Im Forum bin 
ich bisher auch noch nicht auf einen ähnlichen Fall gestoßen.

von micha (Gast)


Lesenswert?

nur ein Motor und Achsen mechanisch koppeln oder Positionsreglung bzw. 
Winkelgeschwindigkeit der Achsen wenn der restliche mechanische Aufbau 
hinreichend schlupffrei ist.

von WS (Gast)


Lesenswert?

Die Lagedifferenz als Korrektur des Drehzahlsollwerts einkoppeln.

WS

von WS (Gast)


Lesenswert?

Du kannst die Korrektur so machen, dass der eine Motor nicht schneller, 
der andere aber langsamer, nicht aber rückwärts fahren darf. Dann bleibt 
der vordere im extremen Fall stehen bis der andere aufschliesst.

WS

von Korbi (som_k)


Lesenswert?

WS schrieb:
> Du kannst die Korrektur so machen, dass der eine Motor nicht schneller,
> der andere aber langsamer, nicht aber rückwärts fahren darf. Dann bleibt
> der vordere im extremen Fall stehen bis der andere aufschliesst.
>
> WS

Vielen Dank für die Hinweise und Vorschläge!

So wie du es hier schreibst WS habe ich es mir auch vorgestellt, aber 
ich habe ein Problem bei der Implementierung. Aktuell bilde ich die 
Differenz der beiden Positionen der Motoren und gehe damit in den 
PID-Regler (bei beiden Regelstrecken). Mit dem dabei entstehenden Wert 
beeinflusse ich die Drehzahl. Aber wie kann ich das genau umsetzen, dass 
der eine Motor (der weiter vorne ist) stehen bleibt, bis der andere 
nachgezogen ist bzw. das eine Rückwärtsfahrt vermieden wird.

Ich setze das Projekt in Simulink und Stateflow um. Was Simulink angeht 
würde ich mich als fortgeschrittenen Anfänger bezeichnen.

Aber die Idee hat mir auf jeden Fall schon neue Denkanstöße gegeben. 
Vielen Dank und schönes Wochenende!

von Bierbaron (Gast)


Lesenswert?

Wenn du über Position gehst dann kannst du dem langsameren die Position 
des schnelleren als Führungsgröße geben damit er aufholt und dem 
schnelleren die Position des langsameren? In der Hoffnung, dass sich sie 
sich irgendwann treffen^^

Wenn du es genauer wissen willst: Du hast hier ein Mehrgrößensystem. 
Zwar sind die Motoren unabhängige Regelstrecken, aber durch das 
gemeinsame Regelungsziel kommt die Verkopplung rein. Mit einem 
Mehrgrößenregler á la H-infty oder LQR kannst du das Problem vermutlich 
gut lösen.

von Hans-jürgen H. (hjherbert) Benutzerseite


Lesenswert?

Das laufend ausführen


dPosRL = Pos[R] - Pos[L] ; // Positionsdifferenz

ly =  mul_sw_sw( dPosRL, PWert );    // P-Regler
lx = -asp.vFahr + ly;      //Jetzt negativ
if ( lx > 0 ) lx = 0 ;  // Drehrichtungsbegrenzung
if ( lx < -32767 ) lx = -32767 ; // Maximale Geschwindigkeit
vSoll[L] = (s16)lx ;
lx = -asp.vFahr - ly;
if ( lx < -32767 ) lx = -32767 ;  // Maximale Geschwindigkeit
vSoll[R] = (s16)lx ;

von Korbi (som_k)


Lesenswert?

Hans-jürgen H. schrieb:
> Das laufend ausführen
>
>
> dPosRL = Pos[R] - Pos[L] ; // Positionsdifferenz
>
> ly =  mul_sw_sw( dPosRL, PWert );    // P-Regler
> lx = -asp.vFahr + ly;      //Jetzt negativ
> if ( lx > 0 ) lx = 0 ;  // Drehrichtungsbegrenzung
> if ( lx < -32767 ) lx = -32767 ; // Maximale Geschwindigkeit
> vSoll[L] = (s16)lx ;
> lx = -asp.vFahr - ly;
> if ( lx < -32767 ) lx = -32767 ;  // Maximale Geschwindigkeit
> vSoll[R] = (s16)lx ;

Hallo Jans-Jürgen,

vielen Dank für deine Antwort.

Kannst du mir das vielleicht noch ein bisschen genauer erläutern von den 
Bezeichnungen. Grob habe ich es verstanden, aber ich stolper aktuell 
noch ein bisschen über die Benennungen in deinem Code.

Vielen Dank für deine Unterstützung!

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.