Hi, ich habe selber eine DD Arduino Motortreiber (weiter)entwickelt und dafur auch eine Logik implementiert um der Encoder aus zu lesen (quadrature). Die meiste libraries sind einfach zu kompliziert und so etwas selbst implementieren ist nicht so schwierig.
Eigentlich alles was man braucht ist eine lookup tabelle mit gultige kombinationen vom neue Zustand und letzte Zustand. Im Binary format ist das so etwas:
state = PA_OLD PB_OLD PA_NEW PB_NEW (i.e. bit 3,2,1,0)
Beispiel:
state = 1 0 1 0 --> idx: 10 --> encoder_table[10] (keine Anderung)
state = 1 0 1 1 --> idx: 11 --> encoder_table[11] (Anderung -1 Click)
state = 1 1 1 1 --> idx: 15 --> encoder_table[15] (keine Anderung)
Am nachster update schiebst du dann die letzte 2 bits nach vorne (neue PA/PB sind dann die alte PA/PB). Der wert aus diese Zustand kannst du dann durch diese Tabelle konvertieren in eine "Click".
Hier unten ist meine Code fur eine Arduino Pro Micro, wo ich zwei neben ein ander liegende Pins auf Bank D auslese (PD2 und PD3).
Port mapping findest du hier:
https://www.arduino.cc/en/Hacking/PinMapping32u4
const int8_t encoder_table[] = { 0, 1, -1, 0, -1, 0, 0, 1, 1, 0, 0, -1, 0, -1, 1, 0 };
void Encoder::tick(void)
{
volatile static byte state = 0;
// byte sig1 = digitalReadFast(encoderPinA);
// byte sig2 = digitalReadFast(encoderPinB);
// Update state
// state = ((state & 0b0011) << 2) | ((sig2 << 1) | sig1);
// Update state (new --> old)
state = ((state & 0b0011) << 2);
// Read enconder pulse on PD2 and PD3 (D0/RX and D1/TX)
state |= ((PIND >> 2) & 0b11);
// Update encoder position
currentPosition += encoder_table[state];
}