Programme un peu long, difficile à tester sans le matériel, toutefois je vois quelques problèmes de fond. D'abord la manière dont vous traitez les signaux du codeur incrémental.
// Interruption de l'encodeur A en sortie 0 (pin 2)
attachInterrupt(0, doEncoderA, CHANGE);
// Interruption de l'encodeur A en sortie 1 (pin 3)
attachInterrupt(1, doEncoderB, CHANGE);
//---- Interruption appelée à tous les changements d'état de A
void doEncoderA()
{
A_set = (digitalRead(encoderPinA) == HIGH);
encoder0Pos += (A_set != B_set) ? -1 : 1 ; //modifie le compteur selon les deux états des encodeurs ( correspond au front montant de A, on compare à B pour déduire le sens de rotation et on en déduit si on incrémente +1 ou -1)
}
Si je lis bien les docs, vous passez dans vos ISR à chaque changement d'état, donc aussi bien sur front montant que sur front descendant. Votre manière de détecter le sens de rotation et de compter ne fonctionne donc pas puisque vous ne tenez pas compte du sens du changement d'état qui a provoqué l'interruption. Je vous recommande, dans chacune des deux ISR, de lire les DEUX bits A et B, avec le moins de temps de latence possible entre les deux. Cela parce que les codeurs suivent les vibrations mécaniques de l'arbre sur lequel ils sont fixés et, dans certains cas, vous avez une rafale de changements très rapides sur un des deux bits, et si vous n'en lisez qu'un par ISR vous risquez d'avoir des situations de "décalage de position" petit à petit.
void asservissement ()
{
time += 20; // pratique pour graphes excel après affichage sur le moniteur
erreur = target_ticks - encoder0Pos;
somme_erreur += erreur;
// Calcul de la vitesse courante du moteur
int vitMoteur = kp * erreur + kd * (erreur - erreurPrecedente) + ki * (somme_erreur);
erreurPrecedente = erreur; // Ecrase l'erreur précedente par la nouvelle erreur
Le commentaire "calcul de la vitesse courante du moteur" est trompeur. Il s'agit du calcul de la sortie à appliquer en consigne de vitesse à un variateur de vitesse. Faites attention au fait qu'avec cette manière de calculer votre coefficient Kd doit être négatif si vous voulez stabiliser votre asservissement. Je vous conseille aussi de limiter la valeur de la variable somme_erreur, pour éviter qu'un retard de poursuite dû à une accélération trop forte, un problème mécanique, etc. ne vous conduise à des situations à problème.
Votre sortie vitmoteur est codée sur 8 bits, voire 8 bits plus signe. Si vous utilisez un variateur de vitesse derrière pour commander le moteur, avec une dynamo tachy, cette résolution est trop faible, vous allez ressentir la numérisation de votre signal de sortie sur la mécanique en injectant des fréquences vibratoires. Dans ces cas là, 12 bits de résolution est un mimimum. Si vous attaquez directement un petit moteur en tension, ça peut le faire.