Bonjour!
Dans le cadre d'un projet de robotique je dois, à l'aide d'un PIC18F2455 mesurer la fréquence d'un encodeur moteur.
J'ai réussi à programmer quelque chose qui me semble cohérent, mais ça ne marche pas...
La fréquence voulue est 17kHz (qui est égale au rapport cyclique de 128, 50%). Je fausse la valeur du PWM de départ pour voir qu'il corrige bien.
Voila mon code:
Mon programme fonctionne ainsi:Code:unsigned int duty_cycle = 0x00; // duty_cycle est une variable de type INT unsigned long mesure = 0x00; // mesure est une variable de type LONG unsigned long result = 0x00; // result est une variable de type LONG void PWM1_Init(); // Déclaration des fonctions du PWM void PWM1_Set_Duty(duty_cycle); void PWM1_Start(); void main() // Programme principal { TRISC.B2=0; // Initialisation des entrées/sorties TRISA.B4=1; duty_cycle=140; // Initialisation du rapport cyclique INTCON.GIE=0; // Initialisation pour le timer0 INTCON.TMR0IE=0; T0CON.TOSC=1; T0CON.TOSE=0; T0CON.PSA=1; T0CON.T08BIT=0; PWM1_Init(20000); // Initialisation du PWM PWM1_Set_Duty(duty_cycle); PWM1_Start(); delay_ms(2000); // Attente de 2 seconde mesure=0.0; while(1) // Boucle principale { TMR0H=0; // Mise à 0 des valeurs pour la prochaine mesure TMR0L=0; T0CON.TMR0ON=1; // Mesure sur 10ms delay_ms(10); T0CON.TMR0ON=0; delay_ms(200); // Attente de 200ms mesure=TMR0H<<8|TMR0L; // Sauvrgarde de la valeur mesurée mesure*=100; // Calcul de la fréquence result=mesure; if(result>=17001) // SI la fréquence est plus grande que 17kHz { duty_cycle--; // ALORS on décrémente le rapport cyclique du PWM } if(result<=16999) // SI la réquence est plus petite que 17kHz { duty_cycle++; // ALORS on incrémente le rapport cyclique du PWM } PWM1_Set_Duty(duty_cycle); // Mise à jour du rapport cyclique } }
Hormis toutes les initialisation et les déclaration, je lance le timer0 (comme compteur) pour compter le nombre de flanc, venant de l'encodeur, durant 10ms. Ensuite, je multiplie le nombre de flanc que j'ai eu par 100 pour avoir le total en 1 seconde.
La correction se fait grâce au 2 "if" qui incrémente dans le cas ou la vitesse est inférieur et vice versa.
Le résultat? Le PWM s'incrémente jusqu'a la vitesse max (255) pour recommencer à 0, remonte jusqu'à 255) et recommence à 0 et ainsi de suite...
Pourriez-vous m'aider s'il vous plaît ?
Dites moi si vous n'avez pas assez d'infos pour m'aider...
Merci et bonne journée!
Romain.
-----