1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| int inputPin = 5; // entrée T1 pour Timer1
volatile uint32_t count_high,count_low;
volatile uint32_t count;
volatile uint16_t ni; // compteur d'interruptions
uint16_t ninter = 60; // nombre d'interruptions pour un comptage
float deltaT;
void setup() {
Serial.begin(115200);
pinMode(inputPin,INPUT);
deltaT = 1.0*ninter*1024*256/F_CPU;
cli();
//déclenche le Timer1 (pour le comptage en mode capture) et le Timer2 pour les interruptions.
// Timer 2 : génération d'interruptions périodiques
TCCR2A |= (1 << WGM21); // CTC mode 'clear timer on compare), top = OCR2A
OCR2A = 0xFF; // fréquence d'interruption 16 MHz /1024/256
TIMSK2 = 1 << TOIE2; // overflow interrupt enable
TCNT2 = 0;
ni = 0;
// Timer 1 : compteur d'impulsions
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
TIMSK1 = 1<<TOIE1; // overflow interrupt enable
count = 0;
TCCR2B |= (0 << CS12) | (1 << CS11) | (1 << CS10); // prescaler = 8
TCCR1B |= (1 << CS12) | (1 << CS11) | (1 << CS10); // external clock on rising edge
sei(); // activation des interruptions
}
//Voici la fonction appelée lors de l'interruption déclenchée par le débordement du Timer 2.
//Lorsque le nombre d'interruptions atteint ninter, on enregistre le nombre d'impulsions comptées dans count puis on remet le compteur d'impulsions à zéro.
ISR(TIMER2_OVF_vect)
{
// Overflow interrupt
ni++;
if (ni==6)
{
ni = 0;
count_low = TCNT1;
TCNT1 = 0;
count = ((uint32_t)count_high)<<16 | count_low;
count_high = 0;
}
}
ISR(TIMER1_OVF_vect)
{
count_high++;
}
//La fonction loop affiche, toutes les 100 ms. La fréquence divisé par 10
void loop() {
delay(100);
uint32_t freq = count/deltaT;
Serial.print("Frequence (Hz) = ");
Serial.println(freq); |
Partager