Je suis en train de réaliser un premier algorithme d'asservissement de vitesse par PID, le but étant de faire rouler droit le robot en question.
J'ai commencé par implémenter un PID à 50Hz sur un seul des deux moteurs et ça semblait bien marcher. Du coup j'ai testé ce que ça donne à 100Hz pour voir. Et là j'ai constaté que le moteur allait plus vite... ce qui n'est pas normal si ?
Je me suis basé sur cette page. Comme je ne travaille pas sur arduino j'ai adapté le code à mon besoin.
Pour déboguer et régler l'asservissement j'utilise la même méthode. D'ailleurs, bien que visuellement la roue semble tourner plus vite, les valeurs retournées de celles-ci sont similaires.
Infos utiles : Je programme en C sur un AVR atmega328p cadencé à 20Mhz. Celui-ci est totalement dédié à l'asservissement des 2 moteurs du robot. Les codeurs sont lu sur interruption.
La routine principale qui appel le pid 50 fois par seconde:
while (1) { pid(consigne); // consigne = nombre de tr/sec _delay_ms(20); // PID à 50Hz (F=1/t) }
La fonctione d'asservissement:
void pid(float ConsigneVit) { float compteurD; float mesure_vit_d; // affectation des compteurs de PID et reset des compteurs sur interruption compteurD = tickD; tickD = 0; mesure_vit_d = (50*compteurD)/tick_trm/reduction; // vitesse mesurée en tr/s //calcul des erreurs erreur_d = ConsigneVit - mesure_vit_d; somme_erreur_d += erreur_d; delta_erreur_d = erreur_d - erreur_prec_d; // calcul de la commande PWMD += ((kp * erreur_d) + (ki * somme_erreur_d) + (kd * delta_erreur_d)); // Normalisation des commandes PWM de sortie (le moteur ne bouge pas avec un pwm < 240) if (PWMD < 240) {PWMD = 240;} else if (PWMD > 1023) {PWMD = 1023;} // mise à jour de l'erreur précédente erreur_prec_d = erreur_d; //EnvoiFloat((PWMD/100)); EnvoiFloat(mesure_vit_d); // envoie la valeur via uart EnvoiChaine("\r\n"); // retour a la ligne }
Quelqu'un pourrait m'aider à comprendre ?
Merci.