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

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.