Forum: Mikrocontroller und Digitale Elektronik Drehencoder, Drehgeber hier im Forum (Rückfrage)


von Maddin (Gast)


Lesenswert?

Hi,

ich beschäftige mich gerade mit diesem:

http://www.mikrocontroller.net/articles/Drehgeber

Artikel. Habe hier einen mechanischen Drehencoder (EC11E15244BY Pollin 
damals 240339 von ALPS) an einem Atmel und Display in betrieb.

Ich nutze zur Zeit die einfache Variante ohne Tabelle.

Beitrag "Re: Drehgeber auslesen"

Der Drehencoder läuft richtig wenn man die Ausgabe durch 2 teilt.

Nun würde ich gern in einer Richtung drehend Variable x hochzählen und 
in der anderen Variable y und ich frage mich wie ich das am einfachsten 
machen kann.

Dabei bin ich auf folgende Lösung gekommen:

void encode (void)
{
  static char last = 0x02;
  char act = 0;

  if( PHASE_A )
    act = 0x01;

  if( PHASE_B )
    act ^= 0x03;        // convert gray to binary

  act -= last;      // difference act - last

  if( act & 0x01 )     // bit 0 = value (1)
  {

    if((act & 0x02) && (last & 0x02))
    {
      enc_cnt_x();
    }
    if(((act^2) & 0x02) && ((last^1) & 0x01))
    {
      enc_cnt_y();
    }

    last += act;      // store new as next last
  }
}

Ich frage mich ob das noch einfacher geht.
Gray Code ist klar, die Umwandlung auch. Irgendwie ist dieser kleine 
Codeschnipsel faszinierend.
Dennoch habe ich noch nicht zu 100% verstanden wie die Funktion sich 
selbst nach jeder Änderung zu sperren scheint, also wie das zustande 
kommt.

M.

von Karl H. (kbuchegg)


Lesenswert?

Maddin schrieb:


> Dennoch habe ich noch nicht zu 100% verstanden wie die Funktion sich
> selbst nach jeder Änderung zu sperren scheint, also wie das zustande
> kommt.

Hierdurch
>
>   act -= last;      // difference act - last
>
>   if( act & 0x01 )     // bit 0 = value (1)
>   {

 ....
>     last += act;      // store new as next last
>   }

An dieser Stelle hat last den Wert, den act vor der Subtraktion hatte. 
Beim nächsten mal auslesen liefert act dann den Wert nocheinmal und 
act-= last wird dann zu 0, wodurch das if nicht mehr greift.

Nach der Subtraktion wechselt act seine logische Bedeutung. Es 
beinhaltet dann nicht mehr den Wert vom Encoder sondern die Veränderung 
zum vorhergehenden Wert (daher auch das += zum Schluss, wenn last 
upgedated wird)

von Maddin (Gast)


Lesenswert?

zudem habe ich noch Pollin 240383

http://www.pollin.de/shop/dt/NjE2OTU3OTk-/Bauelemente_Bauteile/Passive_Bauelemente/Potis_Trimmer_Encoder/Encoder_Noble_RE0124PVB17_7FINB_24.html

das ist ein Drehencoder von NOBLE und 240313:

http://www.pollin.de/shop/dt/Njg2OTU3OTk-/Bauelemente_Bauteile/Passive_Bauelemente/Potis_Trimmer_Encoder/Encoder_PANASONIC_EVEQDBRL416B.html

von Panasonic im Test.

Der NOBLE hat eine Teilung durch 4 nötig so wie es scheint, denn die 
Zählung ist mit meinem Beispiel oben, welches ja schon durch 2 teilt 
immer noch mit Faktor 2 Belegt.

Der Panasonic hingegen funktioniert mit der Routine oben wie oben 
gepostet.

Für mich bleibt das Zustandekommen der Sebstperrung in der Funktion 
sowie das auslegen für den NOBLE Encoder offen.

Gruß,
M.

von Maddin (Gast)


Lesenswert?

danke KH, grübel da gerade dran herum...

von Maddin (Gast)


Lesenswert?

>>Nach der Subtraktion wechselt act seine logische Bedeutung.

dabei sind mir auch schon seltsame kleine Unterschiede in den Routinen 
aufgefallen:

ISR( TIMER0_COMP_vect )             // 1ms for manual movement
{
  int8_t new, diff;

  new = 0;
  if( PHASE_A )
    new = 3;
  if( PHASE_B )
    new ^= 1;                   // convert gray to binary
  diff = last - new;                // difference last - new
  if( diff & 1 ){               // bit 0 = value (1)
    last = new;                 // store new as next last
    enc_delta += (diff & 2) - 1;        // bit 1 = direction (+/-)
  }


hier ist das wieder etwas anders gelöst. Hier scheint genau das getrennt 
handgehabt zu werden.

M.

von Maddin (Gast)


Angehängte Dateien:

Lesenswert?

...so,

ich habe die Signale mal alle dargestellt, für 1fach, 2fach und 4fach.

Jetzt erstmal eine Nacht drüber schlafen. Dann mal sehen wie ich den 
NOBLE Drehgeber auswerte sodass auch diese 2 Funktionen jeweils nur 1x 
aufgerufen werden.

Nacht,
M.

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.