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 Trimpotentiometer eingestellt werden. Genaueres hierzu im Datenblatt. Für kleinere 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.

Schliesslich 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.

Weitergehende Tests sind z.B. hier beschrieben. Hier sind Vereinfachungen der Ansteuerung des Schrittmotors beschrieben.


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 Motior 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 Beisppiel 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 überschschauen 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 ausserhalb 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 ausserhalb 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.

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