Hallo.
Ich habe eine funktionierende Bahnsteuerung mit Trapez/S-Kurve und 10KHz
Takt für die Berechnung der Bahnsteuerung. Derzeit steuere ich
DC-Motoren über eine nachfolgende Regelung an.
Bin am überlegen die gleiche Bahnsteuerung jetzt auch für Schrittmotoren
einzusetzen. Aber irgendwie fehlt mir gerade die passende Idee für die
Umsetzung.
Hatte mir überlegt aus der berechneten Geschwindigkeit die Frequenz für
den nächsten Schritt zu berechnen.
Nur sehe ich folgendes Problem:
Am Anfang einer Beschleunigung wird die Geschwindigkeit wesentlich zu
langsam sein. Also beschleunige ich "zu langsam". Beim Abbremsen bin ich
zu schnell.
Bei FullStep mag dies ja nicht problematisch sein, da die max.
Fahrfrequenz wohl (bei mir) nicht weit über die 1-2kHz geht. Aber was
passiert bei 1/16 Steps.
Wie setzt man dies um? Oder kann man dies vernachlässigen?
Irgendwie scheint ein Stueck Mathematik zu fehlen.
Ja die die Schrittgeschwindigkeit (step/s) ist die eins durch die Zeit
zwischen den Schritten. Bei einem Motor kann man den Timer Interrupt
jeweils neu programmieren, bei mehreren Motoren und einem festen Tick,
braucht man eine hinreichend hohe Tickrate, denn man moecht ja auch
etwas Aufloesung haben.
Falls das nicht geht, waere ein schnellerer Prozessor anstehend, oder
man lagert die Schrittererzeugung an einzelne Chips, die genau nur das
machen, aus. Da waere auch ein FPGA denkbar.
Was Du vorschlägst würde dann ja bedeuten, dass ich die Bahnsteuerung
(vielleicht mit einem höherem Takt) laufen lasse und jedesmal, wenn die
berechnete Position der Bahnsteuerung den nächsten ganzzahligen Wert
erreicht, einen Schritt auf den Stepper mache?
Was ist denn eine ausreichend hohe Taktrate?
https://github.com/grbl/grbl arbeitet nach diesem Ansatz.
Die haben einen Timerinterrupt, der fast die gesamte Rechenzeit belegt.
Und ein Modul, das die Bahnen für einen Bresenham-Algorithmus
vorbereitet.
grbl hab ich mir schon angesehen. Der geht das Ganze ja gleich "aus
Sicht des Steppers" an.
Ich möchte aber eigentlich die gleiche Bahnsteuerung verwenden, die ich
schon habe. ( wegen gleicher Interfaces, Parameters etc. )
Tja, hat schon seine Gründe, warum alle anderen G-code als Interface
nehmen.
Diese Leute sind schon an einigen unlösbaren Problemen gescheitert,
bevor sie auf die Idee kamen, so einen aufwendigen Interpreter in eine
Steuerung zu quetschen.
Pepe schrieb:> Ich habe eine funktionierende Bahnsteuerung mit> Trapez/S-Kurve und 10KHz Takt für die Berechnung der> Bahnsteuerung. Derzeit steuere ich DC-Motoren über> eine nachfolgende Regelung an.
Über welche Schnittstelle?
Pepe schrieb:> @Possetitjel:> Keine Schnittstelle. Direkt innerhalb der Firmware.
Sicher nicht. Zwischen der Steuerung und den Motoren
sitzt irgend eine Form von Schnittstelle. TTL ist den
Motoren deutlich zu wenig.
Wenn Du clever warst und Bahnsteuerung, Motorendstufe
und Motoren separat ausgeführt hast, könnte man
theoretisch die Bahnsteuerung weiterverwenden und einen
anderen Umrichter und Schrittmotoren anflanschen.
Wenn die Steuerung direkt digital auf die PWM-Endstufen
für die DC-Motoren geht, hast Du Pech.
Das einfachste wird sein, mit der 10-fachen Geschwindigkeit der
Bahnsteuerung (Hausnummer) eine DDS laufen zu lassen, die die Schritte
generiert.
100kHz sind da natürlich schon sportlich, aber ein 100MHz ARM Cortex
o.ä. sollte das schon schaffen ohne dass ihm gleich die Luft ausgeht.
Wie sowas aussehen kann siehe hier
https://github.com/LinuxCNC/linuxcnc/blob/master/src/hal/components/stepgen.c
Die 100kHz sollten machbar sein. Verwende einen STM32F40x mit 180MHz.
Für die PID-Regelung (für die bisherigen Motoren) inkl. Bahnsteuerung
für 2 Achsen brauche ich weniger als 20us. Ohne Regelung schätze ich mal
< 5us.
Ich hätte aber eher einen "handwerklichen" Ansatz: Meine bestehende
Bahnsteuerung gibt mir im 10kHz Takt die neuen Positionen aus. Wenn ich
jetzt intern nur mit einem 1/10tl(wenn ich die Freq. auf 100kHz erhöhe)
rechne und jedes mal beim nächsten, vollen Schritt den Stepper bewege,
sollte ich doch eine einigermaßen gleichmäßige Bewegung erreichen.
Der DC-Motor wird von der Bahnsteuerung oder einer anderen
dazwischengeschalteten Komponente im Endeffekt eine Geschwindigkeit als
Stellgröße erhalten.
Diese Geschwindigkeit kann man auch dem Schrittgenerator geben.
Die DDS-artige Schrittsynthese mit einem Positions-Akkumulator der z.B.
1/1000000 Schritt auflöst hat den Sinn, auch kleine Geschwindigkeiten
(im Sinne von Schritten pro Bahnsteuerungs-Intervall) fahren zu können.
Die Frequenz der Schrittsynthese sollte nicht zu klein sein, das kann
sonst zu unruhigem Motorlauf führen. 100kHz sollte für Schrittfrequenzen
bis 16kHz ausreichen, bei 1kHz Vollschrittfrequenz gingen sich da auch
16 Mikroschritte aus wenn man das will/braucht.
Ich hab mir den Code noch mal angesehen. Hat mich auf eine Idee
gebracht, die ich jetzt auch schon teilweise umgesetzt habe. Sieht gar
nicht schlecht aus.
In meiner Bahnsteuerung kann ich auf die exakte Soll-Position inkl.
Nachkommastellen pro Regeltakt zugreifen. Ich merke mir den Zeitpunkt
der letzten ganzzahligen Position (=letzter Schritt des Steppers) und
warte auf den Regeltakt in welchem die Position wieder den nächsten
Schritt des Steppers erreicht/überschreitet. Daraus berechne ich mir
dann den genauen Zeitpunkt des Steps.
Diesen Zeitpunkt verwende ich dann in einer weiteren (schnelleren)
TimerSchleife (derzeit 100kHz) um den Schritt zum passenden Augenblick
auszuführen.
Dies hat allerdings den Nachteil, dass ich mind. die Dauer des ersten
Steps später losfahre. Das macht mir aber nichts aus.
Bei höheren Geschwindigkeiten ( mit mehreren Schritten pro Takt der
Bahnsteuerung, d.h. > 10kHz ) hab ich gerade noch das Problem, dass die
Fahrt in Abhängigkeit der Frequenz ruppig wird. Das sollte sich aber
lösen lassen, wenn ich hier auch den nächsten Takt der Bahnsteuerung
einbeziehe.
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang