Idee gesucht: Quadratur-Decoder immer richtig initialisieren

OP Persönliche Seite #3895841
Lesenswert?
• ▲
▼
Der Alps Rotary Encoder wackelt manchmal auf der B-Leitung, auch in der 
"Detent stability position" (siehe Bild).

An einem Quadratur-Decoder z.B. an einem STM32 wackelt der Zähler-Wert 
also manchmal zwischen "1 und 2" oder "2 und 3" usw., je nachdem wie das 
Signal beim Initialisieren war. Aber da ich das Signal "B" nicht 
"einfrieren" kann, kann ich beim Initialisieren keinen deterministischen 
Zustand herstellen, wo beim "shift right", also ">>=1" immer eine "nicht 
wackelne Zahl" heraus kommt.

Bei "zwischen 2 und 3" gibt ein ">>=1" einen stabilen Wert, aber
bei "zwischen 1 und 2" liefert ">>=1" mal 0 und mal 1.

Klar, kann ich den Wert von B abfragen und den Decoder entsprechend 
initialisieren. Aber wenn sich "B" zwischen "abfragen" und 
"initialisieren" ändert, wackelt's nach ">>=1" trotzdem noch.

Wie macht man das richtig?
Angehängte Dateien:
OP Persönliche Seite #3895891
Lesenswert?
• ▲
▼
Entweder ich stehe auf dem Schlauch oder das Problem ist noch unklar:

Der Quadratur-Decoder an einem STM32 liefert einen Zähler-Wert. Der 
Zähler zählt rauf und runter, je nach Drehrichtung.

Wenn ich am Quadratur-Decoder (das ist Hardware!) die Eingänge tausche, 
habe ich manchmal trotzdem noch Wackeln im LSBit.

Ich weiss also nie ob das linke oder das rechte Bild gilt.
Angehängte Dateien:
OP Persönliche Seite #3896052
Lesenswert?
• ▲
▼
Uwe Bonnes schrieb:
> Der Decoder kann Flanken auf beiden Signalen oder nur einer Flanke
> auswerten.

Für einen Quadratur-Decoder ist das ja korrekt initialisiert, also mit 
beiden Signalen und beiden Flanken. Das Problem ist: Ich weiss nach der 
Initialisierung nicht, ob das linke oder das rechte Bild (s.o.) gilt, 
also

1 2 3 4 5 … oder
0 1 2 3 4 …

Mit "TIM_GetCounter(TIM1) >> 1" möchte ich aber ein stabiles Signal 
haben und nicht mal einen mehr oder einen weniger.
OP Persönliche Seite #3896305
Lesenswert?
• ▲
▼
Uwe Bonnes schrieb:
> oder nur einer Flanke auswerten.

Ach du meinst zählen, nicht auswerten. Trotzdem danke.
1
TIM_EncoderInterfaceConfig(TIM1, TIM_EncoderMode_TI2, TIM_ICPolarity_Falling, TIM_ICPolarity_Rising);

Damit geht´s. Also:
Auswerten: Beide Flanken,
Zählen:    Nur eine Flanke.

Ich wusste bis eben nicht, dass da noch ein Unterschied ist.

:-)

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.