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.
Ich hab doch keine unlösbaren Probleme. Ich feile eigentlich eher an der Genauigkeit in meiner Umsetzung.
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?
@Possetitjel: Keine Schnittstelle. Direkt innerhalb der Firmware.
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.
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.