Rotary Encoder

Gast #29744
Lesenswert?

Hallo,
kurze Frage:
kennt sich jemand mit den Totary Encodern von NOBLE aus? Diese Teile 
werden u.a. von ELV geliefert (Typ REB161PVB).
Ich will eigentlich nur wissen, ob diese Teile eine definierte 
Ruhestellung haben.

Gruß,
Günter
Admin Persönliche Seite #29753
Lesenswert?

Von: MaWin (mawin@gmx.net) 25.7.2001

Am einfachsten realisiert man das mit einer state machine als Tabelle. 
In C sieht das so aus.

    signed char table[16]={0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0};
    int position=0; // zaehlen wir mal die absolute Position
    volatile unsigned char quadrature_input; // die unteren 2 bits 
dieses Ports sind AB
    unsigned char quadrature_value=quadrature_input;

Folgenden Code ausreichend oft wiederholen (in der Programm Hauptscheife 
oder einer Zeitgeber gesteuerten Interrupt Routine:)

    quadrature_value=((quadrature_value<<2)|(quadrature_input&3))&15;
    position+=table[quadrature_value];
Gast #29758
Lesenswert?

Hi Günter ,

falls du noch einen Timer frei hast kann auch dieser auf
externe Ereignisse reagieren.
Hab das mal mit Bascom gemacht. (kann leider kein ASM)
Funzt genau so gut wie die anderen ext. Interrupts.
Eine Polling-Methode würde ich nicht nehmen.

Gruss Gerhard


Bascom Code:

Richtung Alias Pind.5
Takt Alias Pind.4
Timer0 = 255
On Timer0 Takt_Encoder
Enable Timer0

Do

print Ist_wert

Loop
End

Takt_Encoder:
  Timer0 = 255
  If Takt <> Richtung Then
    Decr Ist_wert
  Else
    Incr Ist_wert
  End If
Return
Gast #29760
Lesenswert?

Hallo Günter

also im oben beschriebenen Fall wird der 8 Bit Timer als
Zähler konfiguriert.
Hab eine Zeile im Code vergessen
(Config Timer0 = Counter , Edge = Rising)
Der Zählerstand wird auf 255 eingestellt , d.h. beim nächsten
positiven Impuls an Pind.4 (beim at90s2313)  wird ein Interrupt 
ausgelöst.

Nun wird der Programmteil bei "Takt_Encoder:" abgearbeitet.
Der Timer sofort wieder auf 255 eingestellt.
Dann wird verglichen ob die 2. Spur des Encoders (Pind.5 beim
2313er in meinem Programm) auf H od. L liegt und dementsprechend die 
Variable Ist_wert um 1 erhöht oder verkleinert.

Gruss Gerhard
Gast #29761
Lesenswert?

Das hört sich gut an.
Frage: woher kommt der Takt?

wenn ich davon ausgehe, das z.b in Drehrichtung rechts der H Impuls auf 
Spur 1 vor dem auf Spur 2 kommt (entsprechend Linksdrehung: H Impuls auf 
Spur 2 vor dem auf Spur 1) dann könnte das doch bedeuten, das immer 
zwischen auf und ab gewechselt wird.



Oder täusche ich mich da?


Günter


Gruß,
Günter
Gast #29762
Lesenswert?

Hallo Günter
    ___    ____    ____    ____    ___
___    ____    ____    ____    ___     Spur A

  ___    ____    ____    ____    ___
_    ____    ____    ____    ___    ___Spur B

Woher kommt der Takt ?????
Hab die beiden Spuren des Encoders "Takt" (Spur A) und "Richtung" (Spur 
B)
genannt.

Sieh dir mal die Spur A an,  von links nach rechts betrachtet
(Drehrichtung rechts). Nun wird bei jedem Pegelwechsel von L auf H ein 
Interrupt ausgelöst (durch Timerüberlauf)und dabei geprüft ob der Pegel 
von Spur B zu diesem Zeitpunkt High oder Low ist.
Von links nach rechts betrachtet (Drehrichtung rechts)
ist B immer High.
Von rechts nach links betrachtet (Drehrichtung links)
ist B immer Low.

Bei jedem Timerüberlauf wird dann folgende Berechnung
gemacht:
wenn B = low dann variable = variable -1
wenn B = high dann variable = variable +1

Gruss Gerhard
Gast #29763
Lesenswert?

Uuups das war nichts

2.Versuch

____----____----____----____----____---- Spur A

_----____----____----____----____----_ Spur B

Woher kommt der Takt ?????
Hab die beiden Spuren des Encoders "Takt" (Spur A) und "Richtung" (Spur 
B)
genannt.

Sieh dir mal die Spur A an, von links nach rechts betrachtet
(Drehrichtung rechts). Nun wird bei jedem Pegelwechsel von L auf H ein 
Interrupt ausgelöst (durch Timerüberlauf)und dabei geprüft ob der Pegel 
von Spur B zu diesem Zeitpunkt High oder Low ist.
Von links nach rechts betrachtet (Drehrichtung rechts)
ist B immer High.
Von rechts nach links betrachtet (Drehrichtung links)
ist B immer Low.

Bei jedem Timerüberlauf wird dann folgende Berechnung
gemacht:
wenn B = low dann variable = variable -1
wenn B = high dann variable = variable +1




Gruss Gerhard
Gast #29765
Lesenswert?

Hi Gerhard,

ich habe deine BASCOM Routine in eine Assembler Routine umgestrickt und 
es haut nach einigen Wirren incl. oberer und unterer Grenzwert hin.
Die Probleme bestanden nur in einem Fehler in meiner IDE (VMLAB 2.4).
Dank auch nochmal an Mikki, der das ganze mal in seinen Grundzügen mit 
dem AVR Studio ausgetestet hat.


Viele Grüße
bis zum nächsten Problem :-)

Günter

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren