Forum: Mikrocontroller und Digitale Elektronik Drehgeber Drehrichtung auswerten


von Lokus P. (derschatten)


Lesenswert?

Wie kann ich von einem Drehgeber nur die Drehrichtung auswerten?
Ich benötige pro Rasterung einer Richtung ein HI auf jeweils einem 
Portpin für 2 Sekunden.

Genügt es wenn ich bei dem Beispiel mit dem Drehgeber -> 
http://www.mikrocontroller.net/articles/Drehgeber
direkt im Interrupt ansetze?
Oder muß ich mir hierfür eine Tabelle anlegen und diese auswerten?

von Wolfgang (Gast)


Lesenswert?

Lokus Pokus schrieb:
> Wie kann ich von einem Drehgeber nur die Drehrichtung auswerten?

Indem du bei der Auswerteroutine den Zähler für die Schritte ignorierst 
und nur die Richtung verwendest.

von Lokus P. (derschatten)


Lesenswert?

Das sollte laut beispiel eigentlich hier passieren:
1
enc_delta += (diff & 2) - 1;

Demnach müßte enc_delta die Richtung ausgeben.
Wleche Werte erhalte ich hier für Links oder Rechts?

Ist 1 links und 0 rechts?

von Wolfgang (Gast)


Lesenswert?

Lokus Pokus schrieb:
> Wleche Werte erhalte ich hier für Links oder Rechts?

Das kommt drauf an, wie dein Drehgeber angeschlossen ist.

von Lokus P. (derschatten)


Lesenswert?

An welchem Pin?

von Immitsch-Berater (Gast)


Lesenswert?

Vielleicht hilft Dir dieser Artikel bei der Auswertung des Encoders:
http://www.edn.com/design/systems-design/4416528/Adaptive-rotary-encoder-distinguishes-fine-from-coarse

-Immitsch-Berater-

von Lokus P. (derschatten)


Lesenswert?

Das hilft mir leider nicht weiter.

Und enc_delta liefert auch nichts brauchbares dafür.

von Spess53 (Gast)


Lesenswert?

Hi

>Ist 1 links und 0 rechts?

>Und enc_delta liefert auch nichts brauchbares dafür.

Wieso?

 0 - nicht gedreht
 x - eine Richtung
-x - andere Richtung

MfG Spess

von Lokus P. (derschatten)


Lesenswert?

Ach, ein Minuswert.

Etwas umständlich, aber es funkt:
1
  for(;;)
2
  {
3
    ADCSRA &= !(1<<ADEN);                    // ADC dekativieren
4
    ACSR = 0x80;
5
    
6
                            // Analogcomperator dekativieren
7
    if (enc_delta > 0)
8
    {
9
      links();
10
      _delay_ms(DELAY_RESET);
11
      enc_delta = 0;
12
    }
13
14
    if (enc_delta < 0)
15
    {
16
      rechts();
17
      _delay_ms(DELAY_RESET);
18
      enc_delta = 0;
19
    }
20
    if (enc_delta == 0) AUSGANG_PORT = LO;
21
  }

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.