Bonjour à tous,
je désire compter la vitesse d'un moteur à l'aide d'un capteur à effet hall.
J'utilise pour cela l'entrée RA4/TOCKI qui est relié à la sortie du capteur.
En visualisant le signal du capteur à l'aide d'un oscilloscope j'obtiens une vitesse de 76 tr/mn mais en calculant la différence entre deux valeurs du TIMER0 pendant une durée de 1 minute je trouve une vitesse de 38 tr/mn. Soit la moitier de la valeur attendue.
Si vous avez déjà été dans cette situation pouvez vous me donné la réponse à mon intérogation ?
Voilà le programme partiel
/****************************** ********************/
//Quartz de 8 Mhz avec activation de la PLL interne
//Donc fréquence interne de 32 Mhz
void main(void)
{
// Disable_All_Interrupt();
ADCON1 = 0x45; // Configure 2 entrées analogiques et +Vref relié à RA3 ADFM=0 justification à gauche; Fosc/64 ADCS2=0/
ADCON0 = 0x81; // ADON=1; ADCS1=1 ADCS0=0
TRISA = 0x19; // PORTA en entrée bits 0-3 et sortie bits 4-7
TRISB = 0x00; // PORTB en sortie
TRISC = 0x04;
TRISD = 0x01; // PORTD en sortie sauf bit0
TRISE = 0x02; // PORTD en sortie sauf bit1
// config du timer0 TMR0
TMR0H=0x00;
TMR0L=0x00;
T0CONbits.T08BIT=0; // Compteur 16 bits
T0CONbits.T0PS2 = 0; // Prédiviseur= 1/2 période de sortie de 8us
T0CONbits.T0PS1 = 0;
T0CONbits.T0PS0 = 0; //
T0CONbits.T0CS = 1; // Compte les fronts sur l'entrée T0CKI (Hall)
T0CONbits.T0SE = 1; // compte sur front descendant
T0CONbits.PSA = 0; // non Passage par le prédiviseur
T0CONbits.TMR0ON = 1; // active le compteur TMR0
INTCONbits.GIE=1; // activation des interruptions
while (1);
}
/****************************** ****************************** ****************************** ****
interruption à chaque dépassement du TIMER1 passage de 0xFFFF à 0 référence de 4,096 ms
****************************** ****************************** ****************************** ****/
void it_timer1_dep (void)
{ PIR1bits.TMR1IF=0; // effacer le drapeau correspondant
TMR1H=0xEF; // TMR1=0xFFFF - 0x01000
TMR1L=0xFF;
compteur_calcul_1mn++;
if (compteur_calcul_1mn>14648) // fait un calcul toutes les minutes environ
{
compteur_calcul_1mn=0;
tim0_s = TMR0L; // le Timer0 est incréménté à chaque tour du moteur
tim0_s +=TMR0H*0x100;
if (tim0_s>tim0_p)
vit_mot=(tim0_s-tim0_p); // vitesse en tr/mn
else vit_mot=((0xFFFF-tim0_p)+tim0_s); //cas de dépassement
tim0_p=tim0_s;
}
}
/****************************** *******************/
-----