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.
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)
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.
>>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.
...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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.