Forum: Mikrocontroller und Digitale Elektronik Motor reglen: Trajektion?


von Patrick B. (p51d)


Lesenswert?

Hallo miteinander

Ich habe eine kleine Frage, da ich momentan nicht mehr weiter komme:
Wie würdet Ihr ein Motor regeln?

Ich habe ein PID Regler auf dem Mikrocontroller implementiert, und nun 
bin ich etwas am einstellen des Reglers.
Die ganze Regelung soll einen Schlitten, welcher über einen DC Motor und 
Spindel + Getriebe bewegt wird, an eine bestimmte Position fahren, und 
diese halten. Der Motor wird über eine H-Brücke und PWM angesteuert.

Bis jetzt habe ich die neue Position als solches dem Regler übergeben... 
(Alt: 0, dann neu 400).

Dabei habe ich eine kleine Beschleunigungsfunktion für den Anlauf 
hinzugefügt. Dies funktioniert alles recht gut, nur, wie kann man den 
Regler dann einstellen, dass dieser nicht Schwingt kommt, aber die 
Position auch wirklich anfahren kann.

Jetzt ist die Frage, ob es Sinn macht den grossen Sprung (0-400) über 
eine Trajektion zu lösen. Dies würde bei einem PWM-Antrieb aber 
unbrauchbare Geräusche verursachen, da der Regler um die kleinen 
Positionen regelt.

Die Geschwindigkeit kann ich leider nicht wirklich brauchbar verwenden, 
da das Delta nicht gross genug ist... Den Strom habe ich bis jetzt nur 
als Blockierüberwachung verwendet.

Habt Ihr vielleich noch eine Idee?
Besten Dank
Patrick

von Michael R. (mexman) Benutzerseite


Lesenswert?

Patrick B. schrieb:
> Hallo miteinander
>
> Ich habe eine kleine Frage, da ich momentan nicht mehr weiter komme:
> Wie würdet Ihr ein Motor regeln?

Hallo Patrick,


was soll denn geregelt werden? Drehzahl? Position?
Wen eine feste Position angefahren werden soll und du die Positionsinfo 
hast, wuerde ich dafuer keine PID-Regelung benutzen sondern lediglich 
eine Beschleunigungs- und Bremsrampe fahren.


gruss

Mcihael

von Patrick B. (p51d)


Lesenswert?

Oh, da habe ich wohl etwas vergessen...

Primär soll die Position geregelt werden. Diese ist aber variabel, 
ebenso die Geschwindigkeit. Bis jetzt habe ich die Geschwindigkeit so 
eingestellt, dass ich einfach den PWM Wert begrenzt habe.

Das mit der Rampe habe ich auch schon einmal überlegt, nur wie stelle 
ich dann sicher, dass die Position wirklich erreicht wird, selbst wenn 
Laständerungen auftreten?
Komischerweise braucht der Motor weniger Drehmoment um von 400 auf 0 zu 
fahren, als umgekehrt.

MFG
Patrick

von Olaf (Gast)


Lesenswert?

> Ich habe ein PID Regler auf dem Mikrocontroller implementiert,
> und nun bin ich etwas am einstellen des Reglers.

Das geht so nicht!
Es gibt vielleicht sogar irgendeinen Regler der das kann was du willst, 
aber den zu parametrieren waere so kompliziert das es keiner macht.

Man teilt die Regelaufgabe daher auf.

Als erste nimmt man einen Regler der nur den Motorstrom auf einen 
bestimmten Sollwert einstellt. Das ist notwendig weil die Kraft nicht 
linear von der Spannung, die du derzeit einstellst, abhaengt sondern vom 
Strom. Ausserdem kannst du dann diesem Regler Grenzen setzen. Also 
festlegen wieviel Kraft dein Motor aufwenden soll.

Dann ueberlagert man diesen Regler einen zweiten Regler fuer die 
Geschwindigkeit/Drehzahl des Motors. Auch das hat wieder den schoenen 
Nebeneffekt das du bestimmte Maximalwerte fuer die Geschwindigkeit 
vorgeben kannst.

Und als letztes packt man da noch einen Regler fuer die Sollposition 
drauf.

Das ganze hat den grossen Vorteil da du jeden Regler der Reihe nach 
einstellen kannst.

Olaf

von Patrick B. (p51d)


Lesenswert?

OK, Kaskadenregelung.
Wie sieht es betreffend der Frequenz aus? Alle Regler gleichzeitig 
updaten oder der Stromregler z.B mit 5kHz, der Geschwindigkeitsregler 
mit 2kHz und der Positionsregler mit 1kHz?

Und reichen da P Regler oder wo müsste ich PI oder allenfalls PID haben?

Achja, die Geschwindigkeit kann ich nicht so einfach regeln, da die 
Ist-Position über ein Poti kommt. Das Delta ist leider nur ~5Bits 
(@10Bit) bei 30ms. Somit kann ich nicht wirklich eine Geschwindigkeit 
auswerten, sondern nur ein "Verschiebung in XX um YY" -> Bewegung, 
ansonsten Blockiert.

MFG
Patrick

von StinkyWinky (Gast)


Lesenswert?

Wenn Du eine Positionsregelung hin bekommst, könntest Du mit der 
Positionsrampe die gewünschte Beschleunigung/Geschindigkeit/Verzögerung 
vorgeben. Den Rest erledigt die Positionsregelung.
Ich gehe davon aus, dass es unerheblich ist, wenn die Beschleunigung und 
Geschwindigkeit nicht exakt eingehalten wird, da nur die Endposition 
zählt.

von Patrick B. (p51d)


Angehängte Dateien:

Lesenswert?

Die Position habe ich einigermassen...

Ich habe einmal die Reglerfunktion hinzugefügt. Ebenso noch eine 
Auswertung des Bewegungsprofiles. Bei der blauen Linie handelt es sich 
um die Ist-Position, die andere entspricht dem PWM Wert (negativ ist nur 
um die Richtung in der Grafik zu unterscheiden).

Ersichtlich ist, dass bei ber ersten Position diese leicht überfahren 
wird.

Die Beschleunigung entspricht einem Timerwert, der alle 1ms erhöht wird. 
Die Verzögerung ist gleich Fehler*Kp. Den Integral und Differentialteil 
habe ich momentan noch mit Ki = Kd = 0 versehen.

Dabei sind wir jetzt wieder bei meiner Ursprungsfrage: Soll ich die 
Position direkt von alt auf neu wechseln oder eine Trajektion fahren 
(alt + 10 bis neu)?

MFG
Patrick

P.S: Ich weiss, dass der Code nicht unbedingt perfekt ist...

von StinkyWinky (Gast)


Lesenswert?

Bis jetzt habe ich immer erst eine Trajektorie errechnet. Der Regler 
versucht, diese so gut wie möglich zu fahren.

Vorteil: Die Trajektorie ergibt sich nicht aus dem Regler (bzw. dessen 
Einstellung)

von Patrick B. (p51d)


Lesenswert?

Soweit ich das jetzt verstanden habe, würde diese Trajektorie dann aber 
eine permanente Regelung um den aktuellen Punkt erzeugen. Da der Motor 
mit PWM geregelt wird, entstehen dann doch Geräusche, oder nicht?

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.