Posts Tagged ‘Shield’

Stromregler als Ursache für Positionierfehler im Mikroschritt

Sonntag, September 4th, 2016

Schrittmotor-Treiber ICs werden immer leistungsfähiger, kleiner und preiswerter. Mikroschrittauflösungen von 1/16 oder 1/32 sind heute bereits Standard, Auflösungen bis 1/256 eines Vollschritts sind ebenfalls verfügbar. Dass diese höhere Auflösung nicht mit der erreichbaren Positioniergenauigkeit gleichzusetzen ist, wurde hier bereits im Beitrag „Die Bedeutung des Lastwinkels bei Schrittmotoren“ diskutiert. Neben den mechanischen Einflüssen wie der angetrieben Last und der Fertigungsqualität des Schrittmotors gibt es aber einen weiteren, nicht zu unterschätzenden Einflussfaktor: Die Schrittmotorsteuerung selbst.

In verschiedenen Foren zu den Themen 3D-Druck und low-cost CNC finden sich Hinweise, dass es speziell bei einigen mit A4988 oder DRV8825 bestückten „Shields“, z.B. von Pololu und deren Nachbauten (z.B. StepStick), Genauigkeitsprobleme bei langsam laufenden Motoren gibt. Dabei scheint der Motor einen Mikroschritt auszulassen bzw. zu überspringen. Besonders kleine Motoren mit niedrigen Strömen sind für diesen Effekt anfällig. Eine kontroverse Diskussion dazu findet sich z.B. im deutschen Teil des Reprap-Forums unter dem Titel „A4899 / DRV8825 Decay Hack“ (Achtung, Zahlendreher im Thread-Titel. Richtig ist A4988!). Ein übersprungener 1/16-Schritt scheint auf den ersten Blick kein großes Problem zu sein. Der dabei entstehende Winkelfehler beträgt lediglich 0,1125°, was besonders bei mechanisch einfachen Aufbauten wenig erscheint. Wie sehr sich dieser Fehler z.B. beim 3D-Druck auf die Oberflächen-Qualität auswirken kann, zeigt das Beispiel des Reprap-Users „lukie80“ aus o.g. Diskussion. Anhand der gedruckten Musterbeispiele erkennt man deutlich den Einfluss der Treiber-Einstellungen auf die Bauteilqualität, wenn der Extruder von einem Treiber angesteuert wird, der das hier besprochene Problem aufweist.

Durch Mikroschritt-Abweichungen verursachte Artefakte beim 3D-Druck [Quelle: Reprap-Forum, user

Durch Mikroschritt-Abweichungen verursachte Artefakte beim 3D-Druck [Quelle: Reprap-Forum, user „lukie80“]

Was ist nun eigentlich die Ursache für dieses Problem? Vereinfacht gesagt schafft es das Treiber-IC nicht, den Wicklungsstrom in der Nähe des Nulldurchgangs fein genug zu regeln. Der für den ersten Mikroschritt nach dem Nulldurchgang nötige geringe Strom fällt dadurch zu hoch aus, so dass der Motor bereits beim ersten Mikroschritt weiter dreht als eigentlich gewünscht. Beim nächsten Mikroschritt fällt die Bewegung entsprechend kleiner aus. Neben der Positionsabweichung kann der ungleichmäßige Lauf auch zu störenden Geräuschen und Vibrationen der angetrieben Mechanik führen. Allegro MicroSystems weist im Datenblatt des A4988 explizit auf diese Problematik hin und liefert gleich eine mögliche Lösung mit. Einen Hinweis darauf gab es bereits 2012 im Blog von Hydraraptor. Die dort diskutierte Verlängerung der Ausschaltzeit t_off führt dazu, dass der Stromregler so langsam wird, dass er im hörbaren Bereich arbeitet. Beim A3977 oder dem in der Tiny-Step II verwendeten Nachfolger A3979 kann dagegen über ein RC-Glied auch die minimale Einschaltzeit (und die Dauer der Fast-Decay Phase) beeinflusst werden, wodurch die Schaltfrequenz höher ausfallen kann und der Effekt abgemildert wird.

Abweichung vom Stromsollwert nach dem Nulldurchgang bei Slow-Decay [Quelle: Datenblatt A4988].

Abweichung vom Stromsollwert nach dem Nulldurchgang bei Slow-Decay [Quelle: Datenblatt A4988].

Ob dieses Problem auftritt, hängt also davon ab, welche Art der Stromregelung das verwendete IC in welcher Phase benutzt. Moderne Treiber-ICs unterstützen verschiedene Betriebsarten der Stromregelung (Slow-, Mixed- und Fast-Decay) und müssen vom Schaltungsentwickler entsprechend auf den jeweiligen Motor angepasst werden. Bei der Entwicklung universell einsetzbarer Schrittmotorsteuerungen (die also nicht für einen konkreten Motor entwickelt werden), muss ein geeigneter Kompromiss zwischen den Vor- und Nachteilen der verschiedenen Betriebsarten gefunden werden. Eine nachträgliche Anpassung durch den Anwender ist in der Regel nicht vorgesehen und würde viele Benutzer wohl auch überfordern. Beim L297 konnte man den Effekt beim Wechsel von slow decay auf fast decay (dort noch Phase bzw. Inhibit chopping genannt) leicht durch Ausprobieren herausfinden, z.B. auf der 3D-Step durch Änderung des Jumpers „MODE“. Heutige Treiber unterstützen deutlich mehr unterschiedliche Einstellungen, die z.T. durch Anpassen von Bauteilwerten justiert werden müssen. Die Unterschiede im Regelungsverhalten treten außerdem nicht mehr so deutlich zu Tage wie beim L297.

Bei den Motorshields mit A4988 und DRV8825 wurden die Hinweise in den Datenblättern offenbar übersehen, nicht verstanden oder aus anderen Gründen nicht umgesetzt. Im Blog von Cabristor findet sich eine Problemanalyse zum Thema. Als Abhilfe-Maßnahme werden dort zusätzliche Dioden in den Zuleitungen zum Motor eingesetzt, was aber entsprechende Verluste in den Dioden verursacht, die effektiv an der Wicklung liegende Spannung reduziert und somit letztlich die Dynamik des Motors reduziert. Wirksamer ist unter Umständen eine Anpassung direkt auf dem Motorshield. Anwendern der betroffenen Module bleibt damit die Möglichkeit, selbst zum Lötkolben zu greifen und die Shields zu patchen, wie es auch im Reprap-Forum beschrieben ist. Beim A4988 muss der Pin ROSC auf Masse (GND) gelegt werden, um Mixed-Decay auch in Phasen des Stromaufbaus zu aktivieren. Diesen Betrieb unterstützt der DRV8825 nicht. Es bleibt nur die Möglichkeit, vollständig auf Fast-Decay umzuschalten, indem Pin19 (DECAY) auf +5V gezogen wird. Nachteil ist ggf. ein höheres Betriebsgeräusch der Motoren durch den höheren Ripple-Anteil im Motorstrom. Bei offenem Pin arbeitet der Treiber zwar mit Mixed-Decay, allerdings nur in Phasen in denen der Strom abgebaut werden soll.

Inzwischen sollen Motorshields mit den genannten Treibern erhältlich sein, die bereits entsprechend geändert sind. Ob die Änderungen für größere Schrittmotoren ebenfalls optimal sind, muss man im Zweifelsfall ausprobieren. Bei Motor-Treibern mit Konfigurationsmöglichkeit über eine digitale Schnittstelle (wie SPI oder I²C) bieten sich je nach konkreter Realisierung der Schrittmotorsteuerung auch für den Endanwender Möglichkeiten, den Treiber an den verwendeten Motor anzupassen. Bei ICs mit externer H-Brücke bzw. externen FETs kann sogar das Zeitverhalten der H-Brücke angepasst werden. Interessante Konfigurationsmöglichkeiten bietet z.B. der DRV8711 von TI, den ich auf meinem neuen Schrittmotor-Treibermodul smOOver.drv einsetze. Durch die guten Einstellmöglichkeiten ergibt sich bei optimaler Anpassung auf den verwendeten Motor ein besonders weicher und ruhiger Motorlauf.

Ansteuern von Schrittmotoren mit Arduino

Montag, Mai 5th, 2014

Ein Arduino Controller kann verwendet werden, um eigenständige interaktive Objekte zu steuern oder um mit Softwareanwendungen auf Computern zu interagieren (z. B. Adobe Flash, Processing, diverse Skriptsprachen, Terminal etc.). Arduino wird beispielsweise auch an Kunsthochschulen genutzt, um interaktive Installationen aufzubauen. Die Hardware besteht aus einem einfachen I/O-Board mit einem Mikrocontroller und analogen und digitalen Ein- und Ausgängen. Die Entwicklungsumgebung verwendet die Programmiersprache Processing, die auch technisch weniger Versierten den Zugang zur Programmierung und zu Mikrocontrollern erleichtern soll. [Quelle: Wikipedia]

Um es Einsteigern in die Welt von Elektronik und Mikrocontrollern möglichst einfach zu machen, gibt es für die Arduino-Plattform eine große Vielfalt an steckbaren Erweiterungsmodulen, so genannte „Shields“. Auch für die Ansteuerung von Motoren sind diverse Shields erhältlich. Sie bestehen oft nur aus einem Treiberchip mit der minimalen Basisbeschaltung. Über die kleine Platine kann kaum Verlustleistung abgeführt werden, zudem fehlt es für größere Motoren an ausreichend dimensionierten Pufferelkos. Auch Schutzbeschaltungen (Kurzschlussschutz, Optokoppler in Richtung Controller) sind die absolute Ausnahme. Das Experimentieren mit Motoren kann so schnell zu einem frustrierenden Erlebnis werden, wenn mit den Motoren „reale“ Lasten angetrieben werden sollen. Im folgenden Beitrag wird gezeigt, wie man mit einem Arduino mit Hilfe der AccelStepper-Bibliothek über wenige I/Os nahezu alle Schrittmotorsteuerungen mit Takt-/Richtungsinterface ansteuern kann.

Zur Arduino Entwicklungsumgebung gehört auch eine einfache Bibliothek zur Ansteuerung von Schrittmotoren. Sie geht jedoch davon aus, dass die Motorwicklungen direkt oder mittels zwischengeschalteter Transistoren über die I/Os des Prozessors angesteuert werden (Verwendung von zwei Ausgängen je Motorwicklung, insgesamt 4 Ausgänge). Beschleunigungs- und Bremsrampen sind nicht vorgesehen. Durch diese einfache Ansteuerung lässt sich nur ein geringes Drehmoment bei niedrigen Drehzahlen erreichen. Die AccelStepper-Library unterstützt dagegen auch so genannte 2- und 3-Draht Interfaces sowie den Typ „Driver“. Gemeint ist damit die Ansteuerung von integrierten Treibern über Takt- und Richtungssignale. Es ist auch möglich, eigene Interface-Definitionen einzuführen, wie im Beispiel zu diesem Beitrag gezeigt wird. Wie der Name andeutet, implementiert die Lib außerdem Beschleunigungs- und Bremsrampen. Über die Bibliothek können zudem mehrere Motoren gleichzeitig angesteuert werden, was die Anwendungsmöglichkeiten von Arduino für Projekte mit Motoren deutlich erweitert.

Anschluss der Tiny-Step Endstufe an den Arduino Controller

Anschluss der Tiny-Step Endstufe an den Arduino Controller

Das Bild zeigt den Anschluss der Takt-Richtungsendstufe Tiny-Step II, welche auf dem A3979 von Allgero Micro basiert. Der Treiber realisiert Motorströme bis 2,25A bei bis zu 35V bei Mikroschritt-Auflösungen bis 1/16. Durch das durchdachte Kühlkonzept werden die genannten Leistungsdaten auch im Dauerbetrieb sicher erreicht. Der integrierte, selbstrückstellende Kurzschlussschutz sichert die Schaltung vor Schäden durch falsche Beschaltung. Neben den Anschlüssen für Takt und Richtung (grün und gelb) werden auch Ausgänge für Enable (Einschalten der Endstufe) und Stromabsenkung ausgegeben sowie ein Fehlersignal von der Endstufe über einen Eingang eingelesen. Diese Signale sind optional. Der fertige Aufbau ist im folgenden Bild zu sehen, angeschlossen ist ein Nema17 Motor mit 0,5Nm Haltemoment. Auch kleinere Nema23 Motoren können mit diesem Aufbau angesteuert werden.

Testaufbau mit Arduino, Tiny-Step und Schrittmotor von Nidec Servo

Testaufbau mit Arduino, Tiny-Step und Schrittmotor von Nidec Servo

Nach dem gleichen Prinzip und hier sogar mit der identischen I/O-Beschaltung lassen sich aber auch deutlich leistungsfähigere Endstufen an den Arduino anbinden. Das folgende Bild zeigt einen Aufbau mit einer Endstufe vom Typ LAM DS1078 (bis 14A bei bis zu 90V), die einen Nema34 Motor mit 3,1Nm antreibt. Die DS10-Serie ist eine industrietaugliche Serie von Schrittmotorendstufen mit SPS-kompatiblen I/Os. Durch den Einsatz dieser Kraftpakete ergeben sich mit dem Arduino ganz neue Möglichkeiten.

Testaufbau mit LAM DS1078

Testaufbau mit LAM DS1078

Das Programmierbeispiel (Arduino-Projekte werden auch Sketch genannt) ist auf Git-Hub frei zum Download verfügbar. Ich würde mich über Rückmeldungen zum Einsatz der Accellib freuen.