Forum: Mikrocontroller und Digitale Elektronik Servoregelung in Software


von Martin S. (tilex)


Lesenswert?

Hallo zusammen,
ich habe das Forum schon eine Weile durchforstet, aber bin zu dem Thema 
noch nicht richtig fündig geworden.

Ich habe hier einen Servomotor (keinen Modellbauservo, wie in den 
tausenden Forenbeiträgen, die die Suche liefert). Genau genommen ist es 
also ein DC-Motor, welcher mit Hall-Sensoren und End-Schaltern eine 
Positionsrückgabe liefert.

Für diesen Motor habe ich eine Platine mit Treibern entwickelt, welche 
mir ermöglicht mit Richtungsangabe und PWM den Motor anzusteuern.
Die Ansteuerung erfolgt dann über einen Raspberry Pi, auf dem ein 
C-Programm läuft.

Da bei mir das Thema "Regelungstechnike" wieder eine Weile zurückliegt, 
stehe ich grade auf dem Schlauch, wie ich meinem Programm beibringe, den 
Motor geschickt in der Geschwindigkeit zu regeln.

Im Grunde sieht es so aus: das Programm weiß, auf welchem Winkel der 
Motor
zu jedem Zeitpunkt ist. Die Aufgabe ist nun einen Sollwinkel anzufahren.
Aus Sollwinkel und Istwinkel kann eine Differenz für die zu fahrende 
Strecke gebildet werden.
Meine Messung hat ergeben, dass der Motor bei voller Geschwindigkeit mit 
etwa 4° pro Sekunde fährt.
Die PWM lässt sich zwischen 10% und 100% regeln, um die Geschwindigkeit 
zu variieren.

Mein Wunsch wäre, dass der Motor auf etwa 0.1° Genauigkeit den Istwert 
erreicht.

Wie stellt man mit solchen Randbedingungen eine Formel auf, die mit den 
gegebenen Werten die Geschwindigkeit sanft hoch regelt und wieder 
sinnvoll runter regelt? Ich hoffe da gibt es etwas, bei denen man die 
Parameter experimentell anpassen kann, da ich kein kompliziertes 
Verhaltensmodell meines Motors in den Code pressen möchte.


Hier noch mehr Daten zum konkreten Motor:
es handelt sich hier um einen Zwei-Achsen-Positionierer, der
eine Satellitenschüssel ausrichten soll. Genau genommen sind also
zwei 24V-DC-Motoren drin. Für jede Achse einer. Je Achse gibt es zwei 
Hall-Sensoren und einen Endschalter.
Azimuth-Achse:
Bereich: 0°-180°
maximale Geschwindigkeit: ca. 4°/s
Sensoren: 0.01°/pulse

Elevations-Achse:
Bereich: 0°-40°
maximale Geschwindigkeit: ca. 1.5°/s
Sensoren: 0.0025°/pulse

Ich freue mich auf jede Antwort und verbleibe mit freundlichen Grüßen,
Martin.

von Karl H. (kbuchegg)


Lesenswert?

Martin S. schrieb:

> Da bei mir das Thema "Regelungstechnike" wieder eine Weile zurückliegt,
> stehe ich grade auf dem Schlauch, wie ich meinem Programm beibringe, den
> Motor geschickt in der Geschwindigkeit zu regeln.

Es gibt ein 'Open Source Servo', in dem genauso wie bei dir, das 
Verhalten eines Modellbauservos nachgebildet wird

http://www.openservo.com/

Dort kann man sich sicher Anregungen holen, wie die das machen.


> Im Grunde sieht es so aus: das Programm weiß, auf welchem Winkel der
> Motor
> zu jedem Zeitpunkt ist. Die Aufgabe ist nun einen Sollwinkel anzufahren.
> Aus Sollwinkel und Istwinkel kann eine Differenz für die zu fahrende
> Strecke gebildet werden.
> Meine Messung hat ergeben, dass der Motor bei voller Geschwindigkeit mit
> etwa 4° pro Sekunde fährt.
> Die PWM lässt sich zwischen 10% und 100% regeln, um die Geschwindigkeit
> zu variieren.
>
> Mein Wunsch wäre, dass der Motor auf etwa 0.1° Genauigkeit den Istwert
> erreicht.


Ich würde da wahrscheinlich erst mal naiv mit einem PID Regler rangehen.
Der ist einfach zu implementieren (die beste Beschreibung gibt es meines 
Erachtens auf www.roboternetz.de, google bringt dich da hin.


> sinnvoll runter regelt? Ich hoffe da gibt es etwas, bei denen man die
> Parameter experimentell anpassen kann, da ich kein kompliziertes
> Verhaltensmodell meines Motors in den Code pressen möchte.

Für PID Regler gibt es auch eine experimentelle Ermittlung der 
Parameter. Ebenfalls im PID Artikel auf dem Roboternetz zu finden

von Purzel H. (hacky)


Lesenswert?

Wenn die stellgroessse, sprich Drehgeschwindigkeit fest und im 
Wesentlichen die Schritte gezehlt werden, dann wuerde ich einfach 
schreiten bis die Position erreicht ist.

von Falk B. (falk)


Lesenswert?

Das Projekt des Meisters aus dem fernen Osten.

http://elm-chan.org/works/smc/report_e.html

Für gute/optimale Regelung, braucht man einen Kaskadenregler, so wie im 
Projekt gezeigt. Strom, Geschwindigkeit, Position.

von Oliver P. (mace_de)


Lesenswert?

Mal zur Klarstellung, soll der besagte Motor jetzt "nur" eine 
Satschüssel ausrichten oder ist es ein Motor für Satschüsseln der jetzt 
eine andere (präziesere, zeitkritischere) Aufgabe übernehmen soll?
Danach richtet es sich ja ob man das Projekt a'la ELM-Chan aufziehen 
muss oder ob es auch ein schrittzähler mit Start- und Stoprampe tut.

von Martin S. (tilex)


Lesenswert?

Der Motor soll "nur" eine Satschüssel ausrichten.
Es ist also ein Motor, der für diesen Zweck gebaut wurde und auch für 
diesen Zweck eingesetzt werden soll. Die Besonderheit ist nur, dass ich 
nicht für ein paar tausend Euro die Ansteuerungsgeräte vom Hersteller 
kaufe, sondern, dass ich die Gleichstrommotoren direkt über meine 
Leistungselektronik treibe und die ganze Steuerung dafür selbst 
entwickle.

Danke übrigens für alle Antworten. Das gibt mir schonmal ein paar 
Denkanstöße.

von Raymund H. (raymund_h)


Lesenswert?

Falk Brunner schrieb:
> Für gute/optimale Regelung, braucht man einen Kaskadenregler, so wie im
> Projekt gezeigt. Strom, Geschwindigkeit, Position.

Ist wohl etwas übertrieben, wozu hier die Geschwindigkeit oder den Strom 
regeln?
Der Strom sollte begrenzt sein, wenn er das nicht schon ausreichend 
durch den Innenwiderstand des Motors ist.

Da dieser Motor mit Positionspoti ziemlich wie ein mechanischer 
Integrator ist von Steuerpannung zu Position (in niedrigem Freqenzband) 
ist hier ein P Regler evtl. schon ausreichend.

Nur die Anlaufspannung des Motors/Mechanik könnte einen I-Anteil um den 
Regelfehler gegen Null laufen zu lassen wünschenswert machen, 
unwahrscheinlich.

Die mögliche P Verstärkung wird  hier begrenzt ab welcher Frequenz 
weitere, kleinere Zeitkonstanten in der Regelschleife signifikant werden 
und dann evtl. die Phase mehr als 135 Grad verschoben wird, 
Phasenreserve 45Grad.

Das kann der elektrische Phasengang von Motor (L/R), (Serienwiderstand 
verkleinert diese ungewollte Zeitkonstante auf Kosten der 
Verlustleistung, alternative ist Stromquelle/Regelung) Phasengang durch 
mechanische Resonanzen oder die Gruppenlaufzeit durch die Abtastung/PWM 
dominiert sein.

Der elektrische Phasengang des Motors kann zum Teil also bis zu einer 
gewissen Frequenz (Spannungsdynamik der Stromendstufe) durch eine 
Stromregelung ausgeglichen werden, das würde die mögliche 
Regelbandbreite steigern, das Frequenzband in dem der Motor ein rein 
mechanischer Integrator ist erweitern.

Evtl. begrenzt die Auflösuung des Positionsgebers die praktikable P 
Verstärkung, wie meist bei hochleistungs-Servosystemen.
Diese Quantisierung wird dann zur bestimmenden Nichtlinearität und die 
Regelschleife Schwingt/"Rauscht" ab zu hoher Verstärkung, was nicht 
zwingend so wäre bei höherer Auflösung des Positionsgebers.

Also einfach einen P-Regler:

PWM=(Soll-Ist)*GainP

Programmieren und GainP steigern bis es unruhig wird, überschwingt. 
Regelt es dann Laständerungen noch gut genug  aus, bleibt der 
Regelfehler im Limit, ist alles Prima.

von Holm T. (Gast)


Lesenswert?

Diese "Motoren" gibt es doch fertig mit integrierter Elektronik für 
Steuerung...
DiSEqC
Ich hatte mir mal oberflächlich Gedanken darüber gemacht eine Solarzelle 
mit so einem Ding auszurichten und habe nach einiger Suche auch die 
Beschreibung des Protokolls bekommen.

Wäre es für Deinen Zweck nicht angebrachter wenn Dein Steuerrechner 
direkt die DiSEqC Daten zum Spiegelmotor schicken würde?

Gruß,

Holm

von Martin S. (tilex)


Lesenswert?

Hallo Holm,
interessanter Einwurf, jedoch geht das wohl an meinem Projekt vorbei.
Das Protokoll kannte ich noch nicht, aber der Motor wird nicht 
getauscht.
Ich habe hier einen 3000-Euro-Antennenrotor. Der ist fester Bestandteil 
des Projektes und wird nicht ersetzt :)

Übrigens sind die Satelliten, die ich erfassen möchte keine TV-Sats 
sondern Amateurfunk-Sats. Um die Position derer zu berechnen, habe ich 
übrigens ein externes Programm.
Meine Aufgabe ist also schlicht nurnoch einen gegebenen Neigungswinkel 
und gegebenen Winkel auf der Kompassrose anzufahren.
Daraufhin soll ich den Motor dann geschickt die Motoren ansteuern 
lassen, damit sie möglichst schnell aber nicht zu ruckartig die Position 
anfahren.

Übrigens habe ich das Servo-Problem jetzt ein wenig in den Griff 
bekommen.
Hilfreich war für mich dabei das Regelungsdiagramm auf elm-chan.org: 
http://elm-chan.org/works/smc/zblock3.png
In Anlehnung dessen habe ich eine (etwas simplere) Regelung aufgebaut.

Prinzipiell funktioniert meine Regelung nun wie folgt:
die Winkeldifferenz zwischen Soll- und Ist-Wert wird mit einem 
experimentell
bestimmten Faktor multipliziert und in eine Soll-Geschwindigkeit 
umgewandelt.
(Das stellt sozusagen einen P-Regler dar.)
Nun wird permanent die Ist-Geschwindigkeit mit der Soll-Geschwindigkeit 
verglichen. Ist die Ist-Geschwindigkeit zu niedrig (zu hoch) wird die 
PWM um einen Schritt erhöht (erniedrigt).

Die Ist-Geschwindigkeit wird hierbei übrigens durch eine lineare 
Näherung ermittelt: eine Funktion, die aufgrund des derzeitig 
eingestellten PWM-Wertes eine Geschwindigkeit abschätzt. Das 
funktioniert meines Erachstens sehr akurat.

Zuvor hatte ich, um die Ist-Geschwindigkeit zu ermitteln, in 
regelmäßigen Abständen die Positionssensorik ausgewertet.
Da ich allerdings meine Regelschleife alle 10ms durchlaufen lasse, ist 
diese Methode dafür nicht fink genug gewesen. Daher dann die 
mathematische Näherung von PWM-Wert zu Geschwindigkeit.

Das funktioniert grade ganz ausgezeichnet. Ich habe dann noch einen 
Toleranzwert definiert, damit die Regelung ein Ende findet. Gelegentlich 
schwingt das System dann ein bisschen über und regelt noch mal kurz 
zurück. Alles wunderbar.

Jetzt muss ich nur noch das gleiche Prinzip auf die andere Achse 
anwenden.

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.