Forum: Mikrocontroller und Digitale Elektronik Drehgeber auslesen


von Jan (Gast)


Lesenswert?

Hallo,
ich habe den EC11B von ALPS 
(http://www3.alps.com/WebObjects/catalog.woa/E/PDF/Switch/Encoder/EC11/EC11.PDF)

Ich habe nun sämtlice Codeschnipsel ausprobiert, die hier in dem Artikel 
und in Beiträgen angegeben sind; ich kriege ihn einfach nicht 
zuverlässig ausgelesen. Entweder inkrementiert der Code die 
Zählervariable dauernd, ohne dass man den Drehgeber überhaupt anfasst 
(bei Peter Danneggers Code mit der Graycode-Tabelle), oder er reagiert 
auf keine Drehung.

Der Code, der funktionierte, produzierte immer Sprünge von 2 Zahlen auf 
einmal (da er wohl davon ausging, dass es zwei Graycode-Zustände pro 
Rasterung gibt).

Meine selbst geschriebene Statemachine läuft relativ gut, allerdings 
inkrementiert sie ab und zu nicht wenn ich drehe.


Das kann doch nicht so schwer sein, diese beiden Spuren richtig 
auszulesen...

Stelle ich mich nur blöd an, oder ist der EC11B irgendwie anders?
Wie kann man den denn zuverlässig auslesen?

Danke und mfg
Jan

von Winfried (Gast)


Lesenswert?

Teste doch erstmal mit 2 Tastern, mit denen du den Encoder lt. Diagramm 
simulierst, ob dein Code korrekt arbeitet. Und dann schaust du dir 
umgedreht an, ob dein Encoder dass rausgibt, was im Diagramm ablesbar 
ist.

von Christian R. (supachris)


Lesenswert?

Jan wrote:
> Hallo,
> ich habe den EC11B von ALPS
> (http://www3.alps.com/WebObjects/catalog.woa/E/PDF/Switch/Encoder/EC11/EC11.PDF)

> Der Code, der funktionierte, produzierte immer Sprünge von 2 Zahlen auf
> einmal (da er wohl davon ausging, dass es zwei Graycode-Zustände pro
> Rasterung gibt).

Was ja auch völlig normal und richtig bei dem Drehgeber ist. Der hat 30 
Zustände aber nur 15 Rastungen. Einfach das Ergebnis durch 2 teilen und 
alles ist perfekt.

von Hannes L. (hannes)


Lesenswert?

Jan wrote:
...
> Der Code, der funktionierte, produzierte immer Sprünge von 2 Zahlen auf
> einmal (da er wohl davon ausging, dass es zwei Graycode-Zustände pro
> Rasterung gibt).

Dasselbe Verhalten zeigt der Drehgeber von Pollin. Ich habe es damals so 
gelöst: Beitrag "Re: Drehimpulsgeber (wiedereinmal.)"
Besser wäre es allerdings, Du arbeitest mit der funktionierenden Methode 
und passt die Lookup-Tabelle an den Drehgeber an. Ich nutze allerdings 
weiter meine Methode, da sie die relativ laberigen Pollin-Drehgeber 
nebenher noch entprellt, was die Zuverlässigkeit erhöht.

> Das kann doch nicht so schwer sein, diese beiden Spuren richtig
> auszulesen...

Beitrag "Re: Drehimpulsgeber (wiedereinmal.)"

>
> Stelle ich mich nur blöd an, oder ist der EC11B irgendwie anders?
> Wie kann man den denn zuverlässig auslesen?

Beitrag "Re: Drehimpulsgeber von Pollin"

>
> Danke und mfg
> Jan

...

von Falk B. (falk)


Lesenswert?

@  Jan (Gast)

>Der Code, der funktionierte, produzierte immer Sprünge von 2 Zahlen auf
>einmal (da er wohl davon ausging, dass es zwei Graycode-Zustände pro
>Rasterung gibt).

Das ist auch so und steht auch im Artikel Drehgeber.

MFG
Falk

von Mario G. (rodenberger)


Lesenswert?

Hallo,

für den Pollin Drehgeber benutze ich folgenden Code:

; TEST DES ENCODERS AUF VERDREHUNG ****************************

READ_ENCODER
         MOVF   PORTC,0   ;PORT C NACH W
         ANDLW  B'00000011'
         XORWF  ALT,0  ;VERGLEICHE
         ADDWF  PCL,1   ;PROGRAMMZEIGER ÄNDERN 0 BIS 4
            RETURN    ;keine Änderung
            GOTO LINKS
            GOTO RECHTS
            GOTO WEITER

RECHTS
         INCF    COUNTER, F ; RECHTS:  INCREMENT COUNTER
         GOTO    WEITER
LINKS
         DECF    COUNTER, F ; LINKS:  DECREMENT COUNTER
WEITER   MOVF   PORTC,0     ;PORT C NACH W
         ANDLW   B'00000011'
         ADDWF  PCL,1       ;PROGRAMMZEIGER ÄNDERN 0 BIS 4
            GOTO ENDE
            GOTO WEITER ;Drehgeber steht im Zwischenbereich
            GOTO WEITER ;Drehgeber steht im Zwischenbereich
           ;GOTO ENDE  ;geht gleich mit ENDE weiter

ENDE    MOVWF   ALT             ; FÜR NÄCHSTEN VERGLEICH ALS ALT 
SPEICHERN


Mit Sicherheit auch nicht die beste Lösung, da das Programm in der 
Mittelstellung des Drehgebers nicht weiter läuft.
Mein Programm ist aber nicht Zeitkritisch, beziehungsweise hat die 
serielle Schnittstelle mehr priorität.
Bisher funktioniert das ganze sehr zuverlässig.
Wichtig ist das der Portpin 0 und 1 verwendet wird, sonnst funktioniert 
das mit dem Programmzeiger nicht.

Kritik ist natürlich erlaubt!

von Jan (Gast)


Lesenswert?

Hannes: Hast du den Code auch in C?


Oder wie passe ich denn die Tabelle, die den Graycode enthält, an den 
Drehgeber an?

Viele Grüße
Jan

von Hannes L. (hannes)


Lesenswert?

Jan wrote:
> Hannes: Hast du den Code auch in C?

Nein, der AVR kann kein C. Deshalb habe ich mich entschlossen die 
Sprache des AVRs (Maschinencode, einszueins in ASM notierbar) zu 
benutzen. Das spart Missverständnisse mit dem Dolmetscher... ;-)

>
>
> Oder wie passe ich denn die Tabelle, die den Graycode enthält, an den
> Drehgeber an?

Indem Du die Hälfte der Werte rausnimmst (auf 0 setzt). Du lässt also 
die Werte nur an den Flanken drin, die Du auswerten willst. Dazu 
solltest Du aber schon versuchen, bitweise zu denken...

>
> Viele Grüße
> Jan

...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.