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
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
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.
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.
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?
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?
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?
@ 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?
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.
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.
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?
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
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.
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!