PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Testaufbau für Positionsregelung von DC-Getriebemotoren



Geistesblitz
15.02.2015, 00:22
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:

http://i273.photobucket.com/albums/jj239/Klaufmann/th_100_1916_zpsde54ddb0.jpg (http://s273.photobucket.com/user/Klaufmann/media/100_1916_zpsde54ddb0.jpg.html)

http://i273.photobucket.com/albums/jj239/Klaufmann/th_100_1917_zps7a9506a3.jpg (http://s273.photobucket.com/user/Klaufmann/media/100_1917_zps7a9506a3.jpg.html)

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 (http://www.pollin.de/shop/dt/ODE1OTg2OTk-/Motoren/DC_Getriebemotoren/Gleichstrom_Getriebemotor_PGM_37DC12_77.html) 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°):

http://i273.photobucket.com/albums/jj239/Klaufmann/th_Sprungantwort2_zps75ea17f7.jpg (http://s273.photobucket.com/user/Klaufmann/media/Sprungantwort2_zps75ea17f7.jpg.html)

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.

Peter(TOO)
15.02.2015, 04:06
Hallo Geistesblitz,


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.
Das Überlaufen kann man leicht verhindern, indem man zuerst den Wert der Variablen testet und nur inkrementiert, wenn die einen gewissen Wert nicht überschreitet.

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.
Hier ist der Standard-Trick beim Anlauf einen kurzen Impuls auf den Motor zu geben. Der Motor bekommt z.B. für ein paar MS die volle Betriebsspannung, danach wird der Stell ausgegeben,



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.
Ist normal.



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
Das ist normal, mit dem Finger dämpfst du das System.
Eine mechanische Möglichkeit wäre es, auf die Abtriebsachse einen dickwandigen Gummischlauch zu schieben, welcher auf der Achse leicht klemmt und aussen festgehalten wird.


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.
Das ist dann ein zweiter P-Anteil, aber bezogen auf den Stellwert und nicht die Regelabweichung.


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.

Die Alternative ist ein adaptiver Regler.
Das Regelverhalten der Regelstrecke wird gemessen und der PID-Regler entsprechend konfiguriert. Das Ganze macht man dann dynamisch. Damit können Laständerungen kompensiert werden. Die Zeitkonstanten verändern sich bei einem Motor mit der Last.



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.
Kurzschliessen, dürfte den Motor etwas zu abrupt bremsen.

Das Problem sind die unterschiedlichen Totzeiten.
Bei gebremstem Abtrieb und einem Halt des Motors, kommt es darauf an, wie es weiter geht:
Dreht man in der selben Richtung weiter, bewegt sich der Abtrieb sofort.
Dreht man in die entgegensetzte Richtung, passiert am Abtrieb zuerst einmal nichts, bis sich der Motor soweit gedreht hat, dass das Spiel wieder aufgehoben ist.

Bei ungebremstem Abtrieb, bzw. mit Schwungmasse:
Wenn der Motor schon steht, dreht sich er Abtrieb noch weiter, bis das Spiel aufgehoben ist.
Dies kann man verhindern, indem man mit dem Motor bremst. Man hat dann aber immer noch das Problem, wenn man in die entgegengesetzte Richtung anläuft.

Dieses Problem ist auch die Hauptursache für das Wackeln.

MfG Peter(TOO)

Geistesblitz
15.02.2015, 11:49
Das Prinzip mit dem Abschalten des Integratoranteils ist eigentlich ein einfacher Anti-Windup-Effekt, den ich getestet hatte, nachdem ich mir ein paar Formen von Anti-Windup-Strukturen (http://www.isep.pw.edu.pl/ZakladNapedu/lab-ane/anti-windup.pdf) angesehen hatte. Da lässt sich wahrscheinlich auch noch ein wenig was verbessern.


Hier ist der Standard-Trick beim Anlauf einen kurzen Impuls auf den Motor zu geben. Der Motor bekommt z.B. für ein paar MS die volle Betriebsspannung, danach wird der Stell ausgegeben,

Hmm, wie wird das denn realisiert? Und die Drehzahl ist auch nicht genau linear abhängig zur Spannung, soweit ich messen konnte. Ich hab das so bemerkt, dass bei einer bestimmten Spannung der Motor sich anfängt zu drehen, wenn man dann mit der Spannung runtergeht dreht sich der Motor langsamer und bleibt dann irgendwann stehen, aber an dieser Stelle ist die Spannung auch nicht 0V. Man hätte also eine Losbrechspannung und eine etwas niedrigere Stopspannung, also so ein leichtes Hystereseverhalten.

Was mir auch aufgefallen ist: betreibe ich den Motor am Labornetzteil, fängt er schon bei 0,5V an sich ganz langsam zu drehen, betreibe ich ihn allerdings bei 12V mit einer PWM bis zu 40% dreht er sich immer noch nicht. Ich hab da irgendwie keine Erklärung für. Wahrscheinlich muss ich da mal mit dem Oszi ran.

Ich hoffe auf jeden Fall, später mit einer weitern Untersetzung über Zahnriemen das Spiel noch ein wenig vermindern zu können. Außerdem scheint ja eine gewisse Dämpfung für die Regelung sogar förderlich zu sein.

malthy
15.02.2015, 13:28
Wie ist denn Dein Regler überhaupt aufgebaut? Hast Du eine innere Drehzahlregelung oder ist der Stellwert der Positionsregelung direkt die Motor-PWM?

Peter(TOO)
15.02.2015, 15:02
Hmm, wie wird das denn realisiert?
Nun, die Regelung weiss ja, ob der Motor gerade steht oder nicht.
Steht der Motor gerade, gibt man kurz mehr Leistung auf den Motor, als für die geforderte Drehzahl nötig wäre.
Du musst den Drehzahlbereich in 3 Bereiche unterteilen:
1. minimal mögliche Drehzahl, darunter bewegt sich nichts.
2. Möglicher Bereich, welcher aber nicht selbst anläuft.
3. normaler Bereich, in welchem der Motor problemlos startet.

Im 1. Bereich geht nun mal nix, den kannst du vergessen.

Im 2. Bereich braucht der Motor Starthilfe. Also entweder startet man mit einer höheren Drehzahl und regelt dann runter oder man fügt en Hilfsimpuls hinzu. So ein Motor ist ja eigentlich ein träges Wesen. Man kann dem z.B. die volle Spannung verpassen und diese dann zurückregeln, wenn die Nenndrehzahl knapp erreicht ist. Man kann auch einfach den Impuls so berechnen, dass die Massenträgheit sicher überwunden wird.


Und die Drehzahl ist auch nicht genau linear abhängig zur Spannung, soweit ich messen konnte. Ich hab das so bemerkt, dass bei einer bestimmten Spannung der Motor sich anfängt zu drehen, wenn man dann mit der Spannung runtergeht dreht sich der Motor langsamer und bleibt dann irgendwann stehen, aber an dieser Stelle ist die Spannung auch nicht 0V. Man hätte also eine Losbrechspannung und eine etwas niedrigere Stopspannung, also so ein leichtes Hystereseverhalten.

Was mir auch aufgefallen ist: betreibe ich den Motor am Labornetzteil, fängt er schon bei 0,5V an sich ganz langsam zu drehen, betreibe ich ihn allerdings bei 12V mit einer PWM bis zu 40% dreht er sich immer noch nicht. Ich hab da irgendwie keine Erklärung für. Wahrscheinlich muss ich da mal mit dem Oszi ran.

Ist Alles physikalisch ganz normal.

Du hast Haftreibung und Gleitreibung. Die Haftreibung ist immer grösser als die Gleitreibung.
Im Stillstand muss du die Haftreibung überwinden, bis sich was dreht.
Wenn es dreht hast du nur noch die Gleitreibung, weshalb du mit der Motorleistung weiter runter gehen kannst, bis der Motor wieder steht.

Bei Gleitlagern ist der Unterschied grösser, als bei Kugellagern.
Theoretisch haben Kugellager sowieso nur Rollreibung, es sollte also keinen Unterschied geben. Praktisch gibt es dennoch einen, da z.B. anfangs Öl oder Fett verdrängt werden muss, welches sich wie ein Kein unter die Kugeln schiebt.

Und zu guter Letzt ist das Ganze noch sehr temperaturabhängig. Einerseits verändern Fett und Öle ihre Viskosität mit der Temperatur und andererseits ändert sich durch die Temperatur auch das Lagerspiel, was beides einen Einfluss auf die Reibung hat.

MfG Peter(TOO)

Geistesblitz
15.02.2015, 15:24
@Malthy: genau, der Stellwert geht direkt auf den Motor, ohne weitere Geschwindigkeitsregelung.

Der grobe Ablauf der Reglerschleife sieht so aus:
-Sollposition wird empfangen
-Istposition wird gemessen
-Istposition wird geglättet
-Abweichung wird berechnet (Differenz aus Soll- und Istwert) -> E
-Differenz aus Abweichung des letzten Rechenschritts und der aktuellen Abweichung wird berechnet -> dE
-ist dE betragsmäßig größer als ein bestimmter Wert, wird es auf diesen Wert beschränkt
-Integral wird berechnet (E wird auf E_int addiert, wenn PWM<1023) -> E_int
-Tastverhältnis = k_p*E + k_d*dE + k_i*E_int + Versatz
-je nachdem, ob Tastverhältnis positiv oder negativ ist, wird die H-Brücke auf Linkslauf oder Rechtslauf geschaltet
-Betrag von Tastverhältnis bilden und auf max. 1023 begrenzen (10-bit-PWM)
-Tastverhältnis an den PWM-Port übergeben
-Istwert an PC senden

Derzeit ist es leider so, dass der Regler im Interrupt der UART läuft, da ich nicht weiß, wie ich das Ganze sonst synchron zum Rechner halten soll. Eigentlich wäre es besser, wenn der Regler mit einem eigenen Timer läuft und den Rechner nach neuen Werten fragt anstatt umgekehrt. Was passiert dann aber, wenn der Rechner dann nix von sich hören lässt?

Ansonsten ist es sicher auch nicht verkehrt, eine kaskadierte Regelung aufzubauen (on innen nach außen Stromregler, Geschwindigkeitsregler und Positionsregler). Das soll auch ganz gut zu implementieren gehen, da man sich von innen nach außen vorarbeiten kann. Dann kann man jeden einzelnen Regler so einstellen, dass er das gewünschte Verhalten zeigt und er dann mit der zugehörigen Strecke als Blackbox behandelt werden kann.

malthy
15.02.2015, 15:56
Hi,


Derzeit ist es leider so, dass der Regler im Interrupt der UART läuft, da ich nicht weiß, wie ich das Ganze sonst synchron zum Rechner halten soll. Eigentlich wäre es besser, wenn der Regler mit einem eigenen Timer läuft und den Rechner nach neuen Werten fragt anstatt umgekehrt. Was passiert dann aber, wenn der Rechner dann nix von sich hören lässt?

Das verstehe ich nicht ganz. Wieso hältst Du nicht einfach in einer Variable die Position vor, auf die das System einregeln soll. Das System kümmert sich dann darum, dass es gegen äußere Störungen auf der Position bleibt. Neue Sollpositionen kannst Du dann asynchron, d. h. zu beliebigen Zeitpunkten an das System übergeben. Oder übersehe ich da etwas?


Ansonsten ist es sicher auch nicht verkehrt, eine kaskadierte Regelung aufzubauen (on innen nach außen Stromregler, Geschwindigkeitsregler und Positionsregler). Das soll auch ganz gut zu implementieren gehen, da man sich von innen nach außen vorarbeiten kann. Dann kann man jeden einzelnen Regler so einstellen, dass er das gewünschte Verhalten zeigt und er dann mit der zugehörigen Strecke als Blackbox behandelt werden kann.

Ich habe das alles ja nie systematisch gelernt. Bei meinen robolink Armen kamen Schrittmotoren zum Einsatz. Die kann man ja leicht open loop auf Drehzahl halten. Insofern habe ich das System so aufgebaut, dass innen quasi eine Drehzahlsteuerung (keine Regelung) war, die sich auch um Anfahrrampen u.ä. gekümmert hat. Die übergeordnete Positionsregelung hat dann als Stellwert die Drehzahl für den entprechenden DOF ausgegeben. Die Positionsregelung wurde dadurch sehr einfach, im Prinzip funktionierte schon ein reiner P-Regler ganz ordentlich (hier zu sehen (http://www.mtahlers.de/index.php/robotik/humanoider-torso/robolink-arme#teachin)). Natürlich kann man einen Schrittmotor nicht mit einem DC Motor vergleichen, aus der Erfahrung würde ich aber auf jeden Fall dazu neigen, zuerst eine Drehzahlregelung aufzubauen und dann die Positionsregelung obendrauf zu setzen.

Gruß
Malte

Peter(TOO)
15.02.2015, 16:04
Hallo,

[QUOTE=Geistesblitz;612287Derzeit ist es leider so, dass der Regler im Interrupt der UART läuft, da ich nicht weiß, wie ich das Ganze sonst synchron zum Rechner halten soll. Eigentlich wäre es besser, wenn der Regler mit einem eigenen Timer läuft und den Rechner nach neuen Werten fragt anstatt umgekehrt. Was passiert dann aber, wenn der Rechner dann nix von sich hören lässt?[/QUOTE]

Im UART-Interrupt nimmst du den Sollwert entgegen und legst den in einer globalen Variablen ab, zudem setzt du noch ein Flag.

Der Regler, eigentlich wie jetzt, läuft im Timerinterrupt.
Einzige Änderung ist, dass der Regler sich das Flag anschaut. Wenn es gesetzt ist, wird der neuen Sollwert übernommen und das Flag zurückgesetzt.

Der Regler kann dann noch ein Flag setzen, welches anzeigt, dass die Soll-Position erreicht wurde.
Mit einem weiteren Flag kannst du den Regler auch noch abschalten.

MfG Peter(TOO)

---------------------------- 17.2.2015 01:18 ----------------------------------------------

Eine Kleinigkeit habe ich übersehen:
Der Regler sollte in den Interrupt der PWM, evtl. kannst du per Software untersetzen, also nur bei jedem 10ten PWM-Zyklus einen neuen Stellwert berechnen. Hängt aber von den Zeitkonstanten ab (PWM, Motorträgheit).
Andernfalls kannst du Schwebungen bekommen, zwischen PWM- und Abtastfrequenz, wenn die beiden Frequenzen nahe beieinander liegen.

MfG Peter(TOO)

Klebwax
16.02.2015, 10:25
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.
Das liegt nicht an der Versorgungsspannung sondern ist prinzipiell so. Ich bin kein Regelungstechniker, also erkläre ich das mal verbal:

Die Sollposition soll ja möglichst schnell erreicht werden, also muß der Motor am Anfang so schnell laufen wie möglich. Und da gibst es Grenzen, wenn nicht beim Netzteil dann beim Motor selbst. In diesem Bereich sehe ich eigentlich nichts von Regelung, PWM 100%, mehr geht nicht. Abbremsen tut man so spät wie möglich, so gehts am schnellsten. Das ist der Punkt, wo dann überhaupt die Regelung einsetzt. Der wird von der Trägheit des Gesamtsystems abhängen, die du in deinem Aufbau jetzt noch gar nicht siehst. Und wenn die Sollposition erreicht ist, Vollbremsung.


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.

Also eigentlich (fast) immer. Wird das System eigentlich schlechter, wenn man ihn überhaupt wegläßt?


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.

Die eigentliche Stellgröße ist ja auch nicht die PWM sondern der Motorstrom. Und da der Motor eine Induktivität (eigentlich ein RL-Glied) ist, hängt der Strom etwas komplexer vom Dutycycle und auch von der PWM-Frequenz ab. Ohne jetzt eine Fourier-Analyse des PWM-Signals gemacht zu haben würde ich behaupten, daß bei kleinem Dutycycle die Energie in den hohen Frequenzen steckt, die wiederum schlecht durch die Induktivität wollen. Eine langsamere PWM Frequenz würde da Besserung bringen.


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.
Warum Mittelwert? Der Sensor ist doch digital, da klappert das letzte Bit, und er ist viel zu genau für das Getriebespiel. Wenn das z.B. so 1° bis 2° beträgt, bleiben etwa 8 Bit. Die letzten zwei oder vier Bit (von den 14 Bit) weglassen bringt das gleiche Ergebniss und ist einfacher. Außerdem verzögert die Mittelwertbildung, ein Tiefpass, die Istwertmessung und macht den Regler langsamer, erhöht also das Überschwingen. So ein Mittelwert würde nur etwas bringen, wenn die Istwertmessung ständig und um ein vielfaches schneller erfolgt, als der Stellwert geändert werden kann (also als die PWM Frequenz).


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°):


Schöne Auswertung. Was mich aber interessieren würde, ist die Stellgröße, der Dutycycle. Und die Horizontalauflösung ist eigentlich zu grob um das Arbeiten der Regelung zu erkennen. Die Sollposition ist eine Senkrechte, das liegt an der Vorgabe, klar. Aber die Istposition sieht auch fast wie eine Senkrechte aus, das kann eigentlich nicht sein (Beschleunigung gegen Unendlich). Die wirkliche Beschleunigung wird also durch die zu grobe Auflösung nicht angezeigt. Die anderen Kurven kann ich leider nicht wirklich erkennen.


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.

Der Regler arbeitet ja jetzt schon mit Höchstgeschwindigkeit, fast immer 100% PWM (oder 0% wenn nicht gerade das Getriebe wackelt). Was soll da noch dynamischer werden?


Eine Stromregelung würde ich eigentlich auch noch gerne einbauen, bin dazu bisher aber noch nicht gekommen

Die würde den Regler nur langsamer machen. Das macht höchstens Sinn, Überlastfälle zu beherschen.


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.

Das solltest du auf jeden Fall machen machen. Wahrscheinlich kannst du dann den D-Term zu Null machen.

Nur gegen das Spiel hilft das nicht. Selbst wenn du den Motor mechanisch blockierst, wackelt dein Abtrieb abhängig von der Last genau so weit, wie es das Spiel zuläßt. Ich wüßte auch nicht, wie man elektronisch das Spiel wegbekommt, außer der Motor schwingt ständig um den Sollwert.

MfG Klebwax

Geistesblitz
16.02.2015, 11:02
@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):
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.

movido
16.02.2015, 12:56
Das mechanische Spiel kannst Du elektronisch nicht kompensieren. Es ist immer wichtig, zu wissen, wieviel Spiel akzeptabel ist, und die Mechanik entsprechend zu kaufen/bauen. Wenn Dein Regler aufgrund des Spiels anfängt zu oszillieren, dann musst Du den Regler eben weniger empfindlich machen - passend zur Qualität des Getriebes. Mechanisch kannst Du eine Vorspannung oder Dämpfung erzeugen um das Spiel zumindest einseitig in den Griff zu kriegen, aber das äussert sich dann in höherem Stromverbrauch und reduzierter Leistung.

Geistesblitz
16.02.2015, 22:39
So, hab mal meine Anzeige ein wenig überarbeitet. Hatte nämlich vergessen, für Geschwindigkeit und Beschleunigung durch die Abtastzeit bzw. Abtastzeit² zu teilen. Musste allerdings wieder einen kleinen Filter zur Glättung (laufende Mittelwertbildung) einfügen, da man da sonst vor lauter Rauschen gar nix erkennen würde. Hab auch mal ein etwas weiteres Stück verfahren. Zwar sieht man hier vom Regler nicht viel, aber darüber sollte sich der Motor einigermaßen charakterisieren lassen.
29851

Peter(TOO)
17.02.2015, 00:09
Hallo,


29851

Hilf mal ein bisschen:
blau = Sollwert
weiss= Weg
grün =
braun=

MfG Peter(TOO)

i_make_it
17.02.2015, 05:42
Also ich würde den mechanischen Teil des Testaufbau modifizieren.
Und zwar so, das man recht schnell zwichen allen 3 Lastfälle wechseln kann.
Fall I (wie jetzt) ohne Last (winzig kleine Last)
Fall II rotationssymetrische Last (Massenträgheit beim Beschleunigen und Bremsen)
Fall III winkelstellungsabhängige Last (außer Mitte)

Also den AS 5048 koaxial setzen und der Motorwelle ein Kupplungsstück verpassen.
Dann einmal ein 0,5 oder 1Kg Kurzhantelgewicht zentrisch auf einer Achse befestigen und einmal mit einer Kurbel (eventuell 50mm off Axis) an einer Kurbellschwinge.
Ob ein weiteres Optimieren des Reglers ohne Last mit dem Getriebespiel als Störgröße Sinn macht wage ich zu bezweifeln.
Da ich Jahrelang CNC Antriebe selbst Hergestellt habe, kann ich nur Sagen wir hatten zwei Sensoren für die Winkelstellung.
Ein Resolver wurde direkt auf der Motorwelle befestigt und mit dem wurde die Regleranpassung für Fall I (ohne Last) vorgenommen. Und dann der eigentliche Enkoder am zu bewegenden Bauteil. In dieser Konfiguration wurde dann die Regleranpassung im konkreten Fall vorgenommen (inklusive Getriebe und sonstigem Spiel).

Klebwax
17.02.2015, 06:10
So, hab mal meine Anzeige ein wenig überarbeitet. Hatte nämlich vergessen, für Geschwindigkeit und Beschleunigung durch die Abtastzeit bzw. Abtastzeit² zu teilen.

Da die Abtastzeit und damit auch das Quadrat davon eine Konstante ist, sollte das doch nur den Maßstab der Kurve ändern.

MfG Klebwax

Geistesblitz
17.02.2015, 09:28
Ja klar, aber anfangs wurde doch gemeckert, dass man bei den Kurven nix erkennen könne, da die Werte so klein seien.


Blau: Sollwert
Weiß: Istwert
Rot: Istgeschwindigkeit
Grün: Istbeschleunigung

Aus dem Startpost. Dachte, das wäre noch in Erinnerung geblieben.

Das mit dem Umbau, um verschiedene Lastfälle betrachten zu können, wär natürlich auch noch nötig. Dazu müsste ich das allerdings ein wenig neu aufbauen, da für irgendwelche Gewichte gerade kein Platz ist.

Da sich an der Elektronik aber eigentlich nicht viel ändern wird, frag ich mich, ob es Sinn machen würde, die schonmal fest aufzubauen. Für den Controller lässt sich sicher auch was Kleineres nehmen, ein Atmega8 oder so. Ist dann eben nur die Frage, über was man das Board ansprechen mag. Ich finds so wie jetzt über UART aber eigentlich ganz gut. Ich bin da ja ein wenig angetan von Malthys im Motor integrierten Regler, würd ich nur ein wenig anders machen. Der Sensor sollte dort platziert werden können, wo man auch messen will. Gibt es ansonsten Tipps für H-Brücken, die klein und effizient sind, sodass sie mit wenig Kühlung auskommen? Die Motoren sind mit 2A stall current ausgeschrieben.

Peter(TOO)
17.02.2015, 10:27
Hallo Blitz,

Eine frage stellt sich mir noch.

Woher kommen die Frequenzen in der Geschwindigkeit und Beschleunigung genau?

1. Mechanisch, weil etwas nicht wirklich rund läuft. dann gäbe es einen Zusammenhang mit der Umdrehung der einzelnen Zahnräder. Die Frequenz müsste sich mit der Drehzahl entsprechend ändern.
2. Aus der Regelschaltung, dann wäre die Frequenz abhängig von einer der Regelzeiten und müsste sich nicht wirklich mit der Drehzahl ändern.

Aber aus einer Messung kann man das nicht ersehen.

MfG Peter(TOO)

malthy
17.02.2015, 10:43
Woher kommen die Frequenzen in der Geschwindigkeit und Beschleunigung genau?

Sieht ein wenig periodisch aus. Vielleicht läuft der Magnet über dem AS5048 nicht 100%ig rund.


Da sich an der Elektronik aber eigentlich nicht viel ändern wird, frag ich mich, ob es Sinn machen würde, die schonmal fest aufzubauen. Für den Controller lässt sich sicher auch was Kleineres nehmen, ein Atmega8 oder so. Ist dann eben nur die Frage, über was man das Board ansprechen mag. Ich finds so wie jetzt über UART aber eigentlich ganz gut.

Ein Bus für mehrere Teilnehmer wäre ja schon ganz praktisch, meistens will man ja vermutlich mehr als nur einen Antrieb einsetzen. Insofern ist UART nicht so gut geeignet. Ich habe bei mir den UART aber auch mit auf den Stecker gelegt, das macht das Debuggen und Parametrisieren viel einfacher.


Gibt es ansonsten Tipps für H-Brücken, die klein und effizient sind, sodass sie mit wenig Kühlung auskommen?

Fände ich auch nochmal interessant. Ich habe mich nur auf die schnelle umgesehen (insb. bei TI) und hatte tatsächlich den Eindruck, dass es genau in diesem mittleren Bereich (12V/2 A Dauer) garnicht so viele Brücken gibt, viele sind etwas zu klein. Ich habe jetzt einen DRV8801 verwendet, der ist definitiv zu klein (funktioniert aber gerade so an der Kante :-)). Hatte den halt noch in der Schublade. Da jetzt so einen Monster VNH2SP30 o.ä. auf die Platine zu tun, habe ich dann auch nicht eingesehen ...

Gruß
Malte

Geistesblitz
17.02.2015, 10:57
Ich hab ja derzeit den L6205 drauf, an sich funktioniert der auch ganz gut und den sollte es auch als SOIC geben. Da könnte man auch, um auf Nummer sicher zu gehen, beide enthaltenen Brücken parallel schalten und eine ausreichend große Kühlfläche vorsehen. Wo hast du eigentlich deine Boards fertigen lassen, Malthy?

Also so wirklich exzentrisch dürfte der Magnet eigentlich nicht laufen, hab den Adapter mit meiner CNC gefräst und der ist ziemlich gut geworden. Diese Welligkeit ist ja auch eher in der Geschwindigkeit und Beschleunigung zu erkennen, ich denk mal, dass das einfach die Unregelmäßigkeit der Eigenbewegung des Motors ist. Schließlich ist das der Bereich, in dem die PWM in der Begrenzung hängt, das kann also mit dem Regler gar nix zu tun haben. Ansonsten wäre möglich, dass der Sensor nicht ganz mittig sitzt (wobei der da recht tolerant sein soll) oder dass der Magnet doch ein wenig zu klein ist. Hatte beim Bestellen der Samples irgendwie übersehen, dass man auch Magnete gleich dazu ordern kann und dann mit einem Bekannten in einem Magnetshop mitbestellt, wo es diametral allerdings nur 4x1mm Scheibenmagneten gab. 6x2mm wären laut Datenblatt des AS5048 aber ideal.

Ich werd mal sehen, wie ich eine Rampe programmiert bekomm, sodass ich mit geringerer Geschwindigkeit und aktiver Regelung verfahren kann.

malthy
17.02.2015, 11:16
Ich hab ja derzeit den L6205 drauf, an sich funktioniert der auch ganz gut und den sollte es auch als SOIC geben.

Hast recht, den hab ich irgendwie übersehen, obwohl er recht populär ist. Der ist definitiv besser als mein kleiner DRV8801.


Ansonsten wäre möglich, dass der Sensor nicht ganz mittig sitzt (wobei der da recht tolerant sein soll) oder dass der Magnet doch ein wenig zu klein ist.

In der z-Achse (Abstand Magnet-Sensor) ist er sehr tolerant, in x und y war es glaube ich ein Radius von 250 µm um die Mitte in dem man bleiben sollte.


Wo hast du eigentlich deine Boards fertigen lassen, Malthy?

Platinen habe ich jetzt zum ersten Mal in China machen lassen, das war jetzt elecrow (http://www.elecrow.com/). Da gibt's auch noch einige Alternativen. Ist schon hart wie billig das mittlerweile ist ...

Gruß
Malte

Klebwax
17.02.2015, 11:26
Also so wirklich exzentrisch dürfte der Magnet eigentlich nicht laufen, hab den Adapter mit meiner CNC gefräst und der ist ziemlich gut geworden. Diese Welligkeit ist ja auch eher in der Geschwindigkeit und Beschleunigung zu erkennen, ich denk mal, dass das einfach die Unregelmäßigkeit der Eigenbewegung des Motors ist. Schließlich ist das der Bereich, in dem die PWM in der Begrenzung hängt, das kann also mit dem Regler gar nix zu tun haben.

Eine Exzentrizität würde sich eigentlich nur dann mehrfach äußern, wenn man mehr als eine Umdrehung macht. Und bei der Istwinkelkurve ist davon rein garnichts zu erkennen. Ich glaube auch nicht an Unregelmäßigkeiten im Motor: erstens ist das Trägheitsmoment des Ankers zu groß (außer dem Getriebe ist ja keine Last dran und das hat ja auch ein konstantes Trägheitsmoment) und zweitens müßte man soetwas auch in der Istwertkurve erkennen. Die ist aber wunderbar gerade, man sieht sogar die Auflösung des Winkelsensors. Ich vermute ein Problem in der Berechnung der Werte.

MfG Klebwax

Geistesblitz
17.02.2015, 11:57
Findest du? Die Geschwindigkeit pendelt ein wenig um 22000 Schritte/s, wenn man das zurückrechnet entspräche das ca. 80 RPM, was mit den Angaben von Pollin (76,1 RPM) eigentlich zu passen scheint. Und der Motor macht mehrere Umdrehungen, als Sollwert hatte ich (wie man im Diagramm auch erkennt) 100000 Schritte eingegeben, 16384 Schritte entsprächen dabei einer Umdrehung, macht also etwa 6,1 Umdrehungen. Dass man von den Geschwindigkeitsschwankungen im Verlauf der Istposition nicht viel sieht ist normal, da überwiegt ja der mittlere Anstieg und kleine Anstiegsabweichungen fallen da nicht so sehr ins Gewicht. Nach dem Differenzieren sieht man das da schon deutlicher. Wo siehst du eigentlich die Auflösung des Winkelsensors? Oder bezieht sich das auf ein Bild aus dem Startpost?

@Malthy: oha, das ist wirklich günstig. Muss ich mich langsam wirklich mit Eagle einarbeiten, oder gibts da bessere Alternativen? Ich hab da irgendwie immer Probleme, die passenden Komponenten bzw. Bibliotheken zu finden. Mich verwirren auch die Optionen ein bisschen... wenn da jetzt oben steht 10 pcs. und unten dann nochmal was von mehreren copies steht, wieviel bekommt man dann? Steig da irgendwie nicht durch...

Klebwax
17.02.2015, 12:45
Findest du? Die Geschwindigkeit pendelt ein wenig um 22000 Schritte/s, wenn man das zurückrechnet entspräche das ca. 80 RPM, was mit den Angaben von Pollin (76,1 RPM) eigentlich zu passen scheint. Und der Motor macht mehrere Umdrehungen, als Sollwert hatte ich (wie man im Diagramm auch erkennt) 100000 Schritte eingegeben, 16384 Schritte entsprächen dabei einer Umdrehung, macht also etwa 6,1 Umdrehungen.

Dann habe ich das Bild und wohl auch die Messung falsch eingeordnet. Ich bin von einer viertel Umdrehung o.ä. ausgegangen und habe die Treppe in der weißen Kurve als Auflösung des Winkelsensors interpretiert. Etwa so, wie ein Servo läuft.

Bei mehreren Umdrehungen könnten das natürlich auch mechanische Ungenauigkeiten oder unrunde Stellen im Getriebe sein. Bei manchen Getriebemotoren kann man das richtig hören.

MfG Klebwax

Geistesblitz
17.02.2015, 12:54
Nein, die Abstufungen kommen durch die Auflösung der Grafik. Die Kurve ist eben einen Pixel breit, ohne Anti-Aliasing oder sowas.

malthy
17.02.2015, 17:05
Hi,


Muss ich mich langsam wirklich mit Eagle einarbeiten, oder gibts da bessere Alternativen?

Das ist eine mühselige Diskussion ... Für Eagle spricht mMn nicht zuletzt die enorme Verbreitung. Ich hatte mir Eagle vor Jahren mal angesehen und bin auf Anhieb nicht so gut damit zurecht gekommen. Auf der Suche nach Alternativen hatte ich mir dann einfach mal Target3001 installiert und das ging mir von Anfang an besser von der Hand. Außerdem gefiel mir die Lizenzpolitik besser weil ich zu dem Zeitpunkt auch ein paar Sachen kommerziell damit machen wollte. Meinem Eindruck nach hat Target einen schlechteren Ruf als Eagle, was ich persönlich nicht unbedingt nachvollziehen kann. Ich habe kein Interesse an dieser albernen Eagle vs. Target Diskussion, mein Eindruck ist allerdings, dass die Target-Hasser oft mit Informationen von vor 10 Jahren argumentieren, viele der Vorwürfe sind meinem Eindruck nach nicht (mehr?) zutreffend. Ich würde auf jeden Fall mehrere Programme angucken und mal ein wenig damit rumspielen. Was sich am besten für Dich anfühlt nimmst Du halt ... :-)


Mich verwirren auch die Optionen ein bisschen... wenn da jetzt oben steht 10 pcs. und unten dann nochmal was von mehreren copies steht, wieviel bekommt man dann? Steig da irgendwie nicht durch...

Dabei geht's um's Panelizing, also darum dass Du Deine Platine mehrfach auf deren Verkaufseinheiten unterbringst. Das wird dann etwas teurer, wie da die Tarife sind habe ich auch nicht ganz verstanden, habe das nicht gebraucht. Im einfachsten Fall machst Du Dein Layout und bekommst das PCB dann in zehnfacher Ausführung für insgesamt $9.90 (bei 5*5 cm) plus Versand. Und wie gesagt, da gibt's weitere Anbieter die genauso billig sind, ich habe keinen Grund zu behaupten, elecrow sei besser als die ...

Gruß
Malte