Forum: Mikrocontroller und Digitale Elektronik Bahnsteuerung für Stepper verwenden


von Pepe (Gast)


Lesenswert?

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?

von Pandur S. (jetztnicht)


Lesenswert?

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.

von Pepe (Gast)


Lesenswert?

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?

von Noch einer (Gast)


Lesenswert?

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.

von Pepe (Gast)


Lesenswert?

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. )

von Noch einer (Gast)


Lesenswert?

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.

von Pepe (Gast)


Lesenswert?

Ich hab doch keine unlösbaren Probleme. Ich feile eigentlich eher an der 
Genauigkeit in meiner Umsetzung.

von Possetitjel (Gast)


Lesenswert?

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?

von Pepe (Gast)


Lesenswert?

@Possetitjel:
Keine Schnittstelle. Direkt innerhalb der Firmware.

von Possetitjel (Gast)


Lesenswert?

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.

von (Gast)


Lesenswert?

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

von Pepe (Gast)


Lesenswert?

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.

von (Gast)


Lesenswert?

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.

von Pepe (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.