Pfad:AVR-DE => Anwendungen => ATtiny24-Schrittmotorsteuerung
stepper_tn24 Klein Anwendungen von
AVR-Einchip-Prozessoren AT90S, ATtiny, ATmega und ATxmega
Schrittmotorsteuerung mit einem ATtiny24
Logo

Schrittmotorsteuerung 28BYJ-48 mit einem ATtiny24

Gezippte Version dieser Seite (291 kB) Diese Seite als PDF (633 kB)


Schrittmotorsteuerung mit ATtiny24 Wer für seine Modelleisenbahn eine Schrankensteuerung oder eine Torsteuerung braucht, die mit einem Schrittmotor vom Typ 28BYJ-48 läuft, ist mit dieser Schaltung gut bedient. Sie hat folgende Eigenschaften:

0 Überblick

  1. Die Hardware
  2. Der Aufbau
  3. Der Betrieb
  4. Die Software
  5. 5 Trouble shooting

1 Hardware

1.1 Schaltbild

Schrittmotorsteuerung Schaltbild Die Schrittmotorsteuerung arbeitet mit einem ATtiny24. Die Steuersignale für den Schrittmotor werden an den Portbits PA4 bis PA7 ausgegeben und treiben die Eingänge der Darlingtontreiber-Schaltung ULN2003A. Seine Ausgänge treiben die vier Magnete des Schrittmotors 28BYJ-24 (Schaltbild des Motors siehe unten) im Voll- (jeweils nur ein Magnet ausgesteuert) oder im Halbschrittverfahren (wechselweise ein bzw. zwei Magnete ausgesteuert).

An den AD-Wandler-Eingängen ADC0 und ADC1 sind die Positionstrimmer angeschlossen. Der Schrittmotor folgt deren Einstellung beim Schliessen (ADC0) bzw. beim Öffnen (ADC1).

Am AD-Wandler-Eingang ADC2 ist der Trimmer für die Geschwindigkeit angeschlossen.

An den Port-Ausgängen PB0 und PB1 ist eine Duo-LED angeschlossen. Sie blinkt rot (rechts herum) bzw. gelb (links herum) solange sich der Motor noch bewegt. Sie geht dauerhaft an, wenn der Motor seine Endposition erreicht hat. Sie erlischt, wenn die Magnete des Schrittmotors nach einer zusätzlichen Verzögerungszeit von einer Sekunde abgeschaltet sind.

Am Portausgang PA3 ist eine grüne LED angeschlossen. Sie leuchtet, wenn der Motor seine Endposition erreicht hat und die Verzögerungszeit abgelaufen ist. Sie zeigt ferner an, dass die erreichte Position im EEPROM gespeichert wird.

Mit dem Auf/Zu-Schalter an PB2 (INT0) wird die Schranke oder das Tor auf und zu gefahren.

Der Prozessor kann in der fertigen Schaltung mit der dafür vorgesehenen ISP6-Schnittstelle programmiert werden, die die Standardbelegung aufweist.

1.2 Schaltbild des Schrittmotors

Schrittmotor 28BYJ-48 Dies hier ist das Schaltbild des Motors. Eingezeichnet sind nur vier der insgesamt 16 Magnete. Gezeichnet ist der Motor in der Draufsicht.

Aus dem Treiber- und dem Anschlusschema des ATtiny24 ergeben sich für die Bewegung des Motors im Uhrzeigersinn die dargestellten Hexadezimalwerte, mit denen der obere Port des ATtiny24 angesteuert werden muss.

Der Motor macht 64 Einzelschritte pro Umdrehung und hat ein eingebautes Getriebe 1:64, so dass pro Umdrehung der Welle 64 * 64 = 2.048 Einzelschritte im Vollschrittverfahren zu absolvieren sind (im Halbschrittverfahren 4.096).

Maximal kann der Motor im Vollschrittverfahren ohne Last mit ca. 4,2 Sekunden pro Getriebeumdrehung angesteuert werden (488 Hz), bei Frequenzen darüber dreht der Motor nicht mehr sauber oder gar nicht mehr. Im Halbschrittverfahren kann die Wechselfrequenz noch etwas höher als das Doppelte sein, weil 50% mehr Leistung aufgewendet werden. Bei etwa 1.000 Hz ist aber auch hier Schluss.

1.3 Stückliste

Schrittmotorsteuerung Stueckliste Die benötigten elektronischen Teile sind in der Stückliste zusammengestellt. Natürlich unterliegen die angegebenen Preise Schwankungen.

Der Schrittmotor 28BYJ-48 ist in der Stückliste nicht enthalten. Er kann im Internet-Versandhandel für deutlich weniger als 5 € pro Stück geordert werden. Der auf dem mitgelieferten Board oft gesteckte ULN2003A kann ausgebaut und für die Bestückung verwendet werden.



Seitenanfang 1 Hardware 2 Aufbau 3 Der Betrieb 4 Die Software 5 Trouble shooting


2 Aufbau

2.1 Gedruckte Platine

Schrittmotorsteuerung Platinenlayout Das Platinenlayout für die Schaltung ist hier zu sehen, es hat die Maße 50x40 mm (1/8 Euroformat) auf einseitig kaschiertem Fotoplatinenmaterial. Es sind Befestigungslöcher mit 2,5 mm Durchmesser vorgesehen.

2.2 Bestückung

Schrittmotorsteuerung Bestueckung Es sind zwei Brücken zu bestücken. Als Trimmer können sowohl runde als auch quadratische Typen bestückt werden.

Bei den beiden Steckverbindern J1 und J2 ist auf die eingezeichneten Aussparungen zu achten, bei den IC-Sockeln auf die 1-Kennzeichnung.

Der ISP6-Wannenstecker J2 muss nur bestückt werden, wenn der ATtiny24 in der Schaltung programmiert werden soll.



Seitenanfang 1 Hardware 2 Aufbau 3 Der Betrieb 4 Die Software 5 Trouble shooting



3 Der Betrieb

3.1 Inbetriebnahme

Vor dem ersten Einschalten ist der Schrittmotor etwa mittig einzustellen (bei Schranke oder Tor: halb geöffnet). Geringfügige Abweichungen von der Mitte um bis zu 90° sind unkritisch. Geht das nicht, ist ein- oder mehrmalig die Prozedur nach 3.3 auszuführen.

Bei offenem Schalter ist der obere Anschlagspunkt einzustellen, bei geschlossenem Schalter der untere Anschlagspunkt. Läuft der Motor dauerhaft um jeweils einen Schritt vorwärts und rückwärts, sollte die Einstellposition geringfügig geändert werden, um den Strombedarf und den Motorverschleiß zu mindern und um sicherzustellen, dass die Position auch korrekt gespeichert wird.

Die Geschwindigkeit kann je nach Geschmack eingestellt werden. Bei erhöhter Last die Geschwindigkeit etwas herunterfahren, bis der Motor sauber läuft.

3.2 Normalbetrieb

Im normalen Betrieb wird die Schranke/das Tor mit dem Schalter geschlossen bzw. geöffnet. Soll das Schliessen über ein externes Signal erfolgen, muss der Pin P6 auf Masse (Pin P5) gezogen werden. Dabei ist darauf zu achten, dass der Pin bis mindestens zum Erleuchten der grünen LED aktiviert bleibt.

Nur wenn die grüne LED erleuchtet ist, sollte der Strom abgeschaltet werden.

Lassen sich die obere oder untere Anschlagsposition nicht mehr erreichen, ist ein- oder mehrmalig die Prozedur nach 3.3 auszuführen.

3.3 Mittenjustierung

Ist die werksseitige Stellung des Schrittmotors nach dem Einbau nicht mittig oder ist die Stellung des Schrittmotors z. B. durch kurzzeitige unkontrollierte Bewegungen beim Ausschalten der Schaltung oder durch Ausschalten der Versorgung im vollen Lauf verstellt, kann dies durch folgende Prozedur korrigiert werden.

Die Mittenverstellung stellt man fest, indem beide Positionstrimmer auf linken Anschlag gestellt werden (Öffnen und Schließen des Schalters führen in diesem Fall nicht zu Motorbewegungen). Falls die Schranke bzw. das Tor nicht ungefähr auf halber Höhe steht, kann sie mit der folgenden Methode wieder neu eingestellt werden.
  1. Beide Positionstrimmer auf linken Anschlag.
  2. Bei offenem (Mitte zu niedrig) bzw. geschlossenem Schalter (Mitte zu hoch) mit dem jeweiligen Poti etwa die Mitte einstellen.
  3. Die Stromversorgung abschalten und warten, bis die Betriebsspannung unter 1,7 V Restspannung entladen ist oder die Betriebsspannung von der Schaltung von der Platine abklemmen.
  4. Den IC-seitigen Anschluss des Widerstands der grünen LED, der zu Pin 10 des ATtiny24 führt, mit GND verbinden (z. B. mit dem Anschlusspin P5).
    Ruecksetzen beim Start

  5. Die Betriebsspannung einschalten und die Verbindung bei eingeschalteter Betriebsspannung wieder entfernen (der Motor sollte nun auf eine andere Position laufen).
  6. Warten bis die grüne LED leuchtet und die Position gespeichert wird.
Ist die Mittenstellung um mehr als 90 Grad verschoben, kann die Prozedur zwei- oder mehrfach wiederholt werden.

Seitenanfang 1 Hardware 2 Aufbau 3 Der Betrieb 4 Die Software 5 Trouble shooting

4 Die Software

Die Software ist in Assembler geschrieben und ausführlich kommentiert. Sie kann hier als Quellcode heruntergeladen oder hier im Browser angezeigt werden. Der Quellcode verwendet .if-Direktiven und kann mit gavrasm oder mit dem ATMEL-Assembler 2 assembliert werden (eine Anleitung zum Assemblieren mit gavrasm gibt es für Linux hier und für Windows hier).

Die Abläufe und Funktionsweise der Software sind im Folgenden detailliert erläutert.

4.1 Die Positionen des Schrittmotors

Die aktuelle Position des Schrittmotors wird im Registerpaar rCurrValH:rCurrValL als 16-Bit-Zahl verwaltet. Sie sollte im Bereich 32.768 +/- 511 (Vollschritt-Version, Default) bzw. +/- 1.023 (Halbschritt-Version, Änderung im Kopf der Software) liegen.

Die Soll-Position des Schrittmotors steht im Registerpaar rSetValH:rSetValL. Stimmt die Ist-Position mit der Sollposition nicht überein, dann erfolgen Links- oder Rechtsschritte (siehe 4.2).

Die Position im offenen Zustand (32.768 - N) ist in rOpenH:rOpenL, im geschlossenen Zustand (32.768 + N) als CloseH:rCloseL verwaltet. Beide Positionen werden aus der Stellung des jeweiligen Trimmers berechnet.

Wird der Schalter betätigt, dann wird über den davon ausgelösten INT0-Interrupt die T-Flagge im Statusregister gesetzt. Je nach dem Zustand des Schalters wird entweder der Wert rOpen oder der Wert rClose in die Sollwert-Register rSetVal kopiert.

4.2 Positionsverstellung des Schrittmotors

Die Positionsverstellung des Schrittmotors arbeitet mit dem 8-Bit-Timer TC0. Er wird mit einem Vorteiler von 64 (1 MHz / 64 = 15.625, Timer-Tick alle 64 µs) im CTC-Modus betrieben (Rücksetzen des Timers bei Erreichen des Compare-Werts A). Abhängig vom eingestellten Geschwindigkeitspotiwert erfolgt dies nach Erreichen von 15 (Halbschrittmodus, höchste Geschwindigkeit) nach 15*64 = 960 µs bzw. 30 (Vollschrittmodus, höchste Geschwindigkeit) nach 30*64 = 1.920 µs oder beim Erreichen von 255 (niedrigste Geschwindigkeit) nach 256*64 = 16.384 µs.

Ausgelöst durch den Timer-Interrupt TC0COMPA wird in der Interrupt-Service-Routine überprüft, ob rCurrVal und rSetVal gleich sind. Ist das der Fall, steht der Stepper an der gewünschten Soll-Position und es passiert nichts weiter.

Ist rCurrVal kleiner als rSetVal, wird rCurrVal um Eins erhöht. Ist es größer, wird rCurrVal um Eins nach unten verstellt. In beiden Fällen werden die untersten zwei (Vollschrittverfahren) bzw. drei Bit (Halbschrittverfahren) dazu benutzt, um aus einer Tabelle die nächstfolgende Magnetkombination auszulesen und an den Ausgangsport PA4 bis PA7 zu schreiben. Gleichzeitig wird an Portpin PA3 die grüne LED abgeschaltet.

4.3 Die Magnetabschaltung

Das Timing zur Magnetabschaltung arbeitet mit dem 16-Bit-Timer TC1. Er wird mit einem Vorteiler von 1.024 getaktet.

Bei jedem TC0-Timer-Interrupt, bei dem die Motorposition geändert wird, wird der Timer TC1 auf Null gesetzt. Ab der letzten Motorverstellung läuft der Timer TC1 durch und erreicht den voreingestellten Endwert (eine Sekunde ist voreingestellt). Der ausgelöste TC1COMPA-Interrupt Nachfolgende Interrupts lösen nur dann das Setzen der Flagge bWrite aus, wenn die grüne LED noch nicht an ist.

4.4 Position aus EEPROM lesen

Zu Beginn, nach dem RESET des Prozessors, werden ab Adresse 0x0010 des EEPROMs folgende Bytes gelesen:
  1. eine erste Kennung Mark1 (sollte 0xAA sein),
  2. der aktuell eingestellte Schließen-Wert (rCloseL, rCloseH),
  3. der aktuell eingestellte Öffnen-Wert (rOpenL, rOpenH),
  4. die aktuelle Motorposition (rCurrValL, rCurrValH),
  5. die zweite Kennung Mark2 (sollte 0x55 sein).
Die gelesenen Bytes werden in den entsprechenden Registern abgelegt.

Ergibt das Exklusiv-Oder von Mark1 und Mark2 0xFF, dann sind die EEPROM-Daten korrekt. Wenn nicht, wird die Motorstellung und werden die Open- und Close-Werte auf 32.768 (0x8000) gestellt.

4.5 Position ins EEPROM schreiben

Erreicht der Motor seinen Endstand und läuft die Verzögerungszeit ab, dann werden diese Bytes an die gleiche Position im EEPROM geschrieben. Dazu wird der Schreibzyklus mit Mark1 begonnen und nach jedem abgeschlossenen Schreiben der EEPRDY-Interrupt ausgelöst. Sind alle Bytes geschrieben, wird der EEPRDY-Interrupt ausgeschaltet.

4.6 Messen und Umrechnung der Potentiometerwerte

Potisteuerung und Schrittmotor Dies hier zeigt die Funktion der drei Trimmer-Potentiometer. Poti 1 und 2 bestimmen die Auslenkung von der Mitte nach unten bzw. oben. Potentiometer 3 bestimmt, mit welcher Geschwindigkeit diese Bewegung des Schrittmotors erfolgt.

Die drei Potentiometerstellungen werden in drei Messzyklen zu je 64 Einzelmessungen per ADC-Interrupt durchgeführt. Die Ergebnisse der je 64 Einzelmessungen werden zu einem 16-Bit-Wert aufsummiert.

4.6.1 Umrechnen der beiden Positionswerte

Beim Vollschrittverfahren wird das MSB der Messwertsumme mit zwei multipliziert, beim Halbschrittverfahren mit vier. Zu diesem Wert wird 32.768 addiert (Offen-Position) bzw. er wird von 32.768 subtrahiert (Geschlossen-Position) und in den entsprechenden Registern abgelegt.

4.6.2 Umrechnen des Geschwindigkeitswerts

Vom MSB der Messwertsumme wird das Zweierkomplement gebildet und mit (255-30)=225 beim Vollschrittverfahren bzw. (255-14)=241 beim Halbschrittverfahren multipliziert und das resultierende MSB der Multiplikation mit 30 bzw. 14 addiert. Dieser Wert wird in das Vergleichsregister OC0A des 8-Bit-Timers geschrieben und steuert die Geschwindigkeit der Schrittmotorverstellung.

4.7 Neujustierung

Bei jedem Start wird der Pull-Up-Widerstand am Portpin PA3 eingeschaltet und festgestellt, ob der Eingang Low ist. Ist das der Fall, werden die aktuelle Motorposition, der Sollwert und die Offen- und Geschlossenstellungen auf 32.768 gestellt und das Lesen der EEPROM-Daten unterbunden.

Wird der Eingangspin wieder freigegeben, wird für 100 ms lang festgestellt, ob der Pin High bleibt. Ist das der Fall, wird das Programm normal fortgesetzt, ansonsten beginnt die Periode von vorne (Vermeidung von Schalterprellen).

Seitenanfang 1 Hardware 2 Aufbau 3 Der Betrieb 4 Die Software 5 Trouble shooting

5 Trouble-Shooting

5.1 Motor läuft dauerhaft/endet nicht

Falls der Motor dauerhaft läuft und seinen Lauf nicht beendet, kann das daran liegen, dass die Magnete des Motors beim Aus- und Umschalten eine Spikespannung erzeugen, die den Prozessor rücksetzt. Das passiert gerne im Programmiermodus, wenn die Schaltung aus der USB-Stromversorgung des Programmiergeräts gespeist wird. Falls dies passiert, kann der Keramikkondensator am ULN2003A auf 100 nK vergrößert werden. Das sollte die Spikes beseitigen. Wenn nicht, kann ein weniger sensibles Netzteil abhelfen.

5.2 ATtiny24 lässt sich nicht programmieren

Erfolgt die Programmierung des ATtiny24 in der Schaltung über die ISP6-Schnittstelle und ist der Motor während der Programmierung angeschlossen, verursachen die Programmierimpulse ein schnelles An- und Ausschalten von bis zu drei Magneten des Motors gleichzeitig. Das kann bei einer schwachbrüstigen Stromversorgung, z. B. aus der USB-Schnittstelle, kurzzeitig mit bis zu 300 mA Strom Spikes auf der Versorgungsleitung verursachen. Ausserdem produzieren die Magnete beim Abschalten ebenfalls Spannungsspitzen, die zwar von den im ULN2003A verbauten Dioden kurzgeschlossen werden, aber dennoch schnelle Spikes in der Versorgung verursachen. Ohne den eingezeichneten Keramikkondensator von 10 nF neben dem ULN2003A ist es erfahrungsgemäß daher nicht möglich, den ATtiny24 über die ISP6-Schnittstelle zu programmieren.

Gegen Schwachbrüstigkeit der Stromversorgung hilft auch ein kleiner Elko von z. B. 10 µF, die kurzen Lastspikes auf der Versorgungsspannung wegzupuffern. Nach der Programmierung kann der Elko wieder entfernt werden.

Seitenanfang 1 Hardware 2 Aufbau 3 Der Betrieb 4 Die Software 5 Trouble shooting


Lob, Tadel, Fehlermeldungen, Genöle und Geschimpfe oder Spam bitte über das Kommentarformular an mich.

©2018 by http://www.avr-asm-tutorial.net