Schrittmotor Beschleunigungsrampe etwas anders

OP (Firma: Brainit GmbH) #3026160
Lesenswert?

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...
(Firma: matzetronics) #3026200
Lesenswert?

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.
Gast #3026210
Lesenswert?

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.
OP (Firma: Brainit GmbH) #3026211
Lesenswert?

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...
#3026468
Lesenswert?

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.
#3026491
Lesenswert?

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...
Gast #3026497
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren