Il faut revoir ta façon de traiter les interruptions.
En ne traitant que dans ce cas :
if((encoderAPinALast == LOW) && LstateA==HIGH)
Tes conditions ne traite qu'un cas sur 2 ... où est le cas où LstateA == LOW ?
=> tu avais ta résolution divisée par 2.
il faut que tu fasses :
Si A change :
A = read(PinA)
sens = A xor (last B )
last A = A
if(sens==directionPositive)
speed++
else
speed --
Si B change
B = read(PinB)
sens = !(B xor (last A))
last B = B
if(sens==directionPositive)
speed++
else
speed --
Pourquoi chercher à faire une seule interruption "plus grosse" et faire la distinction des cas dedans quand tu peux faire deux interruptions plus courte avec la distinction déjà effectuée ? =)
De plus je te recommande de faire le read(Pin) sans utiliser les digitalRead. Cela sera aussi plus rapide d'exécution => Il faut lire directement le Port et le pin correspondant.