Mesure de la fréquence d'un signal en créneaux

Bonjour,
J'ai réalisé un détecteur de métaux par boucle à induction : le principe est que lorsque j'approche un objet métallique de ma bobine, la fréquence de mon signal change.
Je souhaite donc mesurer la fréquence d'un signal en créneau afin d'en détecter la variation.

Déjà une question pour ne pas griller ma carte : la tension qui doit être entre 5 et 12 V c'est la tension crête à crête ou l'amplitude ? Et est-ce que ça pose problème que mon signal soit centré en 0 (et donc passe par des valeurs négatives) ?

Je pensais utiliser pulseIn pour mesurer ma fréquence, voici le début du programme que j'ai réalisé:

int pin = 7;
unsigned long duration;
int frequence;
int frequence_de_ref=722;

void setup() {
Serial.begin(9600);
pinMode(pin,INPUT);
}

void loop() {
duration=pulseIn(pin,HIGH);
frequence = 1/((2*duration)*10^-6);
Serial.print(frequence);

Mais problème : le programme m'affiche en continu 0, donc c'est qu'il n'y a pas de détection des impulsions de mon signal...

Il y a aussi un problème de calcul

Dans le domaine de validité de tes variables "duration" et "frequence"
ces 2 variables sont des entiers (donc pas de décimales)
dans ta formule "frequence=1/((2*duration)*10^-6)" tu ne donne pas d'indication au compilateur pour qu'il effectue un transtypage sur tes variables.

"10^-6" dans un domaine de validité de nombre entier est égal à 0
donc "(2*duration)*10^-6" est égal à 0
au final, si on simplifie, tu obtiens 1/0 et là je sais pas donner de résultat

D’accord merci je vais faire des modifs

J'ai remplacé mes 'int' par des 'float' dans ma déclaration de variables mais ça marche toujours pas (au lieu de 0 j'ai 0.00)

Bonne soirée

Bonjour,

Le chapeau (^) n'est pas la mise à la puissance. Il faut utiliser la fonction pow.

Bonjour,

C'est surtout duration qui doit être converti en float

 frequence = 1 / (2 * (float)duration * 1E-6);

Et il ne faut absolument pas de tension négative ni supérieure à 5V

Dans un cas comme celui-la, et de façon générale, en phase de debuggage, fais afficher un maximum de renseignements.

Ta variable "frequence" est le résultat d'un calcul.
Il te vaut mieux afficher les informations "à la source", autrement dit la valeur brute juste après acquisition
Donc, fait afficher la valeur de "duration"

Ensuite, il te faut vérifier les grandeurs physiques en entrée de la carte

  • Est-ce que les tensions électriques sont dans les plages admises ?
    pas au dessus de 5V et pas au dessous de 0V

  • Est-ce que le signal est compréhensible par rapport au moyen de mesure utilisé
    la fonction pulseIn() attend des transitions 0 1 0. Est-ce qu'elles existent ?

  • Il serait bienvenu de vérifier le signal en entrée
    Est-ce que tu as du matériel de type fréquencemètre, intervallemètre, oscilloscope, analyseur logique ?

Merci pour vos conseils, ça y est ça marche même si c’est pas super précis (je pense qu’il faut que j’améliore mon créneau).
Bonne soirée !

Si tu as un oscillo tu dois pouvoir voir la tension min et max