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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Pepe (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

von Possetitjel (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
@Possetitjel:
Keine Schnittstelle. Direkt innerhalb der Firmware.

von Possetitjel (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

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

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.