Stap 2: Lezen Quadrature Code Rotary Encoders
Ik wil toevoegen sommige besturingselementen kunnen waarden op het vliegen als het aantal stappen per octaaf en de basis MIDI-notitie wijzigen. Dus ik heb deze Bourns rotary encodersverworven.
Ik vond deze Circuits blog post over lezing rotary encoders nuttig, hoewel ik vond het een beetje moeilijk te volgen als iemand nieuw aan de wereld van Arduino. Ik zal proberen om enkele van de details hieronder verder te verklaren.
De post vermeldt dat encoders quadrature code genereren. Ik gekopieerd de kwadratuur code output patroon boven de data sheet voor mijn encoders. Het laat zien dat wanneer roteren met de klok mee de Staten van de AB-signaaluitgang herhaaldelijk t/m 00, 10, 11 en 01 fietsen. (De volgorde is omgekeerd voor tegen de klok in.)
Dus dan de code uit de bovenstaande verwezen post (fragment hieronder), in het algemeen, wat het doet is winkel 4 relevante bits in old_AB: het eerder gebruikte coderingsprogramma lezen (00, 10, 11 of 01) gevolgd door de huidige encoder lezen (ook, 00, 10, 11 of 01). De matrix enc_states [] bevat drie mogelijke reacties op coderingsprogramma lezingen: 0--geen verandering, 1--toename voor CW en -1--decrement voor CCW.
/* returns change in encoder state (-1,0,1) */ int8_t read_encoder() { static int8_t enc_states[] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0}; static uint8_t old_AB = 0; /**/ old_AB <<= 2; //remember previous state old_AB |= ( ENC_PORT & 0x03 ); //add current state return ( enc_states[( old_AB & 0x0f )]); }
Dus, bijvoorbeeld, als de vorige lezing 00 was en de huidige lezing 10, dan (binaire) 0010 kaarten to enc_state [2 is] = 1, wat increment betekent omdat het coderingsprogramma verplaatst met de klok mee. Een ander voorbeeld, als de vorige lezing 00 en de huidige lezing was is 11, dan is er een leesfout of lawaai, dus dat wordt toegewezen aan enc_state [B0011] = 0--geen verandering. De lezer kan werken uit de andere 14 mogelijke combinaties van eerdere en huidige lezing te zien hoe ze verwijzen naar de [enc_states].