Forum: Mikrocontroller und Digitale Elektronik Rotary Encoder


von Günter König (Gast)


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

von mikki merten (Gast)


Lesenswert?

nein

von Günter König (Gast)


Lesenswert?

Gut.

Vielen Dank,

Günter

von Günter König (Gast)


Lesenswert?

Hi Mikki,

Sorry, aber deine Info war falsch. Die Teile haben eine Grundstellung.
In Ruhe sind die Pins A-C und B-C hochohmig, also offen.

Viele Grüße,

Günter

von mikki merten (Gast)


Lesenswert?

@Günter
Kommt drauf an welchen Typ du einsetzt mit oder ohne Rastung. Als 
Ruhestellung kann man das aber auch nicht unbedingt bezeichnen, da die 
Drehrichtung und Pulsanzahl im allg. aus der Lage der Impulse generiert 
wird.

von Günter König (Gast)


Lesenswert?

mmmh,
es ist genau der Typ, den ich auch angegeben habe. Die Teile sind doch 
endlich heute angekommen und da habe ich gleich mal nachgemessen.
Nur die Drehrichtung wird aus der Pulslage detektiert. Und die Anzahl 
der Rastungen ist Typabhängig (hier: 24).

Gruß,

Günter

von Günter König (Gast)


Lesenswert?

Hallo nochmal Mikki,

hast du eine .ASM Routine zur Auswertung die keine Interrupts verwendet?

Glück Auf,

Günter

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?


von Günter König (Gast)


Lesenswert?

Tag Andreas,

Dank für den Tip, abertut mir leid, finde ich nicht. Bin zu doof der so.


Gruß,
Günter

von Andreas S. (andreas) (Admin) Benutzerseite


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];

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Ups, ich sehe gerade dass du das Ganze in Assembler brauchst... sorry.

von BernhardT (Gast)


Lesenswert?

Ich aber in C - Danke Andreas ;-)
Bernhard

von Sascha Weitkunat (Gast)


Lesenswert?


von Günter König (Gast)


Lesenswert?

Hi Sascha,

auch dir vielen Dank. Leider habe ich bei dem 8515 keine externen 
Interrupts mehrfrei.
Die Routine haut zwar hin und ich habe auch schon mal versucht sie 
umzuschreiben, klappt aber noch nicht.
Dann will ich mal weiterprobieren.


Gruß,
Günter

von Gerhard (Gast)


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

von Günter König (Gast)


Lesenswert?

Hallo und Dank,

leider behersche ich diesen Dialekt nicht so recht und mit den Timern in 
Bascom habe ich noch nichts vollbracht.
Könntest du deshalb mal ein paar Worte zu deinen Gedankengängen 
verlieren?

Gruß,
Günter

von Gerhard (Gast)


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

von Günter König (Gast)


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

von Gerhard (Gast)


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

von Gerhard (Gast)


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

von Günter König (Gast)


Lesenswert?

Hi Gerhard,

das ist gut, vielen Dank. Das ist aber im Prinzip das Gleiche was ich 
jetzt am Nachmittag schon probiert (bisher noch erfolglos) habe.

Schaun wir mal.


Danke nochmal,

Günter

von Günter König (Gast)


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

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.