sin/cos Inkremental-Dekoder mit 0,1µm Auflösung


Die gezeigte Schaltung ist eine kostengünstige Lösung, 90°-phasenverschobene sin/cos-Signale von Inkrementalgebern µP-gerecht aufzubereiten. Die Eingangssignale können digital oder - wie hier gezeigt - sinusförmig sein. Bei Sinussignalen wird neben einer 4-fach Auswertung, die die Nulldurchgänge nutzt, zusätzlich eine Bewertung der Phasenlage mit 25-facher Auflösung gemacht, sodaß sich insgesamt eine 100-fach Auswertung bei Sinussignalen ergibt. Beispielsweise liefern Meßtaster MT12/MT25 der Fa. Heidenhain mit 10µm/Intervall eine Auflösung von 0,1µm. Beim ST1207 wird eine Auflösung von 0,2µm erreicht.

Für die Datenausgabe wird das IIC-Bus Interface des verwendeten Prozessors Atmel ATmega48 verwendet; durch variable IIC-Adressen können mehrere Kanäle an einem übergeordneten µP betrieben werden.

Die Eckdaten der Schaltung:

Hier ein Beispielprogramm für ein Meßlineal mit 40µm/Teilung und 10µm Auflösung mit 7-Segmentanzeige.

nach oben

einfache Schaltung mit Demo-Programm für Rechtecksignale:

Als kleine kostengünstige Lösung für die Auswertung von Linear-, Rotations- oder Drehgebern bietet sich ein ATtiny25 an, da er nicht nur die Auswertung und Impulszählung erledigen kann, sondern zur Datenausgabe mit seinem USI auch eine IIC-Schnittstelle bedient. Bei der Beschaltung des Tiny25 sind PB0 (SDA) und PB2 (SCL) für die IIC-Schnittstelle fest vorgegeben. Die freien Pins PB4 (Phase-A) und PB4 (Phase-B) werden für den Anschluß des Inkrementalgebers verwendet; bei beiden Eingängen ist der interne Pullup-Widerstand aktiviert, sodaß auch passive Geber direkt angeschlossen werden können. Der verbleibende PB1 kann für optinales /Reset-Signal genutzt werden und hat ebenfalls den internen Pullup-Widerstand eingeschaltet. Sofern für SDA, SCL und /Reset noch zusätzliche Pullup-Widerstände im Schaltbild eingefügt sind, dienen diese der Erhöhung der Störsicherheit bzw. als Abschlußwiderstände für IIC, falls nicht an anderer Stelle der Schaltung bereits vorhanden.

Mit dem intern getakteten ATtiny werden Flankenänderungen bis ca. 350 kHz erkannt und mit einem 32 Bit Zähler gezählt. Dabei ist es unerheblich, ob prellende mechanische Kontakte angeschlossen werden, oder das Signal von optischen Encodern oder Hallsensoren stammt. Alle Signale werden mit 4-fach Flankenbewertung gezählt. Um bei mechanischen Drehgebern die unbrauchbaren Zwischenflanken zu unterdrücken, kann man bei der Datenausgabe auf 2-fach Auswertung 'umschalten', was nicht anderes bedeutet, als daß Zählerwert/2 ausgegeben wird. Die Datenausgabe per IIC ist minimal gehalten.
Folgende Befehle werden beachtet:

'A' Ausgabe des Zählerstandes
'B' Ausgabe des Zählerstandes/2 für Geber mit Zwischenflanken
'Z' Löschen des Zählers

Bei der Ausgabe wird das untere Byte zuerst gesendet. Daher ist es möglich, nur ein oder zwei Bytes auszulesen und die Übertragung abzukürzen. Werden mehr als vier Bytes gelesen, wiederholt sich die Ausgabe des 32 Bit Zählerstandes. Als IIC-Adresse gibt das Programm 0xB8 vor, die (hoffentlich) nicht mit anderen Busteilnehmern zur Kollision führt. Alternativ kann man eine eigene Adresse vorgeben, welche man ins interne EEPROM an Adresse 0x00 schreibt. Hier steht normalerweise ein 0xFF. Wird beim Programmstart ein Wert != 0xFF gefunden, wird dieser als neue, eigene Adresse verwendet. Bislang wurde die Software mit 100 kHz Busfrequenz und einem IIC-Master per Software getestet. Vielleicht testet jemand bei Bedarf unter anderen Bedingungen und kann seine Erfahrungen mitteilen. Soweit bleibt die Software daher eine Testversion.

nach oben

neue Schaltung / Programmversion für ATtiny-AVR0:

Eine neue Version verwendet einen neueren ATtiny202, der zusammen mit den größeren Ausführungen (ATtiny4xx, -8xx) schon eine Hardware TWI-Schnittstelle auf dem Chip hat. Die neuere Version ist leistungsfähiger, kostengünstiger und läuft mit internen 20 MHz.

Die Schaltung hat sich kaumverändert, jedoch kann die beiliegende Projektdatei mit einer IAR IDE für AVR eigenen Bedürfnissen angepaßt werden. Andere Compiler erzeugen weniger guten Code, da keine separaten Register für die Interruptverarbeitung reserviert werden können. Der Quellcode findet sich in "quadratur_cnt.c" und "qcnt.s", der ausführbare Code als "quadratur_cnt.hex" in Quadratur_cnt.zip.

Wie zuvor ist die IIC-Basisadresse 0xb8. Ein neuer Befehl ist hinzugekommen:

'A' Ausgabe des Zählerstandes
'B' Ausgabe des Zählerstandes/2 für Geber mit Zwischenflanken
'R' Ausgabe der Bytes umdrehen: MSB->LSB
'Z' Löschen des Zählers

nach oben

Demoprogramm für Arduino:

Hier noch ein kleines Demoprogramm, um die Schaltung mit ATtiny25 / ATtiny_xxx mit einem Arduino auszulesen. Gezeigt wird das Auslesen mit LSB zuerst und MSB zuerst: "qcnt_lesen.ino".

 

Anfragen:

Seitenanfang zurück zur Übersicht