PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Positionsregelung mit DC-Motoren



clupus
26.01.2006, 19:21
Hallo allerseits,

ich habe da ein kleines Problem: Ich will eine Position mit einem Motor möglichst genau anfahren. Genau genommen möchte ich meinem µC nur sagen: "Bitte 2 Umdrehungen und 15° nach rechts drehen!" Zunächst dachte ich an Schrittmotoren, jedoch wurde mir hier im Forum davon stark abgeraten. (Eine Steuerung kann die exakte Position nicht festlegen; es kann zu Schrittverlust kommen, der nicht detektiert werden kann.) Deshalb die Idee mit den DC-Motoren.

Ziel: Übergabe einer gewünscheten relativen Sollpostion und einer Sollgeschwindigkeit an den µC. Dieser verarbeiete die Angaben dann so, dass er zunächst den Motor langsam anlaufen lässt, bis die gewünschte Geschwindigkeit erreicht ist. Rechtzeitig vor dem Überdrehen soll der Motor langsam abgebremst werden und dann an der gewünschten Position zum Stillstand kommen.

Dazu ist eine Regelunstechnik par excelence nötig. Das hab ich schon kapiert. Ich hab auch schon mal unter https://www.roboternetz.de/wissen/index.php/Regelungstechnik ein bisschen gelesen. Dort steht, dass eine Motorregelung eine Kaskadenregelung erfordert.

Was ist das/Wie funktioniert das? Bei der Herleitung der Regelungsschaltung werden einige Blockschaltbilder verwendet, die mir nix sagen (V.a. was wo genau zu finden ist und welche Bedeutung die Formeln in den Boxen haben). Könnte mir das mal bitte einer erklären?

Wie würde ein solcher Regler genau aussehen? Wie weit kann ich das mit OpAmps etc. realisieren, so dass mein µC frei für andere Aufgaben bleibt?

MfG
Christian

PS: Ganz ehrlich: Ich hab nicht viel Ahnung, was Regelungstechnik angeht. Insbesondere mit der Mathematik dahinter stehe ich noch etwas auf Kriegsfuß. Das Grundprinzip einer Regelung (Sensorik -> Regelung -> Motorik) hab ich aber dennoch - denke ich - gefressen.

bad-joker
26.01.2006, 20:21
Genaugenommen must du nicht unbedingt eine Kaskadenregelung benutzen. Dies ist aber dennoch eine recht gute Möglichkeit dein Problem zu lösen. Bei einer Kaskadenregelung hast du immer mehrere Kreise. Die innern müssen immer schneller sein. Dann sieht der aüßere Kreis den Inneren gar nicht als Regelkreis, sondern als quasi stationären Block.
Kaskadenregler findest du eigentlich in jedem Fachbuch. Du kannst dir eventuell mal "Elektrische Antriebe - Regelung von Antriebssystemen" von "Dirk Schröder" anschauen. Von dem gibts mehrer Bücher. Wird eigentlich alles von Anfang an beschrieben. Das Buch ist allerdings recht teuer, vielleicht besser doch mal vorerst ausleihen.
Grüsse
Thomas

ceekay
26.01.2006, 20:44
(Eine Steuerung kann die exakte Position nicht festlegen; es kann zu Schrittverlust kommen, der nicht detektiert werden kann.)

Um eine genaue Position anzufahren würde ich einen Schrittmotor nehmen.
Um Schrittverlust auszuschließen kannst du einfach mittels Inkrementalgeber "Ist" und "Sollwert" vergleichen. Bei Schrittverlust regelst du einfach nach.

gruß ceekay

clupus
26.01.2006, 21:09
Ich hab das Problem, dass ich zwar ein paar Schrittmotoren besitze (von Pollin), jedoch kenne ich keine technischen Daten, außer denen, die ich direkt Messen kann und der Spannung.

Ich weiß daher nicht, was der Motor wohl unter Last an max. Schrittfrequenz verträgt. Das war auch ein Grund für die DCs. Ich kann die Stepper natürlich auch mit sagen wir mal 10-50 Hz laufen lassen, aber da sind die ja langsam ohne Ende.
Das einzige, was ich mir Vorstellen könnte: Die DCs machen mit der Regelung das Grobe, wenn der Abstand zum Ziel einen gewissen Wert unterschreitet, hält der DC an und der Stepper übernimmt eine genaue Positionierung. Scheint mir aber doch recht aufwendig.

MfG
Christian

bad-joker
26.01.2006, 21:26
Also wenn du DCs benutzt brauchst du Encoder für die Positionsregelung. Damit kannst du sehr genau regeln. Würd da auf keinen Fall noch vorne nen Stepper dran schalten. DC Motoren und Encoder werden eventuell noch durch einen Tacho unterstützt damit man noch schneller und genauer positioniern kann, auch bei sehr kleinen Geschwindigkeiten.
Fast immer reicht aber schon ein Encoder und ein einfacher PD-Regler.
Thomas

Manf
26.01.2006, 21:45
Die Aufgabenstellung kann sehr einfach gelöst werden wenn ein ausreichendes Moment zur Verfügung steht, oder wenn Fehler erkannt und korrigiert werden kann. Bei einem unüberwindlichen Hindernis muss dann sicher eine Fehlermeldung ausgegeben werden.

Je mehr von der Aufgabenstellung unklar bleibt desto aufwändiger wird die Lösung.

Manfred

clupus
27.01.2006, 15:54
Da ich kein Oszi hab, kann ich den Motor nicht messen. Ich will aber eine maximale Geschwindigkeit erreichen. Wenn ich jetzt prüfen will, ob Schritte verloren gehen, muss ich z.T. extrem teure ICs (mit Fets) einsetzen. (vgl. Thread Keine Schritte verlieren (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=13281))

Wenn ein zu großes Drehmoment gefordert wird, sollte zumindest dem IC/µC das gemeldet werden/auffallen.

MfG
Christian

sigo
07.02.2006, 21:50
Eine Möglichkeit wäre, mittels Lichtschranke, Halllsensor oder anderweitigem "Schaltnocken" 1x pro Umdrehung einen Indeximpuls zu erzeugen. Dann kannst Du zumindest feststellen, dass Schritte verloren wurden (du weiß ja wieviele Schritte der Motor machen soll, und erwartest bei einem bestimmten Zählerstand den Index. Du könntest dann auch 1x pro U feststellen, wieviele Schritte du verloren hast, soviele eben, bis der Index dann doch kommt --> oder eben Abbruch.

Wenn der Motor immer ähnliche Aufgaben übernimmt, weißt du so wenigstens, dass es passt, und merkst, wenn was nicht passt. Dann könnte man in eine Fehlerbehandlung gehen oder ggf. das Tempo /die Beschleunigung reduzieren..

Just a thought

Sigo

clupus
03.05.2006, 19:23
Hallo nochmal,

ich habe jetzt mich mal ein bisschen in die Regelungstechnik/Kybernetik eingelesen. Es reicht zwar noch nicht für ein Studium, aber ich denke, ich habe die Grundlagen verstanden.

Ich hab mir nun folgendes überlegt/festgelegt:
Ziel ist es, 3 Motoren synchron zu betreiben. Das soll nicht heißen, dass alle immer in gleicher Rintung und gleicher Geschwindigkeit laufen sollen. Vielmehr geht es, wie in dem oben genannten Artikel angegeben, um die Bewegung eines Kreuztisches/eines Fräs-Kopfes. Zur Aufnahme der "Schritte" möchte ich eine PC-Maus umbauen. (Die enthält schon die ganze Elektronik zum Detektieren und speichert den Wert praktischerweise auch noch ab) Damit muss/kann auch die gesamte Regelung digital ablaufen. Am Ende soll per PWM der Motor entsprechend dem nötigen Moment ein-/ausgeschalten werden.

Ablaufen soll das in etwa so: Ich setze in meinem µC einen gewissen Wert für die Soll-Position (in Koordinaten) [xs,ys,zs]. Die Ist-Position ist in anderen Variablen abgelegt [xi,yi,zi]. Zusätzlich wird in einer Variable die gewünschte Verfahrgeschwindigkeit angegeben [v]. Dann wird zunächst die Geschwindigkeit proportional in einzelne Komponenten zerlegt [vx,vy,vz]. Das sind also die max. Geschwindigkeiten. Wärend der Bewegung werden xi,yi und zi regelmäßig aktualisiert.

Soweit zur Vorbereitung. Jetzt müssen die Motoren gestartet werden. Hier hab ich schon das erste Problem. Gehen wir mal davon aus, dass der Kopf um 30 Einheiten nach links (x-Richtung) und 40 nach hinten (y-Richtung) bewegt werden soll. Die max. Geschwindigkeit soll 5 Einheiten / Zeiteinheit sein. Das bedeutet: vx=3 und vy=4, da 3*3 + 4*4 = 5*5 (Satz des Pythagoras). Unter der Voraussetzung (momentan), dass beide Motoren etwa die selbe Masse zu beschleunigen haben, muss ein Motor deutlich stärker beschleunigen (y), er muss aber seine (verzögerte) Geschwindigkeit proportional zur (verzögerten) x-Geschwindigkeit halten. Wie kann man das erreichen? Dass also nicht nach einer gewissen Zeit beide Motoren bei z.B. v = 3 ankommen und dass dann der y-Motor noch um 1 weiter beschleunigt? Gleiches gilt auch für die Änderung der gewünschten Geschwindigkeit o.ä..

Ein anderes Problem sehe ich im Störverhalten: Wenn ein Motor an ein Hindernis stößt, der andere aber nicht, muss kräftig nachgeregelt werden. Sobald ein Motor baubedingt an seine Grenzen kommt (zu hohes Drehmoment), kann dieser möglicherweise die nötige Geschwindigleit von vy=4 nicht mehr einhalten und wird mit voller Betriebsspannung nur noch 3,5 liefern. Dann muss natürlich auch der x-Motor entsprechend seine Geschwindigkeit drosseln. Wodurch wird das erreicht? Ich weiß, das ist ein ähnliches Problem wie oben. Ggf. lösen sich beide Probleme gleichzeitig.

Innsbesondere ist davon auszugehen, dass nicht wie im oberen Teil angenommen, alle Motoren die gleiche Masse beschleunigen müssen. Vielmehr sind für jeden Motor andere Massen und Reibungswerte gegeben.

Gibt's zu den Problemen irgend welche Tipps?

Noch ein paar (hoffentlich banale) Fragen:
Ich habe schon gehört, dass ein Motor entweder als T1- oder als T2-Glied aufgefasst werden kann. Bei Berücksichtigung der Induktivität ist es halt T2.
Inwieweit ist die Betrachtung als T2 sinnvoll? Ist da die Genauigkeit ausreichend mit T1?
Wenn T2, welche Werte sind dann für T1 und T2 einzusetzen? Ich meine, welche Motorparameter. Für T1 hab ich mir die Sache selber hergeleitet mit den Motorparametern als Variablen, bei Bedarf kann ich es posten (muss es aber mit LaTeX schreiben, sonst ist die Verwirrung komplett und ich hab grad keine Lust).

Hier noch ein Post von bad-joker:

Also wenn du DCs benutzt brauchst du Encoder für die Positionsregelung. Damit kannst du sehr genau regeln. Würd da auf keinen Fall noch vorne nen Stepper dran schalten. DC Motoren und Encoder werden eventuell noch durch einen Tacho unterstützt damit man noch schneller und genauer positioniern kann, auch bei sehr kleinen Geschwindigkeiten.
Fast immer reicht aber schon ein Encoder und ein einfacher PD-Regler.
Thomas
Was meinst du mit Encoder und Tacho? Ich weiß nicht, was das ist. ( O:) Sorry) Sind das sowas wie Inkrementalgeber? Also das was ich mit meiner Maus machen will?

Ich hoffe, ich überfordere euch hier mal nicht.

Mfg
Christian

03.05.2006, 20:16
Hi Christian, ein Encoder ist ein anderes Wort für Inkrementalgeber. Also eine Lochscheibe, wie in der Maus (oder eben feiner) welche von 2 45° versetzten Lichtschranken ausgewertet wird. Es gibt auch noch andere Encoder, sogenannte Resolver, welche mittels Spulen und Magnetfeld 2 Phasenverschobene Sinus-Signale ausgeben. Die sind hier aber nicht gemeint.

Für harmonische Bewegungen ala CNC muss man wie du schon selbst feststellst, die Achsen auch in der Lage zueinander regeln auch auch abhängig von einander.

Für einfachere Anwendungen ist es aber auch hinreichend, die Bahnen unabhängig zu regeln und nur im Falle, dass eine Achse nicht nachkommt (sog. Schleppfehler) alle Achsen sofort zu stoppen.

Für letztere Variante bietet sich z.B. der LM629 Positionsregler an. Dann hat man selbst sehr wenig zu tun.

Der LM629 hat bereits einen Quadatureingang für Inkrementalgeber und einen PWM Ausgang.
Man gibt dem Teil nun die Position; Geschwindigkeit und Beschleunigungsrampe ein (trapezförmiges Geschindigkeitsprofil), sowie die vorher die Regelparameter für den PID-Regler. Dann muss man nur noch einen Startbefehl geben und den Rest macht der Coprozessor von allein, und zwar quarzgenau (digitale Regelung). Wenn du 3 Achsen damit ausstattest und alle Achsen die richtigen Parameter bekommen (z.B. sodass die Geschindigkeiten udn Beschleunigungen zueinander passen können sie sehr synchrone Bewegungen ausführen.
Wenn du nun allen gleichzeitig den Startbefehl gibst, fahren sie alle ihre jeweilige Bewegung ab.

Wenn sie da sind, geben sie z.B. per Interrupt oder auch Flag bescheid, dass sie da sind. Im Fehlerfall gibts nen Interrupt, mit dem man dann z.B. bei allen 3 Achsen einen Nothalt einleiten kann..

Man kann auch während der Fahrt die Geschwindigkeit ändern, und so kurven realisieren. Mit Hilfe von Breakpoints (Interrupt bei Erreichen einer Wegmarke) kann man so vektoren realisieren..

Mit ein paar Tricks, kann man sogar on the fly die Beschleunigung ändern und so Sinus²-Rampen fahren..ist nicht vorgesehen, geht aber.

Vorteil dieser Lösung ist, dass man auch ohne detaillierte Programmier- und Regelungstechnikkentnisse zu einem recht guten Ergebnis kommt.
Dazu brauchst Du DC-Motoren mit INkrementalgebern, je nach Genauigkeitsforderung ca. 100-500 Striche. Diese gibts z.B. von HP.

Übrigens sind in HP Deskjet 5xx Druckern (und wohl auch in den meisten anderen Druckern) recht starke DC-Motoren mit Inkrementalgeber (!!) verbaut..

Ach ja, das Teil ist von National Semiconductor.
Ein vergleichbares Teil gibts auch von HP, hier heißt er HCTL-1000.
Einen Tacho brauchst du bei dieser Lösung nicht, der LM629 regelt bei einem hochauflösenden Encoder auch so sehr gut.

Haken:
Einer kostet ca. 25-30EUR
spart dafür aber viele viele Stunden Software!

Sigo

clupus
03.05.2006, 22:33
Hallo Sigo,

mal angenommen, ich würde den LM629 verwenden. Weelche Parameter will der? Sind das so regelungstechnische Daten wie Zeitkonstanten, oder sind das direkte physikalische Eigenschaften?

Mein Problem ist halt, dass ich zum einen kaum Messmöglichkeiten habe (bei mir beschränkt sich der Apperatepark auf 1 Multimeter, ein Netzteil und vllt. noch ein paar selbst gebaute Schaltungen wie Logik-Tester). Daher dachte ich eher an selber programmieren. (Erklärung: Vor Verwendung wird bei jedem Einschalten eine Initalisierung durchgeführt. Dabei wird "einfach" der Motor an einen Anschlag gebracht (Taster!), von dort mit voller Beschleunigung losgelassen (oder eben auch mit Gefühl) und der Streckenverlauf aufgezeichnet. Dadurch sollte es möglich sein, ggf. durch mehrmaliges Messen, die Parameter herauszufinden.) Wenn ich nämlich die Parameterermittlung selber programmieren muss, wäre das, so denke ich, auch nicht mehr so gigantisch viel mehr, den ompletten PID zu realisieren.

Du sagst, man würde ein Trapez-Profil erhalten. Ist das so in der Regelung eingebaut? Das sollte doch auch "per Hand" machbar sein, oder? Unter der Voraussetzung, der Regler ist abgestimmt, versteht sich.

Wie gut werden Differenzen in den Geschwindigkeiten zueinander ausgeregelt? Wenn also ein Chip nicht genug Power rausholen kann. (Da gibt's so ne schöne Gleichung, die besagt, dass die Drehzahl mit zunehmendem Lastmoment sinkt) Wie regeln die anderen runter?

Noch ne kurze Frage am Rande: Ich will den Motor ja mit PWM betreiben. Nun ist das blöd, wenn ich jedem Motor einen extra Atmel vor die Nase setzen muss, damit ich Hardware-PWM nutzen kann. Tut's hier auch Software-PWM? Welche (Abtast-) Frequenz sollte ich mindestens anstreben?

MfG
Christian

sigo
06.05.2006, 22:06
Hi, letztlich sind das die PID Regelparameter, die sich aus der Abtastzeit von ca. 341µs und den Motordaten ergeben.

Aber das ist alles nicht so problematisch, wenn man nach der guten alten Faustformel vorgeht:

Erstmal den Motor anschalten und kp solange erhöhen, bis der Motor anfängt zu schwingen. Dann gehst du mit Ki aufs doppelte und mit kd aufs 5-10-fache. Dann wird der Motor erstmal recht ordentlich laufen.
Wenn die Regelung zu "aggressiv ist" geh mit kd halt zurück und ggf. auch mit kp..
Damit der Integrator nicht überschießt, kann man noch ein Integrationslimit definieren.

Ja, das Trapezprofil ist vorgegeben, der Baustein enthält einen Rampengenertator, d.h konstante Beschleunigung bis zur max. Drehzahl, dann konstante Geschwindigkeit. DIe Brensrampe wir dann zum passenen Zeitpunkt eingeleitet, sodass es eine Punktlandung gibt...

Wir ich bereits schrieb, kann man den Regler auch während der Fahrt mit anderen Geschwingkeiten versorgen. Hierzu kann man entweder das Positionsregister während der Fahrt auslesen oder man setzt einen Breakpoint (ähnlich Timer Intterrupt) der dann bei Erreichen einer Wegmarke einen Interrupt auslöst. Wenn man zuvor schon die nächstr Geschwindigkeit und ggf. auch Position übertragen hat, kann man dann in der ISR einfach das nächste Update Kommando geben und diese Werte weden on the fly übernommen..

Man kann auch die Beschleunigung ändern. Aber das ist nicht vorgesehen, geht aber. Hierzu muss man allerdings tricksen.

Jede Achse regelt erstmal für sich. D.h. solange die Regelreserve vorhanden ist, wird die PWM erhöht und die Position wird auf den Sollwert geregelt (den der Rampengenerator für die Zeit vorgibt), das kann der LM629 ziemlich genau und gut (kurze Abtastintervalle usw.).
Für den Fall, dass der Regler es nicht mehr packt, kann man vorher einen Schleppgehler definieren. Wenn dieser überschritten wird, gibts einen Interrupt. Man kann dann mit dem Controller entscheiden, was man macht, also alle Achsen hart stoppen, auslauen lassne oder so..

Der Sinn der Coprozessoren ist es ja, dass man den µController voll entlastet. Der muss nur noch die Parameter eingeben und dann per ISR oder Polling die Achscontroller überwachen. Da kann 1 ATMEL locker mehere Achsen betreuen. (Der LM629 erzeugt die PWM mit ca. 15kHz in der 6MHz Version und das Vorzeichen selbst, da hat der Controller nichts mit zu tun.)

Der LM629 benötigt allersings parallele Datenleitungen, also 8 bit für die Daten. Dann einen Pin, der sagt, ob eine Adresse oder Daten kommen (ALE) und eine Chip-Sellect-Leitung, die den jeweiligen Controller auswählt, und die Interruptleitung, die man am besten jedem Chip einzeln spendiert (dank der neuen AVR Controller kann man ja damit asen, zur Not kann man auch alle zusammen schalten und muss dann alle Chips abklappern, um zu erkennern wers war.)

Macht:
8 Datenleitung
1 ALE
1 CS pro Achse
1 Interrupt pro Achse

Sind bei 3 Achsen: 15 Pins
Also ne Menge.


Wenn du die Regelung selbst proggen willst, solltest du wahrscheinlich je Achse 1 AVR nehmen, denn der hat reichlich zu tun, zumindest, wenn er Sample-Times wie der LM629 erreichen will. Das wird mit dem AVR nicht für 3 Achsen gehn.
Auf der andere Seite, da ja die µC heut nix mehr kosten und alles an Board haben, spricht auch nichts dagegen, für jede Achse 1 zu nehmen.
Der LM629 stammt aus Zeiten, da 8051 (original) noch Maß der Dinge waren, die nicht so schnell rechnen konnten, da war so ein 16-Bit-Coprozessor schon praktisch.

Mit dem LM629 sparst du aber mehr als reichlich Entwicklungsstunden.

Ich hab den LM629 mal 1989 eingesetzt, mit einem 500 Strich Inkrementalgeber. Der hat 200W (Peak 800W) Servoantriebe sehr gut geregelt, unterwegs auf wenige Inkremente Abweichung, dann mit Punktlandung auf 2/100mm.

Eine echte 4Quadranten-Servoregelung ist was anderes als nur einfach losfahren. Hängt halt von der Anwendung ab.

Gruß Sigo

clupus
07.05.2006, 12:02
Hallo,

@sigo:
Ich hab mit dem LM 629 nämlich folgendes Problem:
Bei Reichelt finde ich den Chip ehrlich gesagt nicht. Bei Conrad ist die Suchroutine mal wieder recht mies und er findet mir so knapp 200 (?) Einträge. Ich hab zwar noch nicht alle durchgeschaut, aber ich hab auch da noch nix gefunden.
Kann es sein, dass der Chip nicht mehr ohne Weiteres zu bekommen ist? Ggf. abgekündigt?

Noch eine Frage:
Die PID-Parameter, lassen die sich irgendwie mit den Motor-Konstanten (Leerlaufdrehzahl, Nennspannung, Induktivität der Spule, Betriebsspannung, Spulengleichstromwiderstand) rechnerisch bestimmen? Eigentlich müsste es doch möglich sein, eine Formal anzugeben, oder?

MfG
Christian

07.05.2006, 22:20
Hallo,

@sigo:
Ich hab mit dem LM 629 nämlich folgendes Problem:
Bei Reichelt finde ich den Chip ehrlich gesagt nicht. Bei Conrad ist die Suchroutine mal wieder recht mies und er findet mir so knapp 200 (?) Einträge. Ich hab zwar noch nicht alle durchgeschaut, aber ich hab auch da noch nix gefunden.
Kann es sein, dass der Chip nicht mehr ohne Weiteres zu bekommen ist? Ggf. abgekündigt?

Noch eine Frage:
Die PID-Parameter, lassen die sich irgendwie mit den Motor-Konstanten (Leerlaufdrehzahl, Nennspannung, Induktivität der Spule, Betriebsspannung, Spulengleichstromwiderstand) rechnerisch bestimmen? Eigentlich müsste es doch möglich sein, eine Formal anzugeben, oder?

MfG
Christian

Bezugsquelle:
Also, den wirst du bei Corad und Co nicht finden, zu speziell.
Ich hab vor ein paar Tagen mal auf der Seite von National Semiconductor geschaut und LM629 als Suchbegriff eingegeben, da gibts eine Seite, auf der man auch Muster direkt bei National ordern kann oder über einen Distribute. Man muss ihn aber bezahlen ($21 oder $25 oder so). Du wirst das schon finden...

Die Möglichkeit der Berechnung der Daten gibts es bestimmt, die steht wahrscheinlich auch im Datenblatt (www.alldatasheet.com) aber ich habs ehrlich gesagt vergessen. Wüsste auch nicht mehr ohne Nachlesen, wie es geht..

Letztlich wird es da aber stehen, oder in Application Note..auf jeden Fall steht da aber die Formel des PID-Reglers drin mit Abtastzeiten usw..
Wenn du im Regelungstechnik Stoff noch drin steckst, sollte es kein Problem sein. Sonst eben einfach nach Faustformel und ein wenig Probieren..

Gruß Sigo