calculer la fréquence moyenne d'un signal carré

Bonjour,

J'ai un signal sinusoïdale que je converti en signal carré pour une lecture plus facile pour l'arduino. Cette conversion est réalisée à l'aide d'un lm311, le signal à une amplitude 0 / 5V et une fréquence virant entre 0 et 2khz.

Je voudrais savoir comment mesurer cette fréquence.

Pour le moment j'utilise la fonction PusleIn avec laquelle j'obtient le temps en micro seconde entre chaque front.

Avec cette formule basique F=1/T je peux donc obtenir la fréquence mais deux problème se pose:

-le T doit être en seconde or je ne sais pas comment m'y prendre pour convertir le temps en micro seconde en seconde, quelle variable utiliser
(1 seconde = 0.000001 microseconde)
-une fois cette conversion effectuée, la fréquence va varier à chaque front montant ce qui rendra la lecture illisible. Je voudrais donc savoir comment faire la moyenne de cette fréquence.

ci-joint le début de mon code très basique.

int Sensor = 2; //capteur sur pin 2
unsigned long duree; // variable utilisée pour stocker la durée = période

void setup()
{
 pinMode(Sensor, INPUT); // met la pin 2 en entrée
 Serial.begin(115220);   //définition de la vitesse du port série
}

void loop()
{
duree= pulseIn(Sensor,HIGH); // durée = temps entre chaque frotn montant
Serial.print (duree); // ecrire la période dans le moniteur série
Serial.println (";"); // placer ";" après chaque période
}

[code/]

tu auras ta réponse dans la documentation arduino

http://arduino.cc/en/Reference/PulseIn

si tu as la durée tu peux facilement connaitre la frequence avec un simple calcul...
t=1/F

tu as une 2eme astuce un peu plus compliqué peut etre, Si tu mets ton signal sur une broche possèdant une interruption, tu pourras compter le temps qui passe entre deux créneaux et ainsi déduire ta période/fréquence.

La fonction PulsIn est "bloquante", ça veut dire que ton Arduino ne fait rien d'autre qu'attendre entre 2 mesures et qu'il peut aussi en "rater" 1 sur 2.

La proposition de hazerty565 est une bonne solution.

La solution "idéale" pour moi est la suivante :
Utilise le "Input Capture Unit" du timer1 de l'ATMega 328p qui est faite pour ça, mais uniquement utilisable sur le pin 8 de l'Arduino UNO.