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.
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
Wo
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:
Sie können Beschleunigung und Höchstgeschwindigkeit verwenden, um die Zeit bis zur Höchstgeschwindigkeit wie folgt zu ermitteln:
Beschleunigung doppelt integrieren, um Verschiebung zu erhalten:
Angenommen, Ihre Startposition ist Null und Ihre Startgeschwindigkeit ist Null, das reduziert sich auf:
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:
Und Sie haben Zeit, von der Höchstgeschwindigkeit abzubremsen:
Sie haben also eine Strecke, die Sie beim Beschleunigen zurücklegen, und eine Strecke, die Sie beim Abbremsen zurücklegen:
Dies ist Ihre Testbedingung . Wenn Ihr targetDistance
Wert 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 targetDistance
Wert 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:
Ziehen Sie den vMax-Begriff heraus:
Beschleunigungsbedingungen stornieren:
Ziehen Sie auch die 0,5 heraus:
Bereinigen Sie es dann und beginnen Sie mit der Lösung für vMax:
Die Beschleunigungsterme lassen sich durch geschicktes Multiplizieren mit Eins in Form von a+/a+ oder a-/a- aufräumen:
Jetzt addieren sich diese Brüche:
Jetzt können sie invertiert werden:
Was schließlich bleibt:
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'):
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.
Wenn Sie Ihre eigenen rollen möchten, wird es ungefähr so sein.
Wenn Sie accel != decel haben, müssen Sie zusätzliche Arbeit leisten, um die Verhältnisse zu ermitteln.
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
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.
Marko Buršič
Harry Swensson
darrob
Marko Buršič
Mark Booth
darrob
Mark Booth