mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zustände bei Drehgeber


Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich beschäftige mich gerade mit Drehgebern und deren Auswertung mit
einem µC. Ich bin allerdings gerade etwas verwirrt denn in
verschiedenen Quellen (u. a.
http://dse-faq.elektronik-kompendium.de/dse-faq.htm) las ich, daß ein
solcher Drehgeber 4 Zustände annehmen kann, nämlich:

0: ab (Spur A LOW, Spur B LOW)
1: Ab (Spur A HIGH, Spur B LOW)
2: aB (Spur A LOW, Spur B HIGH)
3: AB (Spur A HIGH, Spur B HIGH)

(Quelle: Link oben)

Soweit gut, nur wenn ich mir mein hier liegendes Exemplar anschaue und
durchmesse, dann nimmt der genau zwei Zustände an:

0: ab
1: AB

Hab ich ein defektes Teil erwischt oder gibt es auch solche Typen? Wie
kann ich jetzt die Drehrichtung ermittel, offenbar nur so, indem ich
mir anschaue, welche Spur zuerst in den anderen Zustand wechselt. Ich
sehe jetzt nur das Problem, daß beide Kontakte wohl prellen werden und
der Wechsel der beiden Spuren erfolgt zeitlich sehr kurz
hintereinander. Gibt es da einen sinnvollen Weg der sicheren
Auswertung?

Das Programm in der Codesammlung habe ich schon gesehen, ich möchte es
allerdings zuerst gerne selbst probieren.

Vielen Dank.

Gruß
Jens

Autor: Hias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo!
die Zustände Ab sowie aB treten beim übergang von AB auf ab bzw ab auf
AB auf.
sie sind also zwischenzustände die man auswerten muss um die
drehrichtung herauszubekommen.
hias

Autor: ...HanneS... (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi...

Schau dir mal in diesem Beitrag
http://www.mikrocontroller.net/forum/read-4-37992.html#87902
die Beschreibung des Algorithmus an.

Ich habe mal versucht, das in ASM umzusetzen (Anhang), habe es aber
noch nicht mit Hardware getestet. Es kann also noch buggy sein.

...

Autor: Hias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ups was vergessen:

deiner is also ned kaputt.

auswerten kannst du die Drehrichtung
in dem du den sog Grey_Code auswertest.
ich hab das so gemacht, dass ich alle ms den zustand der beiden pins
abfrage. Wenn sich dabei was ändert. schau ich in einer .db Tabelle
nach, wie sich der zähler verändert.
Diese Tabelle hab ich nich mehr im Kopf. Is aber ganz einfach wenn du
dir das hier anschaust.
http://www.elektrik-trick.de/sminterf/sminterf.htm (erste zeichnung)
Hias

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch vergessen:

Viele Encoder rasten nur in jeder zweiten Stellung.

...

Autor: Dominik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für einen C-Code siehe auch:

http://www.mikrocontroller.net/forum/read-4-37992.html

Dominik

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei den Drehgebern die alle 2 Änderungen eine Rastung haben braucht man
eigentlich nur einen der Kanäle "beobachten".

Z. B. überwacht man nur Kanal A auf Pegeländerung.
Ändert sich Kanal A von low auf high oder von high auf low prüft man
den Zustand von Kanal B.
Ist B = A wurde nach links gedreht.
Ist B <> A wurde nach rechts gedreht.
Bei einer Linksdrehung kann es dann ab oder AB sein bei einer
Rechtsdrehung Ab oder aB.

Hier das Verfahren:
A² = letzter, gemerkter A-Zustand

   A = PinA
   B = PinB
   If A <> A² then
      A² = A
      If A = B then left else right

Entprellen läßt sich das mit aktivierten Pullups und 10nF an den beiden
Kanal-Pins oder man macht eine Zeitbasierte Entprell-Software mit 1ms
vor der Drehgeberauswertung.

Gruß
Andi

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, ich habs jetzt auch hinbekommen. Nur habe ich folgenden Fehler
gemacht. Im Datenblatt des Drehgebers (so einer von Alps) steht, daß
die maximale Prellzeit 5ms beträgt. Also dachte ich mir, daß ich den
Timer so einstelle, daß er alle 10ms den Drehgeber abfragt; ich glaubte
so auf der sicheren Seite zu sein. Nur leider wird der Geber dann nur
100 mal pro Sekunde abgefragt und bei schnellem Drehen habe ich nicht
alle Übergänge mitbekommen. Jetzt fragt der Timmer jede ms ab (wie auch
Hias oben geschrieben) und es funktioniert wunderbar. Im Prinzip lese
ich bei jedem Timerinterrupt den Drehgber ein und vergleiche dies mit
dem vorherigen Wert. Über ein zweidimensionales Array hole ich mir dann
+1 oder -1, so wie es in der DSE FAQ auch gemacht wurde.

Interessant finde ich den zweiten Ansatz von Peter Dannegger ohne
Tabelle. Das schaue ich mir bei Gelegenheit mal an.

Jedenfalls vielen Dank für eure Antworten.

Gruß
Jens

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.