Lire la fréquence d'un signal sinusoidale avec la carte Arduino

Bonjour,

Je travaille sur un projet qui consiste à mesurer la hauteur d'eau grâce à une capacité et lorsque le niveau de l'eau est trop haut, le réservoir se vide.
Pour ce faire, j'ai besoin de lire la fréquence d'un signal sinusoidale, avec l'arduino puisqu'il faut que je commande un moteur avec, pour en déduire la hauteur d'eau (grâce a la capacité). Le problème est que mes fréquences vont être élevé, de l'ordre du MHz je pense.

Y a-t-il quelqu'un pour m'aider ?

john_ee:
Bonjour,

Je travaille sur un projet qui consiste à mesurer la hauteur d'eau grâce à une capacité et lorsque le niveau de l'eau est trop haut, le réservoir se vide.
Pour ce faire, j'ai besoin de lire la fréquence d'un signal sinusoidale, avec l'arduino puisqu'il faut que je commande un moteur avec, pour en déduire la hauteur d'eau (grâce a la capacité). Le problème est que mes fréquences vont être élevé, de l'ordre du MHz je pense.

Y a-t-il quelqu'un pour m'aider ?

bonjour
tu pense ou tu es sur et certain 8)
lien(s) vers ton capteur ?

Des solutions existent mais il faudrait fréq min , fréq max , niveaux crête à crête min et max.

Et aussi "une idée" de la précision de mesure demandée.

Bonjour,

En l'état des choses, je dirai que FreqCount est utilisable pour faire ce genre de mesure : FreqCount Library, for Measuring Frequencies in the 1 kHz to 5 MHz Range

Mais comme le dit 68tjs il nous faudrait plus d'info sur le signal d'entré.

Merci de vos réponses et désolé de tarder. Mes fréquences seront de l'ordre du 230 kHz. De plus, l'amplitude va de 7,40V à -8,20 V. Il faut que je l'atténue, non ?

Oui tu as tout dans le lien de skywood

Bonjour

  • Mettre un adaptateur, buffer pour une mise en forme (0v, 5v).
  • faire suivre par un diviseur par 10 ou par 100, on obtient une fréquence de quelques Hertz.
  • mesurer la période plutôt que la fréquence avec un compteur dans une boucle. Quand le compteur dépasse une certaine valeur, on met la pompe en route.
  • plus le niveau est haut plus la période est grande.

Adaptateur de niveaux
il faut un condensateur pour isoler C1, un pont diviseur pour atténuer, un pont de polarisation pour centrer le signal alternatif à un niveau acceptable pour le micro.

On va voir qu’on peut réaliser ces fonctions avec 3 résistances et 2 condensateurs.

Condensateur : il ne doit pas atténuer le signal. l’impédance d’un condensateur se calcule : Z= 1/(2PIC*F)
Si F = 250 kHz et si on prend C= 1µF on aura Z = 0,7 ohms ce qui est correct.
Idem pour C2 qui est le condensateur de découplage d’alimentation du micro. Pour l’alternatif une source de tension est un court-circuit. C’est pour améliorer ce rôle de court-circuit que l’on place des condensateurs de découplage. Là aussi il faudra prendre au minimum 1 µF.

Valeur des ponts :
Polarisation : R2 et R3.
Une entrée d’un micro ATMega commute autour de 2,3V pour éviter les instabilités en absence de signal à 250 kHz on choisira une tension de polarisation de 2V.
Ce qui donne R3/(R2+R3) = 0,4
On choisi de ne pas trop consommer dans le pont soit i= 1mA, on peut calculer R2 = 2V/ 1mA = 2kohms et donc R3 = 3kohms.

Atténuation:
Pour l’alternatif, et à cause de C2, R2 et R3 se trouvent placées en parallèle . La résistance équivalente formera le pont atténuateur avec R1.
Re = R2// R3 = R2*R3/ (R2 +R3) = 1,2kohms
Considérons qu’on a une valeur crête à crête de 20 V (en fait 17 V dans l’appli mais 20 V donne des marges) et qu’on veut la limiter à 5V, l’atténuation est égale à 4
Soit Re/(R1+Re) =1/4
ce qui donne R1 = 3 Re = 4,8 kohms

Pour la suite il existe des bibliothèques pour mesurer des fréquences.

forum_pont.png

Plop!

Alors moi je te prodpose 2 solutions!

Solution 1:
Tu convertis ton signal sinusoidal en une tension. En faite pour ton truc, je présume que tu dois avoir une fréquence max quand c'est plein et une fréquence min quand c'est vide. Donc ca doit varier entre 2 fréquences. L'idée, c'est de dire pour ta fréquence min tu as a peu pres 0V et pour ta fréquence max tu as 5V.
Pour ce faire va falloir maitriser un peu d'electronique, quelque AOP, résistance et condo devrais suffir.

Solution 2:
Tu comptes le nombre d'oscillation par seconde : il faut etre rusé!
Le probleme c'est quand dans un signal sinusoidal c'est pas facile à exploiter. L'idée c'est de convertir ce signal en un signal carré de meme fréquence. Et comme tu aura un signal carré qui evolura entre 0 et 5V tu le balance dans l'arduino et tu compte le nombre de FRONT MONTANT par SECONDES (enfaite c'est le changement de 0 à 5V).
Apres toute les secondes, tu applique la formule à la con f=1/t
t= le nombre de front que tu as compté.
Pour ca faut que tu utilise les interruption pour bien detecter tout les changements sur ton entrée.

Le probleme c'est quand dans un signal sinusoidal c'est pas facile à exploiter.

Il n'y a aucune difficulté à activer une entrée CMOS avec un signal sinusoïdal.
Si le signal est carré tant mieux mais rien à faire s'il est sinusoïdal ce n'est pas la peine de gâcher des centaines de mA pour de la cosmétique.

Il faut atténuer le signal pour que sa valeur Crête à crête ne dépasse pas 5Volt
Il faut centrer ce signal autour de 2,5 Volt théoriques.

Il faut aussi bien connaître les entrées des micro AVR et donc lire les datasheets.

Pour un 328p
Le niveau de commutation du 1 vers le 0 est égal à 2,2 V
Le niveau de commutation du 0 vers le 1 est égal à 2,75 V

Soit un hystérésis d'environ 0,5 à 0,6 V.

Il est préférable de positionner le signal alternatif soit légèrement en dessous de 2,2 V soit légèrement au dessus de 2,75 V.
Cela garanti une protection contre des basculements intempestif sur du bruit si le signal à mesurer est déconnecté.

Il n'y a aucune difficulté à activer une entrée CMOS avec un signal sinusoïdal.
Si le signal est carré tant mieux mais rien à faire s'il est sinusoïdal ce n'est pas la peine de gâcher des centaines de mA pour de la cosmétique.

Bien vu l'aveugle! je suis partis un peu loin et c'est vrai que ca marche aussi comme ca! Donc pont diviseur (2 résitances) et 1 diode encore plus simple le truc^^

Non relis mon premier message un peut plus haut. : 3 résistances et 1 +1 condensateurs de 1µF (pour du 250kHz). Je ne vois pas à quoi sert la diode.
Après il faut gérer par programmation mais des exemples existent.

En faite avec ton montage tu centre le signale sur 2,5V. mais moi dans l'idée si c'est pour detecter des fronts montants, tu met une didode pour supprimer les valeurs négative, et un pont diviseur. La tu te retrouve avec une alternance sur 2 et ca suffit pour faire basculer le CMOS: ca fait un truc du genre: /_/_/_/_

Deux défauts a ta solution :

  1. le VD d'une diode bouge en température, ce n'est jamais agréable à gérer.
  2. Plus génant tu perd en sensibilité. Je posionne le signal de façon a avoir la pente la plus forte autour de la tension seuil de décision 1 ou 0 du micro.
    Là ou tu le positionne le signal la sinusoïde est déjà bien marquée, la pente du signal est plus faible et tu induis une gigue dans la décision 1 ou 0.

Je suis en train de tenter ton montage, 68tjs, et j’aurais du te le demander, ou est-ce que j’envoie mon signal ? Je l’envoie dans le coté du symbole du GBF ?

PS: J’utilise le montage suivant pour récupérer la valeur de la capacité (directement relié par une formule simple à la fréquence). Je prélève le signal à la borne sortant de la résistance et à la masse pour observeer le signal dans un oscilloscope.

Montage_res_negative.png

Je n'ai pas trop le temps de m'éterniser (je devrais être déjà parti) mais je peux dire vite fait que le signal alternatif se connecte sur la borne extérieure de la capa série.
Entrée sur la gauche du schéma et sortie sur la droite comme c'est la norme.