Pfad:
Home =>
AVR-Übersicht =>
Anwendungen => Steppermotor-Steuerung
(This page in English:
)
Schrittmotor-Steuerung mit ATtiny13
Diese Anwendung eines AVR beschreibt die Steuerung eines Schrittmotors mit einem ATMEL ATtiny13 mit
folgenden Eigenschaften:
- Konzipiert für die Fernsteuerung von Schrittmotoren mit Getriebe.
- Eine Eingangsspannung von 0..5 V mit einer Auflösung von 10 Bits (1024 auflösbare
Schritte, Schrittweite: 4,88 mV) steuert die Stellung des Schrittmotors.
- Anzahl der gesamten Schrittanzahl bis 65.535 einstellbar, daher nahezu beliebige
Getriebeübersetzungen per Software einstellbar.
- Einfachste Ansteuerung des Schrittmotors.
- Sehr schnelle Einstellung durch optimale Anpassbarkeit an die maximale Drehgeschwindigkeit
des Motors.
- Optimale Reduzierung des Strombedarfs durch Abschaltung der Spulen nach Verstellung.
Eine alternative Schrittmotorsteuerung mit dem ATtiny24 für den 5 V-Schrittmotor
28BYJ-48, die zwischen zwei einstellbaren Positionen um bis zu +/-90° hin- und herfährt,
siehe diese Seite.
Die Hardware besteht aus dem AVR-Prozessor ATtiny13, einem sechspoligen
Standard-In-System-Programmieranschluss (ISP), einem 7-Bit-Treiber
ULN2003, der Stromversorgung für den Prozessor und der Filterung der
Eingangsspannung. Das Schaltbild (Anklicken für höher
aufgelöstes PDF-Format):
Der Prozessor ATtiny13 hat folgende Funktionen.
Die Betriebsspannung von 5 V wird über die
Pins 8 (+5 V) und 4 (0 V) zugeführt und
mit einem Keramikkondensator von 100 nF abgeblockt.
Pin 1 (= RESET-Eingang) liegt über einen Widerstand von
10 kOhm an der positiven Betriebsspannung.
Der Eingang PB4 (Pin 3) misst über einen internen AD-Wandler
die anliegende Analogspannung durch Vergleich mit der Betriebsspannung.
Die Software errechnet daraus die Soll-Stellung des Schrittmotors.
Die Ausgänge PB0 bis PB3 (Pins 5, 6, 7 und 2) steuern die Treiber
für die Schrittmotor-Magnete an.
Das ISP-Interface dient der Programmierung des AVR in der
fertig aufgebauten Schaltung. Die Beschaltung entspricht dem
ATMEL-Standard.
Für ISP verwendet werden die Portbits PB2 (SCK, Pin 7), PB1
(MISO, Pin 6), PB0 (MOSI, Pin 5) sowie der RESET an Pin 1
verwendet. Die Betriebsspannungsanschl sse VTG und GND versorgen
eventuell das externe ISP-Interface, hat dies eine eigene Versorgung
ist VTG offen zu lassen.
Die Antriebsströme für die Magnete des Schrittmotors werden
vom Treiberbaustein ULN2003A gesteuert. Die Ausgänge mit
Open-Collector-Treibertransistoren vertragen hohe Spannungen von
50 V, Ströme bis 500 mA und schalten die einzelnen
Magnete des Motors ein und aus.
Induktive Überspannungen an den Kollektoren werden über
die eingebauten Dioden am Anschluss CD kurzgeschlossen. Der hier
verwendete Motor wird mit 12 V Betriebsspannung betrieben und
zieht pro Magnet ca. 150 mA Strom (da im Betrieb immer zwei
Magnete angesteuert werden zusammen 300 mA).
Die Eingänge I7..I4 des Treiberbausteins werden vom Prozessor
angesteuert (aktiv high, logisch 1 schaltet Magnet an).
Bei der Stromversorgung auf der Steuerung wurde auf eine hohe
Festigkeit gegenüber den Schaltströmen der Magnete gelegt.
Die Versorgung der Magnete erfolgt gegen Verpolung über eine Diode
1N4007 mit einem Glättungskondensator von 100 µF.
Der Prozessor wird über eine eigene 5 V-Versorgung
betrieben, die mit einer Diode 1N4007 und einem
Glättungskondensator von 100 µF aus der
12 V-Versorgung abgeleitet ist. Der Spannungsregler 78L05 ist
mit Tantalkondensatoren von 1 µF bzw. 2,2 µF
gegen Schwingungen gesichert.
Die Versorgung der Steuerung erfolgt über ein vieradriges
Kabel aus einem 12 V-Netzteil (Klick auf Bild fürt zu
höher aufgelöstem PDF-Dokument).

Die Stromversorgung ist auf einer kleinen Leiterplatte aufgebaut.
Die Software für den ATtiny13 ist in Assembler geschrieben, der
Quellcode ist hier erhältlich.
Die Software besteht aus folgenden Grundelementen:
- der Reset- und Interruptvektor-Tabelle,
- der Initiierung der Anfangswerte und der Hardwarekomponenten,
- der AD-Wandler-Messung der Eingangsspannung,
- der Umrechnung des Ergebnisses in den Sollwert,
- der Schrittsteuerung und der Ausgabe an den Schrittmotor.
Reset- und Interruptvektor-Tabelle
Die Vektortabelle verzweigt bei einem Reset zum Hauptprogramm, bei den
beiden Interrupts des Timer/Counters und des AD-Wandlers zu den entsprechenden
Behandlungsroutinen. Nicht verwendete Vektoren sind mit RETI abgeschlossen.
Iniitierung Anfangswerte
Die Initiierung der Anfangswerte erfolgt ab dem Label "Main:". Hier wird
- der Stapel initiiert, da mit Interrupts und Unterprogrammen gearbeitet
wird,
- das Flaggenregister gelöscht (Funktion siehe unten),
- der Soll- und Ist-Wert des Schrittmotors auf Null gesetzt,
- der Abschaltzähler gesetzt.
Initiierung Hardware
Die Initiierung der Hardware umfasst:
- die Richtung der vier Portbits PB0 bis PB3 als Ausgang und
die Bits auf den ersten Schritt des Steppermotors setzen,
- den Zähler für den AD-Wandler auf 64 setzen, das
Summenergebnis der Wandlungen löschen, den Digitaleingang von
PB4=ADC2 abschalten (wird nicht benötigt, PB4 dient
ausschließlich der AD-Messung), die AD-Wandler-Mux fest auf
Kanal ADC2 einstellen, und den AD-Wandler mit folgenden Einstellungen
starten:
- Referenzspannung ist die Betriebsspannung des ATtiny13,
- Taktteiler=128, bei 1,2 MHz internem Takt und
13 Taktzyklen pro Messung braucht jede Messung 1,387 ms,
Aufsummieren von jeweils 64 Messungen ergibt einen fertigen
Messwert alle 88,75 ms oder 11,3 Messwerte pro Sekunde.
- Interrupt nach jeder abgeschlossenen Messung,
- kein automatischer Neustart der nächsten Messung (wird beim
Interrupt neu gestartet).
- der Timer/Counter 0 wird auf normalen CTC-Modus (Löschen des
Zählers bei Erreichen des Vergleichswerts) eingestellt, mit
folgenden Eigenschaften:
- die Dauer eines CTC-Zyklus ist so lange wie die Ausgabe für
einen Schritt des Motors dauert und wird durch die Konstante cCmpA
bestimmt, die in das Compare-Register A des Counters geschrieben
wird,
- nach jedem CTC-Zyklus wird ein Interrupt ausgelöst, der
Compare-Match-Interrupt A wird ermöglicht,
- der Vorteiler wird auf 1024 eingestellt, der Counter-Takt
beträgt daher 1,2 MHz/1024 = 1,172 kHz, mit
CTC-Werten zwischen 1 und 255 ergeben sich Frequenzen zwischen
1172 und 4,6 Hz für die Ansteuerung des Schrittmotors.
- der Prozessor wird auf Schlafmodus eingestellt, d.h. zwischen den
Interrupts des Counters und des AD-Wandlers ist der Programmablauf
unterbrochen.
AD-Wandler-Messung der Eingangsspannung
Der AD-Wandler wandelt die Eingangsspannung an Pin 3 (PB4, ADC2)
in einen Wert zwischen 0..1023 um und löst nach jedem Abschluss
der Wandlung einen Interrupt aus. Die Interrupt-Behandlungsroutine
ab dem Label "AdcInt:" holt das Ergebnis von den Ports ADCL und ADCH ab
und summiert es 16-bittig zu dem Registerpaar rAdcH:rAdcL. Der
Zähler rAdc wird um eins herangezählt. Erreicht er Null,
dann wird die bis dahin erreichte Summe in das Registerpaar
rAdcRH:rAdcRL kopiert, die Summe wieder auf Null gesetzt, der
Zähler wieder auf den Anfangswert 64 und die Flagge
bAdc im Flaggenregister gesetzt. Abschließend
wird der AD-Wandler erneut gestartet.
Der Summiervorgang bewirkt, dass jeweils 64 Messwerte gemittelt
werden, wodurch absichtlich der Ablauf verlangsamt und die Messung
von zufälligen und durch Einstreuung verursachten Schwankungen
unabhängiger wird. Der resultierende Summenwert liegt zwischen
Null und 65535 (0x0000..0xFFFF).
Umrechnung des Messergebnisses in den Sollwert
Ist nach einem Interrupt die Flagge bAdc im Flaggenregister gesetzt,
wird die Umrechnungsroutine ab dem Label "AdcRdy:" aufgerufen. Diese
- löscht das Flaggenbit wieder,
- kopiert den Summenwert in das Registerpaar rAdcCH:rAdcL,
- multipliziert den Summenwert mit der Konstanten cSmSteps (der
Anzahl Schritte, die der Schrittmotor bei Vollausschlag in
Vorwärtsrichtung machen soll), zu einem 32-Bit-Ergebnis,
- rundet die untersten 16 Bits,
- teilt das Ergebnis durch 65536, so dass sich die Sollschritte
zu einem 16-Bit-Ergebnis ergeben, und
- schreibt das Ergebnis in das Soll-Registerpaar rSmSH:rSmSL
(wobei Interrupts zeitweilig abgeschaltet werden, damit es nicht
zu Fehlansteuerungen des Schrittmotors kommt).
Schrittsteuerung und Ausgabe an den Schrittmotor
Die Schrittsteuerung und die Ausgabe an den Schrittmotor erfolgt
in der Interrupt-Behandlungsroutine des Counters ab dem Label
"Tc0IntCA:".
Zunächst wird der Ist-Wert mit dem Soll-Wert des Schrittmotors
16-bittig verglichen. Sind beide gleich, dann wird nach dem Label
"Tc0IntCA0:" verzweigt. Hier wird der Verzögerungszähler
im Registerpaar X um eins verringert. Ist er Null, werden die
Magnete des Schrittmotors durch Schreiben von Null auf den
Ausgabeport abgeschaltet, der Verzögerungszähler
wieder auf seinen Anfangswert gesetzt und die Behandlungsroutine
beendet.
Ist der Ist- und Sollwert nicht gleich, wird der Ist-Wert um einen
Schritt vor- bzw. rückwärts verändert. Aus dem
Ist-Wert wird der nächste Schritt des Schrittmotors
ermittelt:
- die beiden untersten Bits des Ist-Wertes werden isoliert, und
- zur Anfangsadresse "SmTab:" im Flash-Speicher addiert,
- mit LPM wird der Inhalt des Bytes in das Register R0 eingelesen,
und
- an den Ausgabeport geschrieben, der die Treiber der Magnetspulen
des Schrittmotors ansteuert.
Die Tabelle "SmTab:" mit den beiden Worten 0x0605 und 0x090A
enthält die Schrittfolge des Schrittmotors in der Reihenfolge
- Schritt 1: 0x05, binär 0 1 0 1,
- Schritt 2: 0x06, binär 0 1 1 0,
- Schritt 3: 0x0A, binär 1 0 1 0,
- Schritt 4: 0x09, binär 1 0 0 1.
Anmerkung: Sind die Spulen Q1..Q4 des Schrittmotors in anderer
Reihenfolge an die Treiberausgänge angeschlossen, genügt
es, diese Tabelle entsprechend umzustellen (siehe unten).
In der Behandlungsroutine wird abschließend der
Verzögerungszähler wieder auf seinen Anfangswert
gesetzt, um die Magnete für die die voreingestellte Zeit
im aktiven Zustand zu halten.
Im Assembler-Quelltext sind folgende Einstellungen vor dem
Assemblieren vorzunehmen:
- Die drei Debug-Schalter debug_calc, debug_const und debug_out
müssen auf Null gesetzt sein!
- Die Konstante cSmSteps muss auf die Anzahl Schritte eingestellt
werden, die der Schrittmotor von Null bis Vollausschlag
zurücklegen soll (Maximalwert: 65535).
- Die Konstante cSmFreq muss auf die Frequenz eingestellt werden,
mit der der Schrittmotor angesteuert werden soll und die der
verwendete Schrittmotor noch gut bewältigt (minimal
5 Hz, maximal 1171 Hz).
- Die Konstante cSmDelay gibt die Anzahl Takte an, nach denen
bei Erreichen des Sollwertes die Magnete des Schrittmotors
weiter aktiv sein sollen. Ist cSmDelay gleich groß wie
cSmFreq, beträgt der Verzögerungszeitraum genau eine
Sekunde.
Die Anschlussreihenfolge der vier Magnete an der Buchse J2 ist
nicht bei allen Schrittmotoren gleich. Wird eine andere
Anschlussfolge der Magnete des Schrittmotors Q1 bis Q4 verwendet
oder soll die Drehrichtung des Motors umgekehrt werden, muss nur
die Tabelle SmTab: angepasst werden.
Die bestehende Tabelle für den KP4M4-001 ist
folgendermaßen aufgebaut:
Magnet | Farbe | Portbit | Step 1 | Step 2 | Step3 | Step 4 |
Q1 | rot | PB3 | 0 | 0 | 1 | 1 |
Q2 | grün | PB1 | 0 | 1 | 1 | 0 |
Q3 | braun | PB2 | 1 | 1 | 0 | 0 |
Q4 | weiß | PB0 | 1 | 0 | 0 | 1 |
Daraus ergeben sich folgende Kodierungen:
Step | Magnet | Portbit | Byte | Word |
Q4 | Q3 | Q2 | Q1 | PB3 | PB2 | PB1 | PB0 |
1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 0x05 | 0x0605 |
2 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0x06 |
3 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 0x0A | 0x090A |
4 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0x09 |

Der Quellcode in .asm-Textformat ist hier erhältlich, in
.html-Format hier.
©2007-2018 by http://www.avr-asm-tutorial.net