mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Rotary Encoder


Autor: Günter König (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: mikki merten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein

Autor: Günter König (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut.

Vielen Dank,

Günter

Autor: Günter König (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: mikki merten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Günter König (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Günter König (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal Mikki,

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

Glück Auf,

Günter

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Günter König (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tag Andreas,

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


Gruß,
Günter

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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];

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups, ich sehe gerade dass du das Ganze in Assembler brauchst... sorry.

Autor: BernhardT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich aber in C - Danke Andreas ;-)
Bernhard

Autor: Sascha Weitkunat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Günter König (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Günter König (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Günter König (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Günter König (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Günter König (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.