Atmel AVR Mikrocontroller mit OpenSuse: Schrittmotoransteuerung

Schrittmotoren drehen  bei Anlegen einer Spannung nicht einfach los wie „normale“ Gleichstrommotoren. Sie reagieren auf Stromimpulse. Die Achse bewegt sich beim Erhalt eines Impulses nur ein paar Grad weiter. Der genaue „Schritt“ ist je nach Motor verschieden. Bei einem Motor, bei dem die Schrittweite z.B. 3,6 Grad beträgt, sind also 100 Impulse (Schritte) notwendig, um die Achse einmal um sich selbst drehen zu lassen. Mit Schrittmotoren kann somit sehr genau positioniert werden. Man findet sie in Druckern, Kopieren,  etc.

Die Ansteuerung eines Schrittmotors ist komplex. Schrittmotoren gibt es zudem noch in unterschiedlichen Varianten. Mit dem AVR kann man die Phasenwechsel bei mehreren Spulen, die für das Drehen der Achse erforderlich sind, komplett in Software erzeugen. Man benötigt dann nur einen Lasttreiber, der den Motor direkt ansteuert. Allerdings gibt es mit dem Bauteil L297 diese Funktionalität schon als Hardware. Den Lasttreiberbaustein gibt es in Form des L298 auch schon. Mit ein paar zusätzlichen Bauteilen lässt sich eine Schaltung zusammenstellen, bei der die Motorgeschwindigkeit über einen anzulegenden Takt (CLOCK) bestimmt wird. Die Drehrichtung kann gesteuert werden (CW/CCW).

Die Ansteuerschaltung findet sich z.B. im Datenblatt des L298 oder hier.


Zwei kleine Schrittmotoren. Der linke ist ein 12V/150mA Typ, der rechte wird mit 5V betrieben und stammt aus einem Scanner. Beide haben jeweils 4 Spulen, von denen jeweils ein Anschluss herausgeführt (4 Kabel) und der andere Anschluss mit denen der anderen Spulen zusammengeschlossen ist (1 Kabel). Somit haben beide Motoren 5 Kabel.

Für einen einfachen Test reicht ein Billig-Schrittmotor, z.B. von Pollin. Im Bild unten ist die Schaltung auf einer Lochrasterkarte aufgebaut. Ein Aufbau auf einem üblichen Experimentierboard ohne Löten ist leider nicht einfach, weil der L298 nicht vernünftig in das Board passt. Auf dem Board kann man unten links die Steueranschlüsse zum AVR, oben mittig die Ausgänge für zwei Motorspulen und unten rechts die 5V-Zuführung sehen. Der Schrittmotor, auch wenn er z.B. nur für 12V ausgelegt ist, wird über den Anschluss oben links mit ca. 36V angesteuert. Der L298/L297 begrenzt dabei den Strom, der durch die Motorwindungen fließt. Der maximale Strom wird am L297 über den Pin Vref eingestellt. Die Höhe der Referenzspannung kann aus den Motordaten berechnet und über einen Spannungsteiler mit Trimmpotentiometer eingestellt werden. Genaueres hierzu im Datenblatt (so etwa Vref = Imotor * Rsense * 1,44). Für kleine Motoren ist kein Kühlkörper für den L298 erforderlich. Bei meinem 12V/150mA-Schrittmotor wird der L298 auch nach längerem Betrieb nicht wirklich lauwarm. Ich habe beim Austesten auch keine 36V angelegt, sondern bin mit 12-15V gut gefahren. Der Motor ist auch dann kräftig. Bei meinem Motor aus einem Scanner, ist die maximale Drehzahl, die ich erreichen konnte, relativ niedrig, ich schätze unter 300U/min.


Schrittmotoransteuerung mit L297/L298

Mit einem trivialen Ansteuerprogramm, welches in einer Schleife auf einem Port negative Impulse ausgibt, dreht sich bereits der Motor. Über Warteschleifen lässt sich die Drehgeschwindigkeit variieren etc.

Ich experimentiere mit einem Schrittmotor AEG SO21/24 (5V, 24 Schritt pro Umdrehung, Motor mit 5V angesteuert) weiter und lerne folgendes: 1) Nachzählen ergibt: 100 Umdrehungen werden in in 47 Sekunden durchgeführt. Dabei war die Clock Frequenz der Ansteuerung 50Hz, gemessen mit Oszilloskop. In 47 Sekunden wurden also 47*50=2350 Impulse an den Schrittmotor geschickt. Dies hat zu 100 vollen Umdrehungen geführt. Somit benötigt der Schrittmotor etwa 23,5 Impulse für eine volle Umdrehung. Laut Herstellerangabe benötigt der Motor „ca. 24 Schritte/Umdrehung“. Meine Messung kommt also gut hin. 2) Im nächsten Schritt habe ich die Clock Frequenz soweit erhöht, bis es zu Anlaufschwierigkeiten kam (trotz einer kleinen Ramp-Up-Phase, in der die Frequenz reduziert wurde). Gerade so noch ordentlich lief der Motor mit einer Clock Frequenz von 138Hz, gemessen mit Oszilloskop. Dies führt rein rechnerisch zu 138/24 = 5,75 Umdrehungen pro Sekunde bzw 345 U/min. Wie nachkontrollieren, ob das stimmt? Der Motor dreht für ein Mitzählen leider schon zu schnell. Daher habe ich mir aus einer Lichtschranke, die ich aus einer Maus ausgelötet habe, schnell eine Meßmöglichkeit gebastelt. Wenn etwas in die Lichtschranke gehalten wird, wird der Fototransistor sperrend. Mit einer Minischaltung kann die Lichtschranke genutzt werden. Auf die Achse des Motors stecke ich eine Büroklammer und biege einen Bügel so ab, dass er durch die Lichtschranke hindurchläuft.


Nutzung der Lichtschranke aus einer alten Maus zur Messung der Drehzahl des Schrittmotors: Der Lichtschrankenbaustein hat 4 Anschlüsse, mit A,K und C,E benannt. A,K sind Anode/Kathode einer LED, C,E sind Kollektor und Emitter eines lichtempfindlichen Fototransistors. (Widerstand 1K von Anode an +5V, Widerstand 10K von Collector an +5V, Kathode und Emitter an 0 Volt. Abgreifen des Signals an Collector).

Der Lichtschrankenbaustein (gemäß Aufschrift „Omron 1041 R78“, entpuppt sich bei Google Suche als „EE-SX 1041 Photomicrosensor“)

Ausgabe der pro Umdrehung erzeugten Lichtimpulse am Oszillograph („5,68 Hz“).

Am Oszilloskop können die Impulse nun sichtbar gemacht werden und so die Frequenz gemessen werden. Ich messe beispielhaft 5,64 dann 5,68 und 5,78 Hz. Die gemessenen Werte stimmen also ziemlich gut mit den errechneten überein.

Schließlich habe ich probeweise die Speisespannung für den Motor erhöht, auf 10V, 15V und 20V. Dann kann man auch die Zahl der Drehimpulse pro Sekunde erhöhen und der Motor läuft schneller. Wenn die Speisespannung nicht erhöht wird, aber die Zahl der Impulse pro Sekunde, hört der Motor einfach auf zu drehen.

Die höchste Drehzahl, die ich mit dem SO 21/24 erreichen konnte, waren 1071 Umdrehungen pro Minute bei 15V. Eine weitere Steigerung auf 20V brachte kein neues Potential, um die Drehzahl zu erhöhen.


Beispiel einer kommerziellen Schrittmotor-Karte: Die Tiny-Step Schrittmotorkarte (1 Kanal)Die Karte basiert auf dem Chip A3977 und unterstützt uni- und bipolare Motoren. Via Jumper kann Vollschritt-, Halbschritt- 1/4-Schritt und 1/8-Schritt-Betrieb eingestellt werden. Zwei LEDs informieren über den Betriebszustand (Power, Takt) und ein 10-poliger Wannenstecker erlaubt die Verbindung zum AVR (oder sonstwohin). Die Karte kann ungekühlt bis zu 2,25A Motorstrom liefern.

Ramping

Wenn ein Schrittmotor mit einer möglichst hohen Schrittfrequenz betrieben werden soll, ist es ungünstig, den gewünschten Schritt-Takt mit der maximal hohen Frequenz ab dem ersten Schritt des Motors zu verwenden. Der Motor hat eine träge Masse, die erst mal bei geringeren Frequenzen in Bewegung gesetzt werden muss, um den Motor dann mit der vollen Frequenz zu betreiben. Wenn man das nicht beachtet, kann es in der Anlaufphase zum Überspringen von Takten kommen, der Motor wirkt in der Phase kraftlos und gibt wirre Geräusche (und Bewegungen) von sich. Im schlimmsten Fall läuft der Motor nicht an.

Dem kann man vorbeugen, indem man „Ramping“ einsetzt. Dies bedeutet, in einer Startphase (und evtl. auch in einer Stop-Phase) wird die Taktfrequenz kontrolliert reduziert. Die Phase mit reduzierter Frequenz wird „Rampe“ genannt.

Im den folgenden Bildern ist eine Ansteuerung eines Schrittmotors unter Verwendung von Start- und Stop-Rampen dargestellt. Da der Motor am Ende eines Zyklus‘ in diesem Beispiel die Richtung wechselt, ist eine Rampe am Ende des Zyklus‘ (um die Eigenrotation der Achse nach dem letzten Takt zu reduzieren angebracht.


In Gelb (oben) ist das Signal für den Richtungswechsel zu sehen. In Blau (unten) das Signal für den Motortakt (Takte sehr eng zusammen, so dass man genügend Takte überschauen kann). Dargestellt ist der Zeitraum direkt vor und nach einem Richtungswechsel.

Man sieht in obigem Bild, dass das Ramping in der Anhalte-Phase des Motors die Schritttakte immer länger werden lässt, d.h. die Frequenz des Schritttakts sinkt. Nach dem Richtungswechsel des Motors  sorgt das Ramping in der Startphase dafür, das die Taktfrequenz am Anfang gering ist und gegen Ende der Startphase den Endwert, der außerhalb der Ramp-Phasen genutzt werden soll, erreicht.


Einzelne Schritttakte in der Anfangsphase der Start-Rampe.
Die Takte sind ca 2ms breit, der Schrittakt daher etwa langsame 500 Herz. Da der verwendete Schrittmotor 1,8 Grad / Schritt benötigt, also 200 Takte für eine Umdrehung benötigt, hat der momentan momentan eine Drehzahl von 500/200=2,5 U/sec = 150 U/min

Hier einzelne Schritttakte außerhalb der Ramp-Phasen. Die Takte sind nur noch  632µs lang, der Schritttakt daher hohe 1580 Herz. Der Motor hat in dieser Phase eine Drehzahl von ca. 8 U/sec = 480U/min.

Man kann das Ramping so implementieren, dass die Frequenz kontinuierlich gegen den gewünschten Endwert steigt bzw. fällt oder auch in Stufen.

Verwendungsbeispiel

Die Standardschaltung einer Schrittmotorsteuerung mit L297/298 habe ich hier als einseitige Platine entworfen.

Mit  dieser Schrittmotorsteuerung, einem Schrittmotor sowie mechanischen Teilen aus einem Laserdrucker sowie etwas Altaluminium wurde ein Experimentierantrieb zusammengebaut.


Gesamtansicht des Experimentier-Antriebs mit Zahnriemen

Zum Motor gehört ein Ritzel, „Zahnscheibe“ genannt, ein Zahnriemen und eine Umlenkrolle mit Zähnen.

Der japanische Zahnriemen trägt die Bezeichnung „B420MXL6,4“, ein Herstellername ist nicht zu finden. Eine Websuche bringt aber Informationen zum Riemen: 6,4 steht für die Breite in mm, 420 ist die Anzahl der Zähne. Die Wirklänge des Riemens ist 853,44mm. Die „Teilung“ beschreibt den Abstand der Zähne in mm, es sind bei diesem Riemen 2,032mm (0,08“).

Als Grundträger für die einzelnen Teile wurde ein Aluminium-U-Profil hergenommen (ALFER, 65x35mm, 2,5mm Dicke).

Die Führungsstange aus dem Laserdrucker wurde ebenfalls wiederverwendet. Diese Stange aus poliertem Stahl wurde in zwei Endblöcke aus Aluminium eingefasst (ebenfalls ein ALFER-Profil) und auf dem Grundträger montiert. Der Grundträger hat an beiden Enden noch viel Platz für weitere Anbauten.

Auf der Führungsstange mit 8,1mm Durchmesser läuft ein „Läufer“, ebenfalls aus einem Aluminiumprofil gesägt. In das Profil wurden zwei Löcher von 7,9mm gebohrt und auf ca 8,1mm aufgefeilt. Wegen der Lärmentwicklung beim Reiben der Metallteile aufeinander habe ich die Löcher später auf 10mm erweitert und zwei Hartkunststofflagerbuchsen (auch aus dem Drucker) eingetrieben. Dann läuft der Schlitten schon viel ruhiger.

An einem Ende wurde ein kleiner Taster so eingebaut, so dass der Schlitten ihn schließt, wenn er dagegen fährt. Dieser Taster dient als Endabschalter. (Für einen starken Motor würde man den Schalter so nicht befestigen, da der Motor den Schalter zerstören könnte. Für das verwendete schwache Motor-Exemplar ist das aber kein Problem.)


Endabschalter

Am anderen Ende wurde die Schrittmotorsteuerungsplatine ins Profil eingebaut. Schließlich wurde noch ein AVR-Boad (mein „DD Megaboard„) eingebaut, um die Motorsteuerung anzusteuern.


Sicht auf Riemenscheibe und Lagerblock

An das AVR-Board wurden die Anschlüsse CLOCK, DIRECTION und HALF/FULL STEPPING sowie der Endabschalter angeschlossen.


Befestigung des AVR-Boards


Sicht auf die komplette Elektronik

Informationen zum verwendeten Szenario

Motor TECO 4H01 8M0303

  • Grad/Schritt 0,9 -> Impulse für eine Umdrehung: 400

Zahnscheibe am Motor

  • Durchmesser 12,5mm -> Umfang: 39,27mm

Zahnriemen

  • Riemen Wirklänge 853,44mm , 420 Zähne, Teilung 2,032, Breite 6,4mm.

Antriebsabmessungen

Länge theoretischer Gesamtverfahrweg 353mm

  • Abzug für 2xhalbe Schlittenbreite: 2*17,5=35mm
  • Abzug Sicherheitsabstand: 2x10mm
  • Nutzbarer Verfahrweg: 298mm

Werte für das steuernde Programm

  • Verfahrweg pro Impuls: 0,09817mm
  • Impulse für 1mm Verfahrweg: 10,186
  • Impulse für nutzbaren Verfahrweg: 3035
  • Impulse für Sicherheitsabstand ab Endabschalter-Position: 102

Der Verfahrweg pro Impuls liegt so nahe an 0,1mm, dass es wahrscheinlich tatsächlich genau 0,1mm=100µm sind, die Abweichung von 2% liegt vermutlich an meinen Messfehlern. Unter dieser Annahme ist es dann etwas einfacher:

  • Verfahrweg pro Impuls: 0.1mm
  • Impulse für 1mm Verfahrweg: 10
  • Impulse für nutzbaren Verfahrweg: 2980
  • Impulse für Sicherheitsabstand ab Endabschalter-Position: 100

Weiterführende Informationen

Wer das Thema Schrittmotor vertiefen will, stöbert am Besten auf den Seiten von http://www.roboternetz.de. Dort wird das Thema erschöpfend behandelt.

Spezielle Infos zu Schrittmotoren und deren Ansteuerung : http://www.roboternetz.de/wissen/index.php/Schrittmotor

Zurück zur Hauptseite