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.













