Testaufbau für Positionsregelung von DC-Getriebemotoren
Ich würde mir gerne mal eine taugliche Elektronik zur präzisen Positionsregelung von DC-Motoren aufbauen. Um damit erstmal ein wenig herumtesten zu können, habe ich mir einen kleinen Testaufbau gebastelt:
Bild hier
Bild hier
Das Ganze besteht also hauptsächlich aus einem Atmega32, den ich eigentlich häufiger mal benutze, einem L6205 als H-Brücke, einem AS5048A Magnetencoder (SPI-Schnittstelle, 14 Bit Auflösung), einem passenden diametral magnetisierten Neodym-Scheibenmagneten, einem RB35-Getriebemotor von Pollin und einem umgebauten ATX-Netzteil als Spannungsversorgung (5V Logik, 12V für den Motor). Kommunikation mit dem PC erfolgt über einen USB-UART-Wandler.
In der Software auf dem Controller hab ich im Prinzip einen PID-Regler realisiert, den ich allerdings wegen diversen Nichtlinearitäten im System anpassen musste. Durch die Versorgungsspannung ist die maximale Geschwindigkeit des Motors nämlich nach oben begrenzt. Das führt dazu, dass die PWM bei einer sprungförmigen Änderung des Sollwerts anfangs voll an den Anschlag geht, bis der Motor so langsam in die Nähe der Sollposition gekommen ist. Leider hat der Integratoranteil bis dahin meist schon so viel aufintegriert, dass die Variable übergelaufen ist. Das ließ sich lösen, indem der Integrator immer dann abgeschaltet wird, wenn die PWM auf Maximum steht. Ein anderes Problem ist die Anlaufspannung des Motors, unter welcher er sich gar nicht bewegt. Das lässt sich damit lösen, dass man auf die Stellgröße einen Versatz raufrechnet, sodass die Motorspannung immer irgendwo in der Nähe der Anlaufspannung bleibt. Ansonsten habe ich den Differentialanteil begrenzt, da so der Überschwinger ein wenig kleiner wird. Die Istwerte vom Sensor hab ich mittels einer laufenden gewichteten Mittelwertbildung geglättet.
Für das Senden der Sollwerte und das Empfangen und Darstellen der Istwerte habe ich mir ein kleines Programm in Labview erstellt, wo ich das Ganze ganz gut live verfolgen kann. Übertragen werden die Werte als Hexadezimalstring. Hier ist dazu mal ein Bild von einer Sprungantwort (ein Zeitschritt=4ms, ein Schritt auf der Y-Achse entspricht 0,022°):
Bild hier
Blau: Sollwert
Weiß: Istwert
Rot: Istgeschwindigkeit
Grün: Istbeschleunigung
Dabei sieht man leider auch das schwierigste ungelöste Problem, mit dem ich zu kämpfen habe: Das Getriebespiel. Die Sprungantwort sieht ja an sich richtig hübsch aus, allerdings sieht man danach, wie der Regler mit dem Getriebespiel kämpft und um die Sollposition wackelt. Lustigerweise wird es besser, wenn man den Abtrieb mit den Fingern festhält, denn dann kann es ja nicht mehr frei wackeln :D
Ansonsten ist zukünftig noch geplant, eine Vorsteuerung einzubauen, um die Dynamik noch ein wenig zu verbessern. So eine Vorsteuerung würde vorher berechnen, welche Spannung auf den Motor gegeben werden müsste, um die Sollbahn ohne Regelung abzufahren. Der Regler braucht sich dann nur noch um die Abweichungen zu kümmern. Allerdings muss man dafür die Zeitkonstanten des Motors möglichst genau bestimmen. Eine Stromregelung würde ich eigentlich auch noch gerne einbauen, bin dazu bisher aber noch nicht gekommen. Ansonsten kann man sicherlich auch die Kommunikation mit dem Controller ausbauen, zB. mit Addressierung, einstellen der Reglerparameter über den Bus und einiges mehr.
Ansonsten gibt es ja auch die Möglichkeit, den Motor aktiv zu bremsen, indem man beide Halbbrücken gleich schaltet. Ich könnte wetten, dass sich das gegen das Getriebespiel einsetzen ließe, allerdings weiß ich noch nicht so recht, wie.
Liste der Anhänge anzeigen (Anzahl: 1)
@Klebwax: Danke für deine ausführliche Kritik ;)
Das mit der Spannungsbegrenzung hättest nicht nochmal erklären brauchen, das ist mir ja bereits klar.
Den Integratoranteil hab ich deswegen drin, damit statische Fehler ausgeregelt werden. Wenn der Motor also nicht ganz in der Nullposition stehen bleibt, wirkt der Integratoranteil so, dass er sich nach und nach dochn noch dorthin arbeitet. Ein reiner P-Anteil würde bei konstanter Last immer einen Versatz von der Sollposition übriglassen.
Das Diagramm ist wirklich noch ein wenig suboptimal, das muss ich nochmal ein wenig anpassen. Hier hätte ich noch ein Diagramm mir einer gröberen Aufteilung (zu meinst wahrscheinlich, dass sie im anderen Diagramm zu fein war):
Anhang 29846
Wegen der Mittelwertbildung muss ich nochmal nachgucken, ob die den Regler wirklich viel langsamer macht, auf jeden Fall arbeitet er dadurch aber wesentlich ruhiger. Vorher hat man richtig gehört, wie er das Messrauschen verstärkt. Ich denk auch mal, dass man trotz des Getriebespiels eine gute Genauigkeit bekommen kann, komt eben auch alles ein wenig auf das System an. Wenn man dann nachher eine konstante Last hat, die in eine Richtung wirkt, dürfte sich das Getriebespiel nicht mehr wirklich bemerkbar machen.
Die Vorsteuerung soll hauptsächlich den Nutzen haben, einen Schleppfehler während des Verfahrens zu minimieren. Ich werd mal testen, was der Regler zu einem trapezförmigen Geschwindigkeitsverlauf sagt, also ein Verfahren mit begrenzter Geschwindigkeit und begrenzter Beschleunigung. Hatte sowas auch schonmal woanders in Labview implementiert gehabt, muss das nur nochmal ein wenig anpassen.