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

schneller Quadratur-Dekoder mit RP2040, Arduino

Bei den zuvor gezeigten Lösungen wurden die Quadratursignale immer per Software gezählt und ausgewertet. Die maximale Zählfrequenz war daher auf max. einige 100 kHz eingeschränkt.

Der auf dem Pico-Board verbaute RP2020 bietet mit seinen PIO-Einheiten die Möglichkeit, einen oder zwei 4-fach Quadratur-Dekoder mit hoher Zählrate zu implementieren, sodaß Signaländerungen bis zu 1 x 10^7 Flanken/s erfasst werden können. Ferner kann der Index-Impuls von Weg- oder Drehgebern ausgewertet werden, der den internen Zähler auf 0 oder einen frei wählbaren Vorgabewert setzt.

Die Schaltung besteht aus dem fertigen RP2040-Pico-Board, an dessen Eingänge GPIO10 und GPIO11 für Kanal0 die beiden Phasen A/B des Gebersignals angeschlossen werden (GPIO14+15 bei Kanal1). Der Index-Impuls wird an GPIO12 (GPIO13 bei Kanal1) erwartet und ist beim gezeigten Programm mit '0'-Pegel aktiv. Wird '1'-Pegel benötigt, kann der GPIO-Pin mit 'set_index0_pol(1)' umprogrammiert werden.
Sofern die Gebersignale Pegel > 3,3 V liefern, müssen Spannungsteiler oder zumindest Schutzwiderstände in die Signalleitungen eingefügt werden.

Das Demoprogramm zeigt Beispiele für zwei Kanäle 'init_qcnt0(i)' und 'init_qcnt1(i)', ist für die Arduino-IDE geschrieben und gibt den aktueller Zählerstand bei Änderung über die USB-Schnittstelle aus. Die .uf2-Datei kann im Boot-Modus ohne Verwendung einer Arduino-IDE direkt auf das Pico-Board geschrieben werden. Das Programm-Modul 'pio_qcnt0.c' bzw. 'pio_qcnt1.c' kann auf andere IDEs übertragen werden. Sollte die Dateiendung aus Gründen der Kompatibilität zu Arduino auf '*.ino' umbenannt werden, muß 'rp2040_arduino.h' verwendet werden, um keine doppelten Definitionen zu erhalten.

2024-03-18: Erweiterung auf 1 - 4 Kanäle
Bei dem zuvor gezeigten Programm wurde die Funktion für den zweiten Kanal durch einfaches Kopieren von PIO1_SM0 auf PIO0_SM0 umgesetzt. Das ging schnell, ist aber nicht sonderlich effizient.

Um für andere Anwendungen PIO0 wieder frei zur Verfügung zu haben, werden jetzt PIO1_SM1 verwendet und für zusätzliche zwei weitere Kanäle mit PIO1_SM2 und PIO1_SM3 aktiviert. Insgesamt stehen damit vier Quadratur Dekoder zur Verfügung: Pico-qcnt4x.zip

Die Kanäle 2 und 3 sind als Beispiele in der Funktion reduziert. So wird auf ein INDEX-Signal verzichtet, was jeweils einen Eingangs-Pin spart, und nur noch ein DMA-Kanal zur Datenerfassung verwendet. Das Nachtriggern des DMA_TRANS_COUNT wird per Software erledigt.
Im Grunde könnte man das per Interrupt nach dem Ablauf von 2^32-1 Änderungen erreichen, hier wird es durch Rücksetzen des Zählers bei jedem Funktionsaufruf 'get_qcnt2()' beziehungsweise 'get_qcnt3()' gemacht.

Zur Demonstration wurde auch die max. Taktfrequenz auf 1/10 reduziert. Das kann man sich wie auch die verwendesten GPIOx und DMA_CHx nach Belieben anders einstellen.

Anfragen:

Seitenanfang zurück zur Übersicht