Forum: Mikrocontroller und Digitale Elektronik Optimierungen für flüssigen Stepperbetrieb


von MS (Gast)


Lesenswert?

Guten Tag zusammen,

Ich habe ein Projekt bei dem ich bis zu 10 Stepper Motoren gleichzeitig 
laufen lassen will. Alle sollen parallel laufen. Beschleunigungen sind 
nicht nötig. Geschwindigkeiten können angepasst werden, meistens laufen 
aber alle Stepper mit einer konstanten Geschwindigkeit. Es ist sehr 
wichtig dabei, dass diese so verzögerungsfrei arbeiten, wie es geht.

Punkt 1:
Stepper Controller sind momentan billige TB6600 aus China, die per Step 
und Dir Pin mittels Arduino Mega angesteuert werden. Mir wurde schon mal 
empfohlen auf TMC 2130 oder TMC 2100 umzusteigen (bessere Laufruhe, 
bessere Stromversorgung der Motoren etc.). Kann mir da jemand eine 
Empfehlung für ein gutes Board geben, das möglichst viele Stepper 
Controller aufnehmen kann? Optimalerweise hätte so ein Board auch 
Aufnahmen für typische 12V Heizungen aus dem 3D-Druckbereich, ist aber 
nicht zwingend notwendig.

Punkt zwei:
In meinem Programm muss leider auch viel berechnet werden. Hier habe ich 
es schon soweit optimiert, wie es meine Programmierkenntnisse zulassen 
(Gleitkommazahlen nur da wo wirklich nötig, Aufteilung wiederkehrender 
Aufgaben in kleine Blöcke, Nutzung von Bibliotheken mit denen digitale 
Pins direkt per Register gesetzt werden können und andere Sachen). Die 
Stepper werden über die AccelStepper-Bibliothek gesteuert (per runSpeed 
Funktion). Die Motoren laufen nun deutlich gleichmäßiger und flüssiger, 
aber haben immer noch Aussetzer (kann man auch hören), die hauptsächlich 
durch ein Display (SPI) und die serielle Kommunikation zu einem Notebook 
verursacht werden. Das Display habe ich erstmal ausgeschaltet, nicht so 
wichtig. Zum Notebook werden einmal die Sekunde Daten gesendet in Form 
eines Strings. Ich vermute mal das ist schon nicht optimal, die Daten 
sind auch eigentlich Zahlen.

Könnt ihr mir Empfehlungen geben, wie man das Problem eingrenzen kann 
(ich nutze schon die maximale Baudrate von 2000000)? Ich frage mich die 
ganze Zeit, wie das 3D-Drucker machen, die steuern während des Prozesses 
Bildschirme an und es gibt keine Probleme. Ich habe auch mal in die 
Marlin-FW reingeschaut, aber da werde ich nicht wirklich schlau draus. 
Schaut nur so aus, als wenn die serielle Schnittstelle dort über eigene 
Funktionen realisiert wurde, wo direkt auf Register zugegriffen wird? 
Ich hatte schon überlegt auf einen deutlich leistungsstärkeren 
Mikrocontroller umzusteigen, aber z.B. im Prusa i3 Mk3 sitzt soweit ich 
weiß der gleiche Chip wie im Arduino. Sollte also auch mit einem Arduino 
Mega klappen, denke ich.

Danke vorab für jede Hilfe!

von Michael B. (laberkopp)


Lesenswert?

MS schrieb:
> Könnt ihr mir Empfehlungen geben, wie man das Problem eingrenzen kann

Nun, wenn AccelStepper per Interrupt läuft, und deine serielle 
Kommunikation zu Display und PC das stören, dann verlagere die serielle 
Kommunikation in die Programm-Haupstschleife, per polling, ohne 
Interrupt.

Dann sollten die Motoren ungestört angesteuert werden.

Wenn jedoch die Motoren selbst sauber angesteuert werden, und das 
ruckeln von Überwschingen stammt, dann dämpfe Schwingungen der 
Motorwelle durch Bremsen, Bremsresonantorplatten, Filzbremse, was auch 
immer.

von Johnny B. (johnnyb)


Lesenswert?

Du musst alles Zeitkritische in Interrupts machen und im Interrupt 
möglichst kurz drin bleiben. Displayansteuerung etc. passiert im Main. 
So wird nur das Zeug im Main ausgebremst und nicht die Sachen in den 
Interrupts.

von r c (Gast)


Lesenswert?

Timer-Interrupt, der mindestens so häufig aufgerufen wird, wie die 
maximale Schrittfrequenz soll runSpeed() aufrufen.

von MS (Gast)


Lesenswert?

Gut, damit würde ich mal etwas rumprobieren. Würdet ihr für jeden 
Stepper einen eigenen Interrupt machen, der angepasst ist an die 
Schrittfrequenz oder lieber ein Interrupt für alle?

von Purzel H. (hacky)


Lesenswert?

Wenn's geht ein Interrupt fuer alle. zB alle 100us. Denn sonst wird's 
schnell eng.

von m.n. (Gast)


Lesenswert?

Wenn es unbedingt ein Arduino Mega sein soll, kann man mit den vier 16 
Bit Timern 1, 3, 4 und 5 an deren jeweils drei OC-Ausgängen die Schritte 
per Hardware erzeugen. Die dadurch angestoßene ISR bereitet den nächsten 
Schritt vor.
Wie das beim ATmega328 und seinem Timer1 aussieht, kannst Du Dir hier 
ansehen: http://mino-elektronik.de/Generator/takte_impulse.htm#bsp3a ff

Anhängig von der Schrittfrequenz kann der AVR trotz 
Hardware-Unterstützung in die Knie gehen. Anstatt zu kleckern, würde ich 
persönlich einen STM32F4xx (Nucleo-Board) einsetzen. Mit deulich höherer 
Leistung und vor allem durch seine Interruptprioritäten ist man damit 
auf der sicheren Seite.
Der Schritt von ATmega auf STM32Fxxx ist jedoch ein großer.

von Alex D. (daum)


Lesenswert?

m.n. schrieb:
> Anstatt zu kleckern, würde ich
> persönlich einen STM32F4xx (Nucleo-Board) einsetzen. Mit deulich höherer
> Leistung und vor allem durch seine Interruptprioritäten ist man damit
> auf der sicheren Seite.

Würde ich persönlich zwar auch so machen, aber wie es aussieht ist MS 
eher ein Arduino programmierer, der noch nicht so viel mit direktem 
Hardwarezugriff und lesen (und verstehen) von Datenblättern gemacht hat. 
Da ist der Umstieg auf STM32 doch ein sehr großer. Auch wenn CubeMX die 
pinkonfiguration für Anfänger einfacher macht ist das Programmieren doch 
deutlich anders als mit Arduino mit all den Libraries.
Ein "mbed enabled" nucleo board (F401RE (8 nutzbare Timer) würde da eh 
passen, für noch mehr Timer eventuell F446RE (12 nutzbare Timer)) zu 
nehmen und des damit zu machen wäre da eher das passende. Mit dem F446 
wäre wirklich 1 Timer pro Motor möglich und somit volle Flexibilität

von MS (Gast)


Lesenswert?

m.n. schrieb:
> Wenn es unbedingt ein Arduino Mega sein soll, kann man mit den vier 16
> Bit Timern 1, 3, 4 und 5 an deren jeweils drei OC-Ausgängen die Schritte
> per Hardware erzeugen. Die dadurch angestoßene ISR bereitet den nächsten
> Schritt vor.

Ich meine sowas hatte ich mal versucht und dann Probleme mit den Timern 
bekommen. Sofern ich das noch richtig weiß, lag das an AccelStepper, 
weil das Programm einen Timer blockiert. Aber gut, das lässt sich ja 
herausfinden.

Alex D. schrieb:
> Würde ich persönlich zwar auch so machen, aber wie es aussieht ist MS
> eher ein Arduino programmierer, der noch nicht so viel mit direktem
> Hardwarezugriff und lesen (und verstehen) von Datenblättern gemacht hat.

Ganz richtig. Hatte zwar im Studium auch kurz Assembler, aber das war 
eher etwas nebenher und viel hängengeblieben ist auch nicht. Werde mich 
erstmal weiter dem Arduino widmen.


Vielen Dank schon einmal für eure Hilfe!

Hättet ihr denn noch Empfehlungen bezüglich eines Boards (s. Punkt 1 im 
ersten Post).

von Alex D. (daum)


Lesenswert?

MS schrieb:
> Hättet ihr denn noch Empfehlungen bezüglich eines Boards (s. Punkt 1 im
> ersten Post).

Ich bin in dem Bereich nicht so drin, aber so ein Board könnte man 
selbst entwerfen und routen, dann im Internet bestellen. Setzt natürlich 
Kenntnisse im Platinen Layouten voraus, die du eventuell nicht hast. Die 
Platinen kann man dann einfach bestellen, entweder sehr billig aber mit 
langem Versand auch China (jlcpcb, pcbway) oder etwas teurer dafür 
direkt aus Deutschland (kenne da nur aisler).

Das macht allerdings nur Sinn wenn du Kenntnisse im Platinendesign hast 
oder jemanden kennst, der dir sowas machen könnte, sonst wird das auf 
Anhieb sicher nicht hin hauen und könnte eher teuer werden wenn öfters 
bestellt werden muss.

Mit fertigen Platinen kann ich leider nicht dienen und hab auch auf die 
schnelle keine gefunden die 10 Treiber drauf haben. Man könnte natürlich 
schon mehrere Platinen mit weniger Treibern nehmen und die zusammen 
verdrahten, ist halt dann relativ fragil.

von m.n. (Gast)


Lesenswert?

Wenn der Drehzahlbereich eingegrenzt ist und die Schrittfrequenz nicht 
zu niedrig sein muß, reicht es vermutlich, die Nachladewerte für die 
OCRx-Register auf 16 Bit zu begrenzen. Dadurch kann man die 
Interruptlast reduzieren. (Programmierung in Assembler würde nochmals 
viel bringen!)
Bei 16 MHz Taktfrequenz und Vorteiler/8 käme man mit dem Wert 0xffff auf 
eine minimale Schrittfrequenz von rund 31 Hz.

Der oben gemachte Vorschlag, mit 10 kHz alle Schrittmotore zu bedienen, 
hilft leider garnichts, sobald die Schrittfrequenzen oberhalb der 
Start-Stopp-Frequenz liegen. Auf Grund der schlechten Auflösung wären 
nur noch grobe Frequenzänderungen möglich. Beispiel (in kHz): 1,00; 
1,11; 1,25; 1,43; 1,67; 2,00; 2,50; 3,33; 5,00; 10,0. Da wird ein Motor 
bei Beschleunigung recht schnell stehen bleiben.

MS schrieb:
> Hättet ihr denn noch Empfehlungen bezüglich eines Boards (s. Punkt 1 im
> ersten Post).

Ich denke, für Deinen speziellen Bedarf mit 10 Motoren, wird es keine 
fertige Lösung geben.
Aber verrate uns trotzdem bitte noch, um welche Schrittfrequenzen es 
geht und was unter 'parallel laufen' zu verstehen ist. Würde es denn 
auch reichen, alle 10 "Stepper Controller" zusammen an gemeinsamen 
Clock/Dir-Signalen zu betreiben?

Selber verwende ich pro Motor eine Platine mit ATmega328 + A4982.

von m.n. (Gast)


Lesenswert?

m.n. schrieb:
> Selber verwende ich pro Motor eine Platine mit ATmega328 + A4982.

Siehe hier: Beitrag "Schrittmotoransteuerung mit A4982 und ATmega328"

von MS (Gast)


Lesenswert?

Alex D. schrieb:
> Ich bin in dem Bereich nicht so drin, aber so ein Board könnte man
> selbst entwerfen und routen, dann im Internet bestellen.

Das ist dann eigentlich erst für später geplant, wenn noch weitere 
Module hinzukommen.

m.n. schrieb:
> Aber verrate uns trotzdem bitte noch, um welche Schrittfrequenzen es
> geht und was unter 'parallel laufen' zu verstehen ist. Würde es denn
> auch reichen, alle 10 "Stepper Controller" zusammen an gemeinsamen
> Clock/Dir-Signalen zu betreiben?

Alle Motoren laufen "gleichzeitig" mit einer für jeden Motor individuell 
eingestellten Geschwindigkeit. Die Geschwindigkeit jedes Steppers liegt 
dabei aktuell zwischen 0 und 600 Steps/s bei 800er Microstepping. Bei 
sehr geringen Geschwindigkeiten möchte ich das Microstepping erhöhen, 
weiterer Grund um auf die TMC 2130 umzusteigen, damit ich das 
programmieren kann.

Jeder Stepper muss einzeln anzusteuern sein, auch was die Richtung 
angeht.

m.n. schrieb:
> m.n. schrieb:
>> Selber verwende ich pro Motor eine Platine mit ATmega328 + A4982.
>
> Siehe hier: Beitrag "Schrittmotoransteuerung mit A4982 und ATmega328"

Schaue ich mir mal an, danke.

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.