Drehencoder auswerten mit Atmel Assembler

Abfrage eines Drehencoders
Wenn man ein Programm für einen Mikrocontroller entwickelt, steht man sehr oft vor der Aufgabe, Benutzereingaben zu verarbeiten und entsprechend darauf zu reagieren. Dabei gibt es die unterschiedlichsten Varianten, mit denen so ein Mikrocontroller auf den Menschen reagieren kann. Im einfachsten Fall kann das einer oder mehrere Taster sein, mehrere Taster könnten dabei eine kleine Tastatur bilden.

Eine weitere sehr elegante Möglichkeit ist ein sogenannter Drehencoder. Das ist ein Drehknopf, mit welchem Werte recht bequem eingestellt werden können. Häufig haben diese Drehencoder auch noch eine Taster-Funktion, um weitere Aktionen ausführen zu können. Der besondere Aspekt beim Drehencoder liegt daran, dass man hier zwei Drehrichtungen unterscheiden muss, und je nach Richtung dann unterschiedliche Aktionen ausführen wird.

Doch wie bringt man das einem Mikrocontroller bei ?

Zuerst werfen wir einmal einen Blick auf die Signale, die so ein Drehencoder liefert. Wir beschränken uns hier auf einfache mechanische Drehgeber , speziell dieses Modell.....


STEC12 Drehgeber

Im Prinzip besteht dieser Encoder aus zwei Tastern, welche periodisch geschlossen und wieder geöffnet werden. Dies geschieht nach einem bestimmten Schema, welches sich bei jeder Rastung wiederholt, der Stec12 besitzt 24 Rastungen pro Umdrehung, dieses Muster wird also pro Umdrehung 24 mal durchlaufen

...
00
01
11
10
00
..
usw....

Der Einfachheit halber nehmen wir an, dass die Position 00 dabei die Ruhelage in einer Rastung darstellt. Man vergleicht jetzt periodisch immer den aktuellen Zustand der beiden Schalter mit dem vorhergehenden Zustand. Dabei sieht man, wenn der Zustand von 10 auf 00 wechselt, ist ein kompletter Schritt in die eine Richtung erfolgt. Wird jedoch ein Wechsel von 01 auf 00 erkannt, wurde ein Schritt in die andere Richtung erkannt. Dies ist dem Prinzip nach ein einfacher Gray-Code, von einem Schritt zum nächsten ändert sich immer nur ein einziges Bit, so dass keine Sprünge im binären Ausgangssignal der beiden Phasen auftreten.

Das Programm funktioniert folgendermassen: (Quellcode hier)

(Als Hardware-Basis dient das Text-Display Board hier, das Programm wurde auf einem Mega32 mit dem STK500 erstellt)

Die beiden Phasen-Schalter des Drehgebers schalten dabei nach Masse, ein geeigneter Pullup Widerstand sorgt dann für High Pegel.

Hinweis: Die logischen Pegel hier in diesem Text sind invertiert dargestellt, im Programm sind sie genau anders herum verwendet, da geschlossener Schalter = LOW Pegel.

Am Anfang stehen wie immer Initialisierung von Stackpointern, Timer und LCD Display. Die Interruptroutine wird periodisch etwa 1000 mal pro sekunde aufgerufen und pollt die Encoder-Anschlüsse.

Dazu werden die beiden Encoder Pins in ein 4 Bit Schieberegister geschoben, damit hat man in diesem Schieberegister also immer den vorherigen Zustand der Schalter und den aktuellen Zustand, je 2 Bit. Der aktuelle Zustand steht dabei in den niederwertigen 2 Bits, der vorherige Zustand steht dabei in den höherwertigen 2 Bits. Dadurch vereinfacht sich die Erkennung des Zustandes auf eine einfache Abfrage eines 4 Bit Wertes.

Schieberegister = 0100-> Drehung in die eine Richtung wurde erkannt

Schieberegister = 1000-> Drehung in die andere Richtung wurde erkannt.

All dieses passiert in dem Unterprogramm encoder_handler, welches sehr kurz ist und von der Interruptroutine aufgerufen wird. Je nach erkannter Drehrichtung wird dann ein Flag gesetzt, welches von der Hauptroutine ausgewertet wird. In diesem Fall wird für jeden erkannten Schritt nach links oder Rechts ein Zähler erhöht und dieser auf dem LCD Display ausgegeben. So kann man recht gut erkennen, ob die Encoder-Sequenz korrekt erkannt und ausgewertet wurde. Entscheidend ist hier die Abtastfrequenz des Encoders. Je höher diese ist, desto schneller kann der Encoder gedreht werden, ohne dass Fehlabtastungen entstehen.

Bei dem hier gezeigten Beispiel läuft die Abtastung etwa 988 mal pro Sekunde, damit werden alle normalen Drehbewegungen sauber erkannt. Lediglich wenn man den Encoder sehr schnell zwischen Daumen und Zeigefinger schnippt, werden vereinzelte falsche Zählschritte in die andere Richtung erkannt. Da man damit aber ohnehin wahrscheinlich einen Wert erhöht oder erniedrigt, dürfte das in der Praxis nicht weiter auffallen.

Neueste Artikel
Anzeigen:
Aktuelle Newsbeiträge
Sie sind Besucher Nr. 1221852