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
Source Code gibts dazu auch, jetzt bei MicroChip unter AN_8017 https://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=en591185
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?
selbst auf Deutsch bekommt man das vorgekaut: http://forum.arduino.cc/index.php?topic=502493.0 Und moveTo() berücksichtigt doch Beschleunigungs- und Bremsrampen.
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.
HKAdler schrieb: > ich versuche es mit einem Beispiel zu erklären: > ... Vielleicht malst du mal ein Position(Zeit)-Diagramm ...
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!
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.