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