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