Forum: Mikrocontroller und Digitale Elektronik Beschleunigung\Entschleunigung vom Schrittmotor


von HKAdler (Gast)


Lesenswert?

Hallo,
ich versuche mit einem Arduino Uno einen Schrittmotor anzusteuern.
Die Positionen werden von PC zum Arduino geschickt (serial 
communication) und der Motor soll zu diesen Positionen fahren.
Wenn der Motor die Richtung ändert, soll er entschleunigen.
Ich habe mit der Bibliothek "accelstepper"  aber die Entschleunigung 
geht nur mit vorgegebenen Positionen.
Kann jemand mir bei diesem Problem helfen?
Danke

von Wolfgang (Gast)


Lesenswert?

HKAdler schrieb:
> Ich habe mit der Bibliothek "accelstepper"  aber die Entschleunigung
> geht nur mit vorgegebenen Positionen.

???

Was auch immer du damit sagen willst, hier ein bisschen Lektüre:
AVR446: Linear speed control of stepper motor
http://ww1.microchip.com/downloads/en/AppNotes/doc8017.pdf

von Wolfgang (Gast)


Lesenswert?

Source Code gibts dazu auch, jetzt bei MicroChip unter AN_8017
https://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=en591185

von HKAdler (Gast)


Lesenswert?

Hallo Wolfgang,
ich versuche es mit einem Beispiel zu erklären:
der Motor ist in der Position 200 und soll in die Position 500 fahren.
Während der Fahrt in die Position 500 soll er in die Position 100 
fahren, dann muss der Motor entschleunigen, die Richtung ändern und in 
die Position 100 fahren.

Mit der Bibliothek "accelstepper" passiert folgendes:
Der Motor ist in der Position 200 fährt in die Position 500 und DANN 
fährt in die Position 100.

von Bernd K. (prof7bit)


Lesenswert?

Es gibt fix und fertige mehrachsige Software für den Arduino für genau 
den Zweck. Wenn der nichts anderes machen soll als per UART die 
Koordinaten zu empfangen und dann dort hinzufahren dann wäre das genau 
das was Du suchst. Such nach GRBL oder diverse Variationen davon.

Wenn Du was suchst das dieses Teilproblem zuverlässig löst ohne Dich für 
Tage oder Wochen auf Nebenkriegsschauplätzen der Schrittmotorsteuerung 
festzunageln und vom Hauptproblem abzulenken dann nimm das und fertig.

Wenn es nur zum Lernen ist dann kannst Du ja mal versuchen die 
Mathematik zu begreifen (je nach persönlicher mathematischer Intuition 
leicht oder schwierig) und selber was entwerfen und zu implementieren, 
Du wirst auf einige Schwierigkeiten stoßen mit denen Du nicht gerechnet 
hast und Kreativität an den Tag legen müssen um sie zu lösen, aber 
spätestens bei mehr als einem Motor die synchron beschleunigen sollen 
wär mir persönlich das zu stressig so tief unten bei Adam und Eva 
anzufangen für etwas das es fix und fertig kostenlos gibt.

von holger (Gast)


Lesenswert?

Bahnhof

von Theor (Gast)


Lesenswert?

Hm. Fangen wir mal mit den Formalien an, wenn Du Dich darauf einlassen 
willst.

Mit "Entschleunigen" meinst Du, da wir uns mit Technik beschäftigen, 
vermutlich "verzögern" oder etwas umgangssprachlicher: "bremsen"; d.h 
die Geschwindigkeit verringern. Richtig?

Ersetzt man das in Deinem folgenden Satz, wird mir das Problem leider 
nicht ganz eindeutig klar.

' Wenn der Motor die Richtung ändert, soll er bremsen.
Ich habe mit der Bibliothek "accelstepper" ... '

Was "hast" Du mit der Bibliothek? Da fehlt das Verb in dem Satz.

'...  aber das Bremsen geht nur mit vorgegebenen Positionen.'

Vermutlich gehst Du davon aus, dass der Motor durch die Steuerung nach 
Vorgabe einer Position, eigenständig zu eben dieser Position fährt und 
dazu aus dem Stillstand beschleunigt, dann evtl. aber nicht zwingend mit 
konstanter Geschwindigkeit fährt und dann wieder bremst und anhält.

Wenn ich Dich recht verstehe, erlaubt die Bibliothek ausschliesslich die 
Vorgabe einer Position.

Du willst nun, während der Motor läuft die Drehrichtung ändern, sonst 
würdest Du nicht nach "Bremsen" fragen.

Was Du nicht beschreibst, aber vermutlich das Problem verursacht, ist, 
dass die Steuerung anders als Du es willst, reagiert, falls er gerade 
läuft und Du eine Position vorgibst, die von der vorherigen 
kommandierten Position abweicht. Ist das richtig so?

Zu berücksichtigen wäre allerdings, dass bei einer Rotation jede 
beliebige andere Position in der selben Richtung liegt. Nur in (bis auf 
einen Fall) unterschiedlichen Entfernungen auf dem Umfang resp. 
unterschiedlichen Differenz-Winkeln.

Vermutlich erwartest Du, dass die Steuerung selbstständig abbremst und 
die Richtung ändert, falls die neue Position in der anderen Richtung in 
kürzerer Entfernung (in geringerer Winkelentfernung) liegt. Richtig?

Was sagt denn die Dokumentation der Bibliothek dazu?

von Theor (Gast)


Lesenswert?

OK. Du hast auf eine andere Frage das geantwortet was auch ich gefragt 
habe, aber schon während ich schrieb. :-)

Zunächst mal ist das Verhalten ja durchaus nicht sinnlos.
Nur ist sie nicht das, was Du wünschst.
Du wirst evtl. eine andere Bibliothek verwenden müssen, die aus der 
Fahrt abbremst und dann die Richtung ändert. Oder diese Funktionen 
selbst schreiben.

Nun gut. Aber was sagt denn nun die Dokumentation der Bibliothek dazu?

von Egon D. (Gast)


Lesenswert?

HKAdler schrieb:

> der Motor ist in der Position 200 und soll in die
> Position 500 fahren. Während der Fahrt in die
> Position 500 soll er in die Position 100 fahren, dann
> muss der Motor entschleunigen,

"entschleunigen" kenne ich nur von Leute, die über
"work-life-balance" philosophieren...

Der Techniker kennt positive und negative Beschleunigung.


> die Richtung ändern und in die Position 100 fahren.
>
> Mit der Bibliothek "accelstepper" passiert folgendes:
> Der Motor ist in der Position 200 fährt in die
> Position 500 und DANN fährt in die Position 100.

Sicher, wie auch sonst? Woher soll die Bibliothek wissen,
dass sie die schon übertragenen Bahnpunkte vergessen und
von der aktuellen Position aus eine ganz andere Bahn
fahren soll?

von Theor (Gast)


Lesenswert?

@ HKadler

Ein kurzer Überblick über die Dokumentation 
(https://www.airspayce.com/mikem/arduino/AccelStepper/classAccelStepper.html) 
vermittelt mir den Eindruck, dass, was Du wünschst, durchaus zu machen 
ist.

Ich werde keinen fertigen Code posten, der das Gewünschte macht.

Kann es sein, dass Du gewisse Aussagen dort nicht verstehst? Wenn ja, 
welche?
Oder stösst Du auf Auslassungen, Unklarheiten oder Widersprüche? Wenn 
ja, welche?
Oder ist das ein Problem mit Englisch als Fremdsprache?

von Johannes S. (Gast)


Lesenswert?

selbst auf Deutsch bekommt man das vorgekaut:
http://forum.arduino.cc/index.php?topic=502493.0
Und moveTo() berücksichtigt doch Beschleunigungs- und Bremsrampen.

von m.n. (Gast)


Lesenswert?

Wenn für eine neue Endposition ein Richtungswechsel notwendig ist, muß 
der Schrittmotor zunächst gestoppt werden und dann die neue Position 
vorgegeben werden.
Für einen Arduino Uno habe ich ein Beispielprogramm: 
http://mino-elektronik.de/progs/avr/step_m328/stepper_a4982.ino
Die Beschreibung dazu nebst verwendeter Schaltung kann man hier 
einsehen: http://mino-elektronik.de/Generator/takte_impulse.htm#bsp7

Als Beispiel ganz unten in 'main()':
Nach dem Befehl 'stoppe_stepper()' muß abgewartet werden, bis er steht: 
Befehl 'stepper_abwarten()'. Anschließend wird mit 
'stepper_soll_position(x)' das neue Ziel vorgegeben und abgewartet, bis 
es erreicht wurde.
Wenn man möchte, kann man diese Schritte in eine eigene Funktion packen, 
die die Aktionen nur dann ausführt, wenn eine Richtungsumkehr vorliegt. 
Alternativ kann man den Ablauf auch in die ISR einbauen.

von Egon D. (Gast)


Lesenswert?

m.n. schrieb:

> Wenn für eine neue Endposition ein Richtungswechsel
> notwendig ist,

Und wenn nicht?

Wenn der Motor schon in Bewegung ist, sind die Rand-
bedingungen für die Bahninterpolation ja andere, als
wenn er steht. Ich würde erwarten, dass die Bahn-
steuerung das berücksichtigt.

von Wolfgang (Gast)


Lesenswert?

HKAdler schrieb:
> ich versuche es mit einem Beispiel zu erklären:
> ...
Vielleicht malst du mal ein Position(Zeit)-Diagramm ...

von m.n. (Gast)


Lesenswert?

Egon D. schrieb:
>> Wenn für eine neue Endposition ein Richtungswechsel
>> notwendig ist,
>
> Und wenn nicht?

Dann muß man sehen, wo die neue Sollposition liegt. Ist diese weiter als 
der Bremsweg, kann man sie direkt vorgeben. Ist der Bremsweg weiter, muß 
zunächst auch gestoppt und dann zurückgefahren werden.
So schwer ist das doch nicht zu verstehen?

von georg (Gast)


Lesenswert?

HKAdler schrieb:
> Der Motor ist in der Position 200 fährt in die Position 500 und DANN
> fährt in die Position 100.

Das ist auch völlig richtig so, er arbeitet die Befehle ab. Mittendrin 
abzuwürgen ist eine ganz schlechte Idee. Ein Werkstück in Bearbeitung 
ist dann kaputt.

Da ist wohl die Steuerung intelligenter als der Bediener.

Georg

von Egon D. (Gast)


Lesenswert?

m.n. schrieb:

> Egon D. schrieb:
>>> Wenn für eine neue Endposition ein Richtungswechsel
>>> notwendig ist,
>>
>> Und wenn nicht?
>
> Dann muß man sehen, wo die neue Sollposition liegt. Ist
> diese weiter als der Bremsweg, kann man sie direkt
> vorgeben. Ist der Bremsweg weiter, muß zunächst auch
> gestoppt und dann zurückgefahren werden.
> So schwer ist das doch nicht zu verstehen?

Nun ja, stellt sich die Frage, wer hier wen nicht
versteht.

Der TO hat in seinem Beispiel, das ich für klar
verständlich halte, bemängelt, dass man einmal an die
Bibliotheksfunktion übergebene Bahnpunkte nicht mehr
ÄNDERN kann, selbst wenn sie noch lange nicht erreicht
wurden -- man kann lediglich weitere Bahnsegmente
HINZUFÜGEN, die dann DANACH abgefahren werden.
Bedeutet: Der inzwischen als unnütz erkannte Punkt
wird trotzdem erstmal angefahren, ehe der aktuell
als richtig erkannte Zielpunkt mittels eines neuen,
dann anschließenden Bahnsegmentes angesteuert wird.

Das hat mit dem, was Du beschrieben hast, nur am Rande
zu tun -- zumal man bei mehreren Achsen auch darüber
nachdenken könnte, einen eleganten Bogen zu fahren.

von Egon D. (Gast)


Lesenswert?

georg schrieb:

> Das ist auch völlig richtig so, er arbeitet die
> Befehle ab. Mittendrin abzuwürgen ist eine ganz
> schlechte Idee.

Genau! Deswegen hat interaktive Software auch nie
eine "Abbrechen"-Funktion, und bei konventionellen
Werkzeugmaschinen kann man nie den Vorschub aus-
kuppeln, wenn man merkt, dass man im Begriff ist,
etwas Falsches zu machen. Wer einen Fehler macht,
soll schließlich auch ordentlich dafür bezahlen!

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
Noch kein Account? Hier anmelden.