Schrittmotor-Beschleunigungsprofile für kurze Läufe

Ich habe ziemlich viel über Schrittmotoren und Beschleunigung gelesen. Ich musste viele verschiedene Strategien mit vielen Berechnungen durchwaten, darunter eine, die mehrere Kerzen erforderte, und "Ein reines Mädchen der Tugend", was zwar interessant war, aber unpraktisch schien (nicht genug Platz auf dem Arduino). Im Grunde kochen sie alle bis zu diesem: "Beschleunigen Sie mit einer Art Rampe, fahren Sie mit Geschwindigkeit und verlangsamen Sie dann bis zum Stillstand"

Alles gut. Beschleunigen bringt die Last in Bewegung, und sanftes Abbremsen bringt die Last dazu, an der (hoffentlich) richtigen Position anzuhalten.

Mein Problem ist folgendes. Alles, was ich bisher gelesen habe, scheint die Annahme zu haben, dass die zu reisende Entfernung ausreichen wird, um alle drei Reisephasen zu bewältigen. dh Accel, Coast at speed, Decel. Ich habe nicht viel Diskussion darüber gefunden, wie man mit Situationen auf sehr kurze Distanz umgeht.

Wenn Sie sich beispielsweise nur zwei Schritte bewegen, wird dies möglicherweise nicht genügend Abstand haben, um alle drei Phasen zu durchlaufen. Schritt – Schritt – fertig. Während dieses spezielle Beispiel einfach genug zu sein scheint, um es zu lösen, wie kann man am besten feststellen, ob eine Verzögerung erforderlich ist, und wenn ja, wann?

An welchem ​​Punkt bestimme ich, dass eine Art Verzögerungsprofil benötigt wird, um den Stepper dazu zu bringen, an der erforderlichen Position anzuhalten, ohne zu überschießen?


Also entschied ich mich nach einer ganzen Reihe weiterer Suchen, Lesen und Verwirren für die einfachste Lösung.

Ich bin bei einem Trapez-/Dreieckprofil geblieben. Im Wesentlichen habe ich die Entfernung bestimmt, die eine konstante Beschleunigungsrampe verwenden würde, um auf Geschwindigkeit zu kommen. Wenn die Beschleunigungsstrecke größer als die Hälfte der zurückzulegenden Gesamtstrecke war, beschleunige ich nur für die Hälfte der zurückzulegenden Gesamtstrecke und mache mir keine Sorgen, ob ich die Höchstgeschwindigkeit erreiche. Da ich mich für einen symmetrischen Ansatz entschieden habe, erledigte sich der Verzögerungsteil von selbst.

Die Gleichungen, die ich verwendet habe, sind im Wesentlichen die von Chuck, obwohl die Addition verschiedener Beschleunigungs- und Verzögerungsraten, die er verwendet, mich zum Nachdenken anregt.

Vielen, vielen Dank an alle, die dazu beigetragen haben.

Ein Bewegungsplaner - Bahnplaner löst alle Ihre Fragen.
Sie sprechen von Stepperschritten als diskret, denken Sie daran, dass Sie sie tatsächlich in unendlich kleine Schritte aufteilen können. Es ist vergleichbar mit einem "Schritt" auf Ihrem Fahrrad mit Pedalen.
@Marko Buršič Ich habe versucht, etwas über Bewegungs- / Trajektorienplaner zu finden, das ich verstehen kann. Die meisten Dinge, die ich gefunden habe, befassen sich entweder mit Anwendungen, die auf externer Hardware ausgeführt werden, oder mit Bewegungen in mehreren Dimensionen (X-, Y- und Z-Achse). Ich versuche, auf einer einzigen Ebene zu arbeiten. Das einzige, was ich gefunden habe, das mit einer Erklärung beginnt, ist ein PDF ( iopscience.iop.org/article/10.1088/1757-899X/294/1/012055/pdf ). Aber es fällt mir sehr schwer, ihm zu folgen . Kannst du mich auf einen anderen Artikel verweisen?
@darrob Was für ein ausgezeichneter Artikel! ++ wiki.linuxcnc.org/cgi-bin/wiki.pl?Simple_Tp_Notes , github.com/LinuxCNC/linuxcnc/blob/master/src/emc/motion/… . Vielleicht können Sie etwas lernen, aber Sie haben bereits einen Code für Aruino aus Ihrem Artikel.
Haben Sie Encoder an Ihren Schrittmotoren und unterstützt Ihr Schrittmotor Mikroschritte? Ob Sie ausgelassene Schritte erkennen können und ob Sie nur zwischen Rastpositionen treten können, macht einen großen Unterschied bei der Beantwortung Ihrer Frage.
@MarkBooth Der Stepper hat keinen Encoder. Es ist ein einfacher NEMA 23 Stepper. Ich habe eine Treiberplatine, die einen Trinmatic TMC260-Chip verwendet. Die Treibersoftware ist einfach, unterstützt jedoch Microstepping (bis zu 256). Meine Anwendung wechselt je nach Situation zwischen 8 und 16 Mikroschrittmodi. Ich kann einzelne ausgelassene Schritte nicht erkennen, aber es gibt einen Überziehschutz/-alarm.
Danke @darrob, beachten Sie, dass es beim Stack-Austausch besser ist, Ihre Frage zu bearbeiten, um die in Kommentaren angeforderten Informationen hinzuzufügen, als weitere Kommentare hinzuzufügen. Kommentare dienen dazu, Fragen und Antworten zu verbessern, und lenken ab, daher versuchen wir, sie auf ein Minimum zu beschränken. Wenn alle zur Beantwortung der Frage erforderlichen Informationen darin enthalten sind, können die Kommentare aufgeräumt (gelöscht) werden.

Antworten (5)

Nun, für kurze Läufe sollte es offensichtlich sein, dass Sie die Küstenphase überspringen können.

Bei den anderen ist es ziemlich einfach. Behalten Sie eine konstante Beschleunigung bei, bis Sie auf halbem Weg zum Ziel sind, und verlangsamen Sie dann, bis Sie das Ziel erreichen.

Es gibt jedoch einen Haken (den gibt es immer, nicht wahr?). Wenn Sie die Entfernung zum Ziel falsch eingeschätzt haben und es näher ist, als Sie denken, dann bedeutet das Beschleunigen auf Ihren (irrtümlichen) halben Weg, dass Sie nicht anhalten können, wenn Sie den tatsächlichen Zielpunkt erreichen.

Man braucht immer eine Verzögerungsrampe, sonst ruckelt man und/oder schießt übers Ziel hinaus. Mein Unternehmen verwendet Beschleunigungs- und Verzögerungszeiten , wie in der Zeit , die benötigt wird, um von 0 % auf 100 % zu gelangen. Dies entspricht einer Beschleunigung von

A = Δ v Δ T

Wo

Δ v = v max Δ T = Zeit zum Beschleunigen von 0 auf  v max

Unabhängig von der Konvention, die Sie verwenden, um Ihre Beschleunigungs- und Verzögerungsraten zu definieren, sollten Sie sie in "richtige" Beschleunigungsraten, Länge/Zeit^2, umwandeln.

Inline Mathjax (LaTeX) ist auf dieser Seite nicht aktiviert, was ziemlich nervig ist, aber ich werde Beschleunigung als sub-positiv und Verzögerung als sub-negativ verwenden, wie in:

Beschleunigung = A + Verzögerung = A

Sie können Beschleunigung und Höchstgeschwindigkeit verwenden, um die Zeit bis zur Höchstgeschwindigkeit wie folgt zu ermitteln:

Δ T = v max A

Beschleunigung doppelt integrieren, um Verschiebung zu erhalten:

D S = S 0 + v 0 Δ T + ( 0,5 ) A Δ T 2

Angenommen, Ihre Startposition ist Null und Ihre Startgeschwindigkeit ist Null, das reduziert sich auf:

D S = ( 0,5 ) A Δ T 2

Sie können also zwei Entfernungen zurücklegen, die nicht unbedingt gleich sind - die Entfernung, die Sie beim Beschleunigen zurücklegen, und dann die Entfernung, die Sie beim Verzögern zurücklegen. Wenn die Beschleunigungs- / Verzögerungsraten gleich sind, sind die Entfernungen gleich, aber dies scheint der verwirrende Punkt für Sie zu sein, wenn dies nicht der Fall ist.

Kein Problem! Sie haben Zeit, auf Höchstgeschwindigkeit zu beschleunigen:

Δ T + = v max A +

Und Sie haben Zeit, von der Höchstgeschwindigkeit abzubremsen:

Δ T = v max A

Sie haben also eine Strecke, die Sie beim Beschleunigen zurücklegen, und eine Strecke, die Sie beim Abbremsen zurücklegen:

D S + = ( 0,5 ) A + Δ T + 2 D S = ( 0,5 ) A Δ T 2 D S gesamt = D S + + D S

Dies ist Ihre Testbedingung . Wenn Ihr targetDistanceWert größer als dS ist (was die Kombination aus dS+ und dS- ist), benötigen Sie etwas Ausrollzeit bei Höchstgeschwindigkeit. Die Küstenzeit ist:

$$ \mbox{Restdistanz} = \mbox{Zieldistanz} - dS \\ \Delta t_{\mbox{Küste}} = \frac{v_{\mbox{max}}{\mbox{Restdistanz}} \\ $$

Wenn Ihr targetDistanceWert WENIGER als dS ist, müssen Sie Ihre Beschleunigungs- und Verzögerungsrampen beschneiden. Dies bedeutet die Lösung für die neue Höchstgeschwindigkeit. Ausarbeitung der dS-Gleichung von früher:

D S gesamt = D S + + D S D S gesamt = ( 0,5 ) A + Δ T + 2 + ( 0,5 ) A Δ T 2 D S gesamt = ( 0,5 ) A + ( v max A + ) 2 + ( 0,5 ) A ( v max A ) 2

Ziehen Sie den vMax-Begriff heraus:

D S gesamt = ( ( 0,5 ) A + ( 1 A + ) 2 + ( 0,5 ) A ( 1 A ) 2 ) ( v max ) 2

Beschleunigungsbedingungen stornieren:

D S gesamt = ( ( 0,5 ) ( 1 A + ) + ( 0,5 ) ( 1 A ) ) ( v max ) 2

Ziehen Sie auch die 0,5 heraus:

D S gesamt = ( 0,5 ) ( ( 1 A + ) + ( 1 A ) ) ( v max ) 2

Bereinigen Sie es dann und beginnen Sie mit der Lösung für vMax:

D S gesamt = ( 0,5 ) ( 1 A + + 1 A ) ( v max ) 2 2 ( D S gesamt ) = ( 1 A + + 1 A ) ( v max ) 2 2 ( D S gesamt ) 1 ( 1 A + + 1 A ) = ( v max ) 2

Die Beschleunigungsterme lassen sich durch geschicktes Multiplizieren mit Eins in Form von a+/a+ oder a-/a- aufräumen:

2 ( D S gesamt ) 1 ( A A A + + A + A A + ) = ( v max ) 2

Jetzt addieren sich diese Brüche:

2 ( D S gesamt ) 1 ( A + A + A A + ) = ( v max ) 2

Jetzt können sie invertiert werden:

2 ( D S gesamt ) ( A A + A + A + ) = ( v max ) 2

Was schließlich bleibt:

v max = 2 ( D S gesamt ) ( A A + A + A + )

Sobald Sie dies haben, gehen Sie zurück und berechnen die Beschleunigungs- und Verzögerungszeiten (t+ und t-) neu und das gibt Ihnen Ihr neues Geschwindigkeitsprofil.

Schlussbemerkung/PS - Beachten Sie, dass Sie Folgendes erhalten, wenn a- gleich a+ ist (lassen Sie die Indizes weg und verwenden Sie einfach 'a'):

v max = 2 ( D S gesamt ) ( A A A + A ) v max = 2 ( D S gesamt ) ( A 2 2 A ) v max = 2 ( D S gesamt ) ( A 2 ) v max = ( D S gesamt ) A

Ich weiß aus großer Erfahrung, dass der schwierigste Teil beim Lesen von Artikeln manchmal darin besteht, dass die Autoren alle zu glauben scheinen, dass die Mathematik für einen bestimmten Schritt trivial ist, sodass sie manchmal entscheidende (für uns) Punkte in der Herleitung überspringen oder schlechte Autoren die Herleitung weglassen vollständig. Aus diesem Grund habe ich versucht, jeden Schritt, den ich unternommen habe, deutlich zu machen, aber wenn ich etwas ausgelassen habe oder Sie immer noch verwirrt sind, lassen Sie es mich einfach wissen.

@darrob - Ich helfe gerne! Nochmals, wenn ich irgendwelche Punkte übersprungen habe oder etwas noch unklar ist, lassen Sie es mich einfach wissen und ich kann versuchen, es zu klären.

Wenn Sie Ihre eigenen rollen möchten, wird es ungefähr so ​​​​sein.

  • Wenn Beschleunigung == Verzögerung, dann ist die Anzahl der Schritte für die Beschleunigungsphase gleich der Gesamtzahl der erforderlichen Schritte / 2.
  • Beschleunigen Sie, bis Sie die Zielschrittzahl erreicht haben oder bis Sie Vmax erreicht haben.
  • Beachten Sie die Schrittzahl, c.
  • Laufen Sie mit Vmax, bis Sie das Ziel erreichen - c.
  • Verzögerung starten.
  • Am Ziel anhalten.

Wenn Sie accel != decel haben, müssen Sie zusätzliche Arbeit leisten, um die Verhältnisse zu ermitteln.

Die letzte Situation, die Sie beschreiben, kommt dem Problem, mit dem ich konfrontiert bin, am nächsten. Die meisten, eigentlich alle Diskussionen, die ich gelesen habe (und ehrlich gesagt tatsächlich verstehen konnte), beschreiben Situationen, in denen genügend Zeit zum Beschleunigen, Ausrollen und Abbremsen vorhanden ist, selbst wenn die Küste 0 ist (dh dreieckiges Profil). Es sind die sehr kleinen Bewegungen, die mir Sorgen bereiten. Gibt es Situationen, in denen es sinnvoll ist zu beschleunigen und dann einfach anzuhalten? (wie bei einer Bewegung in einem oder zwei Schritten) und wenn ja, wie man feststellt, wo das sinnvoll ist
Die Gefahr bei einem plötzlichen Stopp besteht darin, dass die Trägheit von Motor + Last dazu führt, dass der Motor losbricht und überschwingt. Ihre Anmeldung gilt dann bis zu Ihrer Rückkehr nach Hause. Sie könnten sich die Anzahl der erforderlichen Schritte ansehen und, wenn sie niedrig ist, mit konstanter Geschwindigkeit zum Ziel laufen und anhalten, aber ich denke, eine allgemeinere Routine wäre besser.
Ah. Es ist die generische Routine, die ich suche, in der Hoffnung, dass sie für sehr kleine Bewegungen geeignet ist. Es sieht so aus, als müsste ich eine Reihe von Bedingungen einfügen, die auf der Anzahl kleiner Schritte basieren.
Nein, das solltest du nicht müssen. Schreiben Sie einen Pseudocode oder ein Flussdiagramm und fügen Sie ihn Ihrer Frage oder einer neuen Frage zur Überprüfung hinzu. Ich habe gestern nach einem Beispiel-Flussdiagramm gesucht, konnte aber keins finden. Ich muss heute eine Weile in einem Krankenhaus sitzen, damit ich vielleicht Zeit habe, etwas zu skizzieren. In der Zwischenzeit annals.fih.upt.ro/pdf-full/2013/ANNALS-2013-3-06.pdf .
Danke für den Link. Es sieht aus wie genau das, durch das ich mich gekämpft habe, neu formatiert. ( iopscience.iop.org/article/10.1088/1757-899X/294/1/012055/pdf ) Ich werde darüber nachdenken, wie ich mein Anliegen als Flussdiagramm hinzufügen kann (was auch meine eigenen Gedanken verdeutlichen könnte :) ) In der Zwischenzeit , ich hoffe, Sie kommen bald darüber hinweg, was Sie im Krankenhaus hält. Beifall...

Ich habe Ihnen Links zu einfachen Traj gegeben. Planer von linuxnc.org. Es muss angemerkt werden, dass es nicht verwendet wird, da es durch ein neues und besseres (komplexeres) ersetzt wurde.

wiki.linuxcnc.org/cgi-bin/wiki.pl?Simple_Tp_Notes

Quellcode

Also, wie es funktioniert:

Am Anfang setzt man pos_cmd = curr_pos (aktuelle Position), der Planer tut nichts. Dann setzen Sie einen neuen pos_cmd (Sollposition) und vel_req (Sollgeschwindigkeit) mit Einschränkungen: max_acc , max_vel .

Der Algorithmus berechnet für jeden Schritt (Rekursion) den Abstand zum Stoppen in Bezug auf die aktuelle Geschwindigkeit, aktuelle Position, max_acc.

Wenn die Position zum Stoppen gleich oder größer als die tatsächliche Distanz zum Stoppen ist, beginnt es auszurollen.

Andernfalls, wenn die aktuelle Geschwindigkeit kleiner als vel_req ist, steigt sie mit der max_acc-Rampe an.

Andernfalls, wenn die aktuelle Geschwindigkeit gleich oder größer als vel_req ist, bewegt es sich mit konstanter Geschwindigkeit.

Es muss gesagt werden, dass dies eine reine Open-Loop-Steuerung ist, keine Rückkopplung. Der Planer erzeugt Trapezprofil und gibt Sollwerte für Position und Geschwindigkeit aus und der Antrieb muss ihm folgen. Wie gesagt, es kann sein, dass es nicht an der exakten Position stoppt, siehe Anmerkungen.

PS: IMO, der von Ihnen vorgeschlagene Artikel ist spezifischer für Schrittmotoren, tatsächlich berechnet er Impulse. Der linuxcnc ist ein allgemeinerer Ansatz, aber Sie können Ihr Problem umfassender untersuchen. Es ist kein Fehler, einen Planer für kleine oder große Bewegungen zu verwenden, alle Berechnungen sind durch physikalische Einschränkungen begrenzt, die als Parameter eingegeben werden.

Wenn Sie bei der Planung eines trapezförmigen Bewegungsprofils nicht weit genug fahren, entwickelt sich daraus eine dreieckige Bewegung. Dh „beschleunigen, maximale Geschwindigkeit, verzögern“ wird zu „beschleunigen, verzögern“.

Normalerweise berechne ich die Reisestrecke basierend auf der Subtraktion der Beschleunigungs- und Verzögerungsstrecken (basierend auf der maximalen Beschleunigung und der maximalen Geschwindigkeit) von der Gesamtstrecke. Wenn diese Reisestrecke negativ ist, berechne ich die Beschleunigungs- und Verzögerungsstrecken und -geschwindigkeiten basierend auf der Hälfte der Gesamtstrecke (oder dem Verhältnis von maximaler Beschleunigung und maximaler Verzögerung, falls sie unterschiedlich sind) neu.

Trapezförmige Bewegungsprofile werden oft verwendet, weil sie einfach sind und die Bewegungsgeschwindigkeit und Entfernung für jeden Wegpunkt leicht zu berechnen sind. Das Problem ist, dass sie nicht sehr flexibel sind, da sie von einer momentanen Beschleunigungsänderung ausgehen, die bekanntlich nur eine Annäherung an das Verhalten realer Systeme darstellt.

Viele Bewegungssteuerungen haben die Möglichkeit, S-Kurven-Bewegungsprofile zu verwenden. Sie beginnen, indem Sie die Beschleunigung zu Beginn der Beschleunigungsphase hochfahren und am Ende herunterfahren, wobei Sie zu Beginn und am Ende der Verzögerungsphase dasselbe tun.

Obwohl es logisch erscheinen mag, dass die schnellste Bewegung, die Sie machen können, darin besteht, mit der höchstmöglichen Geschwindigkeit zu beschleunigen und dann mit der höchstmöglichen Geschwindigkeit zu verzögern, ist dies möglicherweise nicht immer der Fall. Wenn Sie den Ruck (Ruck) bei einer Bewegung reduzieren, indem Sie mit einer niedrigeren Anfangsbeschleunigung beginnen, können Sie eine höhere Spitzenbeschleunigung länger aufrechterhalten, was zu einer höheren Gesamtbeschleunigung führt, alles auf Kosten komplexerer Trajektorienplanungsberechnungen.

Dies ist insbesondere bei Schrittmotoren ohne Encoder ein Problem. Schrittmotoren leiden unter dem Problem, dass ihr Verhalten unvorhersehbar ist, wenn Sie von ihnen verlangen, etwas zu tun, was sie gerade noch schaffen können. Drücken Sie Ihren Schrittmotor nur ein wenig zu stark und er wird Schritte verpassen. Wenn Sie keinen Encoder haben, um diese fehlenden Schritte zu erkennen und sie zu korrigieren (in Ihrer Servoschleife), müssen Sie Ihre max. Beschleunigungsparameter so weit, dass er allen möglichen Situationen gewachsen ist.

Im Allgemeinen möchten Sie versuchen, Diskontinuitäten in der Steuerung zu vermeiden, daher sollten Steuerungsalgorithmen, ähnlich wie die Motoren, die sie steuern, reibungslos zwischen verschiedenen Betriebsmodi wechseln.

Ich habe die Bewegung zum Reisen mit Trapez- / Dreiecksprofil, die in Ordnung ist. Bei den kleineren Bewegungen rechne ich auch um, indem ich die Distanz halbiere. Aber es kommt immer noch darauf an: Ab wann muss keine Verzögerungsphase berechnet werden?
Wenn die Gesamtbewegungszeit/-entfernung kleiner als ein einzelner Wegpunkt ist, dann haben Sie effektiv keine Planung, Sie haben nur eine einzige „Sprung“-Bewegung. In diesem Fall verlassen Sie sich mehr auf die Abstimmungsparameter Ihres Regelkreises als auf eine explizite Bewegungsplanung.
Ja, es ist die „Servoschleife“, die ich versuche, für die Ausnahmesituationen abzustimmen. In meinem Fall ist dies eine sehr einfache Aufgabe, bei der lediglich eine Laufkatze in eine von zwei Richtungen bewegt werden muss. Es gibt drei (gut sechs, inklusive Richtung) Möglichkeiten. Bewegen Sie sich mit maximaler Geschwindigkeit zu einem entfernten Punkt, bewegen Sie sich mit niedriger Geschwindigkeit zu einem entfernten Punkt oder bewegen Sie sich eine Minute mit beliebiger Geschwindigkeit. Und wenn ich Minute sage, spreche ich irgendwo zwischen 1 und 50 Schritten (entspricht 0,00125 bis 0,0625 mm). Hier kommen die Accel/Decel-Kopfschmerzen ins Spiel :)
Danke für die Info zum Vote-Button. Mein Ruf ist nicht hoch genug, um die Punktzahlen aufzuzeichnen
Im Allgemeinen, @darrob, sollten Sie Ihren Servoregelkreis nicht auf bestimmte Bewegungen einstellen, Sie sollten Ihren Servoregelkreis auf die beste Gesamtreaktion einstellen und dann Ihren Planungskreis verwenden, um das Beste aus dem abgestimmten System herauszuholen. Ich habe gesehen, wie Systeme versuchten, PID-Parameter für verschiedene Arten von Bewegungen zu ändern, und es endete nie gut. Sie können sich die Verwendung von kubischen Splines () und die Planung von Bewegungen mit fester Entfernung und variabler Zeit anstelle der traditionellen festen Zeit (Periode) mit variabler Entfernung ansehen. Dies würde die feste Schrittgröße zu einem Vorteil und nicht zu einer Einschränkung machen.
Ich werde diese Kommentare aufräumen (löschen), wenn ich besser verstehe, wie ich meine Antwort verbessern kann.