Mesurer une fréquence avec un Arduino

Un G.B.F. (Générateur de basses fréquences) permet de délivrer un signal avec la fréquence désirée sous forme de sinusoïdes, de créneaux (signal carré), ou de triangles.

Nous allons ainsi envoyer un signal à l’Arduino. Celui-ci pourra ensuite mesurer la fréquence du signal d’entrée.

Il est conseillé de directement relier votre GBF à un oscilloscope afin d’obtenir une image en direct du signal que vous générez.

Nous utiliserons plus tard une fonction qui permet de détecter le temps d’état haut et/ou le temps d’état bas d’un signal. Nous devons donc générer un signal carré.

Sur le GBF, il suffit de presser le bouton ci-dessous :

Les entrées analogiques de l’Arduino ne peuvent recevoir que des tensions comprises entre 0V et +5V. Envoyer une valeur plus grande risque de détruire l’interface, voir la carte.
Il faut donc bien veiller à créer un signal électrique avec une amplitude inférieur ou égale à 5V.

De base, le GBF va créer un signal oscillant entre -5V et +5V. Il faut donc déplacer ce signal afin d’obtenir un signal oscillant entre 0V et +5V.
Le bouton Offset permet d’ajouter une composante continue à notre signal. Nous pouvons donc faire monter notre signal dans l’intervalle qui nous intéresse.

Le réglage de l’offset et de l’amplitude s’effectue de cette façon :
(il faut tirer le bouton de l’offset afin de modifier la composante continue).

Attention ! Avant de brancher votre Arduino au GBF, vérifiez que le signal ressemble à celui-ci sur l’oscilloscope :

 

Câblage :

 

PusleIn :

La commande PulseIn permet de mesurer la durée d’une pulsation. Il est ainsi possible de déterminer le temps sur une période de notre signal à un niveau logique 1 ou 0.
PulseIn nous retourne ensuite la durée de l’impulsion en microsecondes.

La syntaxe est la suivante :


pulseIn(pin, value)
pulseIn(pin, value, timeout)

Le premier paramètre permet de définir l’interface où vous souhaitez lire la durée de l’impulsion
Le second paramètre permet de définir si l’on souhaite mesurer la durée d’un état haut (HIGH) ou un état bas (LOW)
Le troisième paramètre permet de déterminer un temps d’attente en microsecondes avant la mesure d’une impulsion.

Code :

const int Signal_GBF = A1; // Signal Analogique

void setup() {
// Configure le port série pour l'exemple
Serial.begin(9600);

// Met la broche de signal venant du GBF en entrée
pinMode(Signal_GBF, INPUT);
}

void loop() {
// Mesure la durée de l'impulsion haute
unsigned long etat_haut = pulseIn(Signal_GBF, HIGH);

// Mesure la durée de l'impulsion basse
unsigned long etat_bas = pulseIn(Signal_GBF, LOW);

// Calcul de la periode = etat haut + etat bas
long periode = etat_bas + etat_haut;

// Calcul de la frequence = 1 / periode
long frequence = 1000000 / periode;

// Affichage des résultats
Serial.println("Duree etat haut : " + String(etat_haut));
Serial.println("Duree etat bas : " + String(etat_bas));
Serial.println("Periode : " + String(periode));
Serial.println("Frequence : " + String(frequence) + " Hz");
Serial.println();

delay(1000);
}
Détecter fréquence depuis un GBF

 

11 comments

comments user
boubakr

est ce qu’on peut utiliser un arduino pou genere des frenquences ?

    comments user
    mataucarre

    Générer une fréquence sur quel type signal ?

    comments user
    rodolphe waline

    oui possibilité de fournir tout type de signaux
    en carré la fréquence peut aller à 10 khz environ
    dans les autres formes, cela dépend de votre « nombre de points par seconde », on considèrera 1 khz environ..

comments user
Burgou

Bonjour, n’étant pas un grand spécialiste et avant de me lancer, je voudrais savoir s’il est possible de récupérer les numéros composés sur une ligne téléphonique (DTMF) chaque chiffre étant composé de deux fréquences consécutives.
C’est possible ? ou mon idée est débile !
Merci.

    comments user
    rodolphe waline

    bonjour,
    oui c’est possible à partir d’un décodeur dtmf(pas cher) qui fournira des 1 ou 0 sur ses différentes sorties en fonction des touches appuyées

    voir le décodeur chez radiospares

comments user
christophe Lamouret

Bonjour
quelle est la fréquence maximale que l’on peut mesurer avec un arduino? ou bien quelle est la fréquence de scrutation des entrées, est elle dépendante de la taille du programme?
merci

    comments user
    rodolphe waline

    vitesse maximum de l’ordre de 10 khz (pour un programme « moyen »)

comments user
MOUHOUBO

bonjour

Je travaille sur le traitement du signal, je veux applique FFT au le signal donne par le generateur de fréquence pouvez-vous m’aide ?

comments user
DIALLO

bonjour j’ai un projet portant sur des électrovannes je dois contrôler les électrovannes et un débitmètre à partir d’une carte arduino merci pour votre aide

comments user
nicolas

Bonjour je suis intéressé par votre fréquencemètre arduino ,
pourrait-il mesurer des fréquences de plusieurs centaines
de mhz.
Merci de votre attention ,

    comments user
    mataucarre

    Il me semble que c’est 16Mhz max !