Hallo zusammen, ich krieg das nicht wirklich in mein Hirn... ich möchte einen Schrittmotor ansteuern, aber anders als gewöhnlich geht es mir nicht um absolute Positionierung, sondern nur um Drehzahlen. In unregelmäßigen Abständen wird eine Soll-Drehzahl vorgegeben (vor- oder rückwärts, aber das sollte am Prinzip nix ändern), und abhängig von der aktuellen Geschwindigkeit (welche umgekehrt proportional zur letzten Clock-Zykluszeit sein sollte) muss beschleunigt oder gebremst werden. Knifflig wird das ganze, wenn mitten in einer Beschleunigungsphase eine neue Soll-Drehzahl vorgegeben wird. Ich lese nun seit Stunden die AVR446 (Application note zu "Linear speed control of stepper motors") aber ich bin nicht in der Lage dies auf meine Bedürfnisse umzusetzen. Der wesentliche Teil scheint mir die Berechnung der Beschleunigungsrampe zu sein: c[n] = c[0] * (sqrt(n+1) - sqrt(n))(wobei c[n] der n-te Counter ist) Was ich nicht auf die Reihe kriege: wenn ich in so einer Rampe bin, und eine neue Soll-Drehzahl habe (der einfachheit halber mal noch höher als die letzte Soll-Drehzahl, auf welche gerade beschleunigt wird) dann müsste ich doch mitten in die Rampe mit einer neune Rampen-Berechnung einsteigen können, und im wesentlichen dieselben Werte für c[n] bekommen. Tu ich aber nicht.... grummel kann mir jemand einen Tipp geben, wie man das mathematisch ausdrücken kann? Es geht übrigens nicht darum, dass ich auf meinem uC keine sqrt() berechnen will, das ist eine andere Baustelle. Zuerst will ich die Theorie in meine Kopf kriegen...
Meinst du nicht, das ein PID Regler da günstiger ist? Wenn du gerade bei Atmel bist, schau doch mal AVR221 an.
Matthias Sch. schrieb: > Meinst du nicht, das ein PID Regler da günstiger ist? Wenn du gerade bei > Atmel bist, schau doch mal AVR221 an. Sorry, aber ich glaub grad nicht dass ein PID-Regler eine Beschleunigungsrampe ersetzen kann...
Michael Reinelt schrieb: > Sorry, aber ich glaub grad nicht dass ein PID-Regler eine > Beschleunigungsrampe ersetzen kann.. Du hast dich da schon ein bisschen rein verbohrt? Michael Reinelt schrieb: > In > unregelmäßigen Abständen wird eine Soll-Drehzahl vorgegeben (vor- oder > rückwärts, aber das sollte am Prinzip nix ändern), und abhängig von der > aktuellen Geschwindigkeit (welche umgekehrt proportional zur letzten > Clock-Zykluszeit sein sollte) muss beschleunigt oder gebremst werden. Das ist nämlich genau der Job, den so ein Regler macht. Stellgrösse ist deine Soll-Drehzahl und die Ist-Grösse ist die aktuelle Drehzahl.
Matthias Sch. schrieb: > Meinst du nicht, das ein PID Regler da günstiger ist? Es geht darum, eine Geschwindigkeitsrampe mit einer bestimmten Beschleunigung zu fahren und nicht um das möglichst schnelle Erreichen einer neuen Geschwindigkeit. Wie willst du das mit einem PID-Regler realisieren, zumal man dafür gar keinen Regler braucht, weil die Schrittmotorgeschwindigkeit direkt über die Schrittfrequenz gesteuert wird.
Matthias Sch. schrieb: > Du hast dich da schon ein bisschen rein verbohrt? Kann schon sein :-) Nichtsdestotrotz: Der Schrittmotor und seine "Umgebung" hat aufgrund der diverser Trägheitsmomente nun mal eine maximale Beschleunigung, über der er Schritte (und drehmoment) verliert. Diese Maximalbeschleunigung gibt eine Rampe vor, der man idealerweise folgen sollte. Da hilft kein PID-Regler...
Hast du schon mal einen Blick in das Grbl geworfen? https://github.com/grbl/grbl/blob/master/stepper.c Diese Holzhammermethode sieht zwar nicht so elegant aus, wie die Beschleunigungsgleichung, funktioniert aber mit beliebig zusammengesetzten Segmenten.
Wenn du nur Geschindigkeiten verstellst, dann brauchst du überhaupt keine Wurzel ziehen. Du beschleuigst oder bremst immer mit konstanter Beschleunigung. Dazu musst du nur bei jedem Interrupt einen konstanten Wert zum Geschwindigkeitswert dazuzählen(abziehen). Der Wert der Geschwindigkeit wird bei jedem Interrupt zum Wegwert dazugezählt. Der Wegwert bestimmt die Ansteuerung des Schrittmotors.
Wenn du einen neuen Wert kriegst wirfst du die alte Rampe weg und berechnest deine neue ab der von der alten Rampe erreichten Geschwindigkeit... Das sollte eigtl. ganz gut passen da deine Rampe ja darauf ausgelegt ist den Schrittmotor immer "kurz vor Schlupf" zu fahren...
Hallo, die Sache ist furchtbar trivial, man braucht weder Rampen noch irgendwas überhaupt berechnen. Ich führe eine Variable, die die aktuelle Drehzahl angibt, diese wird entsprechend an die Motorsteuerung ausgegeben, und eine Variable, die die Solldrehzahl angibt. Alle 10ms (Beispiel) wird die aktuelle mit der Solldrehzahl verglichen, und sind sie nicht gleich, so wird die aktuelle Drehzahl je nach Unterschied um einen bestimmten Betrag erhöht oder eniedrigt. Der Betrag bestimmt die Beschleunigung, wurde einmal berechnet und kann in mehreren Stufen eingestellt werden. Hat man also 200 U/min und erhöht auf 300, so wird also alle 10 ms die aktuelle Drehzahl um z.B. 2 erhöht (und der Motor entsprechend angesteuert), folglich läuft die aktuelle Drehzahl hoch mit 2 U/s pro 10 ms oder 200 U/s², bis die gewünschten 300 erreicht sind. Funktioniert so seit 20 Jahren problemlos, der Motor läuft auch weich hoch wenn man zum Start einfach eine Drehzahl eingibt. Nix mit Rampe berechnen oder Wurzelziehen oder noch komplizierteren Algorithmen. Natürlich müssen alle Werte den Bedürfnissen angepasst werden. Aus der Sichtweise eines Theoretikers ist das natürlich ein völlig indiskutables Verfahren, wer das fürs Studium braucht, gleich wieder vergessen. Gruss Reinhard
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.