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.
Timer-Interrupt, der mindestens so häufig aufgerufen wird, wie die maximale Schrittfrequenz soll runSpeed() aufrufen.
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's geht ein Interrupt fuer alle. zB alle 100us. Denn sonst wird's schnell eng.
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.
m.n. schrieb: > Selber verwende ich pro Motor eine Platine mit ATmega328 + A4982. Siehe hier: Beitrag "Schrittmotoransteuerung mit A4982 und ATmega328"
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.