Anemometre et mesure de sa tension avec un ESP32

bonjour à tous,

je me creuse les méninges depuis quelques jours entre mes faibles connaissances en électronique et mes recherches sur Internet pour réaliser un dispositif de mesure de la vitesse du vent qui me permettra ensuite de déclencher des actions.
Tout se passe dans un ESP32 que je programme. De ce côté, pas de souci.
C'est la partie montage électronique pour laquelle je sollicite votre avis.

Est-ce que ce que j'imagine vous semble fonctionner ?
Et notamment, si oui, je n'ai aucune idée si mes propositions de dimensionnement sont correctes ?

Voici mon cheminement :
mon anemometre est un simple dispositif à 2 fils qui génère une tension entre 0 et 4V continu (DC). La plage de fonctionnement usuelle est entre 0 et 2V, mais 4V est une valeur possible (et pour info, mais sans intérêt ici, la tension multiplée par 50 donne le vent en km/h d'après l'abaque de mon anémomètre).

La borne VP (GPIO 36) de mon ESP32 sur laquelle je souhaite lire la tension (graĉe au Analog to Digital converter ADC de l'ESP32) est limitée à 3V3.
il me faut donc un diviseur de tension pour ramener le MAX de 4V à 3.3V.

Ensuite, j'ai cru comprendre que l'ESP32 aurait du mal à lire cette tension à cause de la résistance (ou l'impédance ?) de l'anémomètre...
Une bonne solution serait d'utiliser un Ampli OP monté en suiveur pour répliquer la tension en entrée ? et l'alimenter avec la même tension MAX que je vais faire lire à l'ESP32 (donc 3,3V), et permettant ainsi que l'ESP32 "voit" une impédance extrêmement faible. Je l'alimente donc avec la source 3,3V fournie par l'ESP32.

Dernier point, quand je mesure la tension aux bornes de l'anémomètre, je vois que ça fluctue beaucoup.
je me suis dit que pour lisser cette tension, et ne pas être soumis à du "bruit", il fallait peut être mettre un condensateur aux bornes de l'anémomètre ? si oui, je n'ai aucune idée du bon dimensionnement...j'ai voulu récupérer un condensateur que j'avais sur un vieux circuit de récup, il fait 300 µF...

avec toutes ces réflexions, j'en suis arrivé à ce schéma.
Est-ce que vous pensez que ça fonctionne ? quel dimensionnement pour C1 ? est-ce que l'AOP MCP6001T que j'ai choisi vous semble pertinent? (j'essaye de faire du "pas cher")
le fait d'avoir 2 sources de tension (l'alimentation en 5V et l'anémomètre) sur le même circuit me perturbe, mais je ne vois pas comment il pourrait en être autrement ?
[ATTACH=CONFIG]508536[/ATTACH]

Merci d'avance pour vos conseils !

Bonjour

Pas grand chose à commenter, l'AOP fonctionne à 10mV près autour des rails d'alimentation.
Autant alimenter l'AOP en +5v
Concernant l'anémomètre, il faut connaitre son impédance de sortie pour ne pas perturber par R1+R2.
Mettre le condensateur aux bornes de R2, pour ne pas charger la sortie de l'anémomètre.
R1 peut faire 22k et R2 100k, ainsi C1 pourra diminuer de valeur
cordialement

Et tenir compte des limites basse et haute de l'ADC ESP32,
0 à 0,2v = 0
3,2 à 3,3v = 4096

Merci Pascal071 pour votre réponse.
J'ai refait un schéma pour reprendre les modifications conseillées, et être certain que j'ai bien compris :
[ATTACH=CONFIG]508539[/ATTACH]

je ne connais pas l'impédance de sortie de l'anémomètre. Je comprends que la suite de votre commentaire (notamment passer à 122 k au lieu de 12.2k pour le pont diviseur) est lié à ce point ? pour rendre négligeable l'impédance de l'anémomètre ?
je suis en déplacement jusqu'à vendredi => je vais essayer de comprendre comment mesurer ça pour ce week-end (veuillez m'excuser si je ne réponds pas tout de suite à d'autres éventuels commentaires)

Par contre, je n'ai pas compris le point sur le condensateur : quel impact positif cela a-t-il de le mettre aux bornes de R2 plutôt qu'aux bornes de l'anémomètre ?
et quel intérêt d'en baisser sa valeur ? (car si je peux conserver mon condensateur de récup, ça m'arrange, sauf si c'est une mauvaise idée !)

concernant les limites de l'ADC de l'ESP32, je les avais bien en tête (j'avais vu une courbe qui montrait effectivement une non linéarité aux extremes)
ça signifie que je vais être aveugle entre 0 et 0.2V (donc impossible de connaître le vent en dessous de 12 km/h) et au dessus de 3.2V...mais ce n'est pas très grave pour mon application.
par contre, il est vrai qu'il faut que j'adapte mon programme pour considérer une droite entre 0 et 4096 correspondant à des valeurs entre 0.2V et 3.2V au lieu de 0 à 3.3V.

merci

Bonjour,

Pour ne pas avoir à gérer l'impédance de l'anémomètre, pourquoi ne pas mettre le pont diviseur en sortie du suiveur, ... à moins qu'il y ait des problèmes du côté des entrées !

Le fonctionnement du filtre est lié à RC avec Fc = 1/2piRC
Dans le 1er schéma R est inconnu mais supposé faible. Dans le 2e R est grand est défini.
La valeur du condensateur est énorme !


Oui, le adc ne devrait pas suivre les variations. Mais le 300 µF supprime le problème !

Bonjour,

on peut aussi décider que les vents <12 km/h sont intéressants, mais que ceux de plus de 100 ou 150 km/h ne le sont pas.
on pourrait donc ne pas chercher à "mapper" 0-4V sur 0-3V3 (ou plutot 0,25-3,85V sur 0,2-3,2V) mais, par exemple 0-2.5V sur 0,2-3,2V.
Ca peut se faire avec une résistance additionnelle pour ajouter un offset, intégré dans un sommateur (avec possiblement un peu de gain) basé sur l'AOP.
On ajoutera le filtre RC en sortie de l'AOP pour offir une faible impédance de source à l'ADC, tout en en protégeant l'entrée contre les sur-tensions pouvant provenir d'un AOP alimenté en 0/5V

Un vieux condensateur de 300uF a des chances d'avoir un courant de fuite (i.e. une résistance parasite parallèle) non négligeable. On trouve facilement des condensateurs de récupération plastique, ce serait plus adapté.

Edit: le filtre hardware est ici pour filtrer le bruit (freq de coupure fc << 1 Hz). Si le vent varie "trop vite" pour que l'affichage soit agréable, il est plus simple d'utiliser un filtrage software (fc ~ 1 - 0,1 Hz).

Bonjour
Avec 2k et 300µF, le RC fait 0,6sec. n'est pas si grand, pour la mesure du vent.
Il faut que le 300µF soit en bon état..

On peut avoir le modèle d'anémomètre ?

edit.
autant alimenter l'AOP en 3v3, pour le risque noté par Antoane de 5v sur l'entrée ADC.
Les 10mV par rapport aux rails 0v et 3v3 sont infimes.

Bonjour,
Pour ramener la sortie de l'anémo de 0V-4V vers 0.5V-3.3V tu peux le faire qu'avec des résistances.

[ATTACH=CONFIG]508566[/ATTACH]

L'impédance de sortie des 3 résistances fait 70k (R1 || R2 || R3) donc avec C1 = 10µF on garde les 0.7s de constante de temps. C1 fait aussi tampon pour le piètre ADC de l'ESP32.

Il faudrait essayer mais l'AOP pourrait ne plus être nécessaire.

je vous remercie pour vos réponses et l'intérêt que vous portez au sujet !
je n'ai pas les bases techniques pour bien comprendre ce que vous dîtes mais je vais essayer de comprendre en prenant le temps d'ingurgiter ! (ne vous laissez pas tromper par mes jolis schémas : ce n'est que du vernis ;) )

ce que je retiens des messages ci-dessus ou les réponses que j'y apporte :
- brancher l'AOP sur le 3,3V permet de s'affranchir d'une éventuelle surtension délétère pour l'ADC de l'ESP32 puisque la sortie de l'AOP est capée sur la tension d'alimentation => c'est pour ça qu'au début, je l'avais branché comme ça...
mais s'il y a un pont diviseur de tension + un condensateur, ça ne devrait pas arriver...donc je reste en 5V, et je trouve ça mieux (pure intuition) de ne pas charger le 3V3 de l'ESP32 qui me sert par ailleurs et je ne voudrais pas perturber le reste du montage
(dîtes moi si c'est faux)

  • pour répondre à Antoane, personnellement, dans mon application, je dois détecter des vents dès lors qu'ils sont supérieurs à 20/30 km/h.
    Donc je n'ai pas envie de m'embêter (dans 1 premier temps en tout cas) à gérer la zone aveugle en dessous de 12 km/h (mais pourquoi pas dans un second temps pour la beauté du geste ;-) )

  • mon condensateur de récup est une mauvaise idée car probablement abîmé (c'est fort possible effectivement). Du coup, OK, je pars sur l'idée d'en acheter un.
    Vincent mentionne 10 µF, mais sur un schéma sans AOP que d'ailleurs je ne comprend pas du tout (je préfère rester sur l'AOP pour proposer à l'ADC une impédance quasi nulle, et aussi parceque je comprends ce qu'il se passe ;-) et que je n'ai pas besoin de ramener la tension entre 0.5 et 3.3V dans mon cas. Cela étant dit, par pure curiosité, ça m'intéresserait de comprendre !).
    Est-ce que ce dimensionnement à 10µF reste identique avec un AOP ? je n'ai pas compris la logique de dimensionnement de ce composant...

  • je dois toujours creuser comment mesurer l'impédance de mon anémomètre (je verrai ce week-end). Pour répondre à Pascal, je ne connais pas exactement la technologie utilisée pour mon modèle d'anémomètre, acheté pas cher en chine.
    Il y a dessus l'inscription model: kmyc-3 (je ne suis pas certain que ça soit hyper pertinent). Voici en lien un PDF avec les maigres infos sur ce dispositif : http://lette.hopto.org/images/forums/anemometre.pdf

L'ADC de l'ESP a une haute impédance d'entrée.
Pas besoin d'AOP..
Un simple pont diviseur 22k-100k et condensateur 10µF suffira bien.. 0,2s de constante de temps.

Je pense que la sortie de l'anémomètre a une faible impédance.

bonjour,

:S:je plussoie à cette analyse,

bien que je diviserai bien les valeurs du pont diviseur par 4 voir 10
+ filtrage software modulo 8 ou plus des mesures individuelles.

L'impédance de l'anémomètre, qui semble être constituée d'un Moteur DC à aimant permanent
doit donc être très faible (quelques ohms ...checker avec un ohmmètre)

cet article montre que la mesure est possible de 50mv à 3,0V
même si la linéarité n'est pas folichonne.

A vérifier aussi, si une pull-up interne n'est pas activée sur l'entre ADC , qui pourrait biaiser le zéro.

le seul avantage d'utiliser un ampli OP suiveur serait de vraiment limiter la tension d'entrée ESP32 à < 3,3V
inutile avec le pont diviseur et si l'anémomètre est vraiment limité à 4V maximum.
:pff: mais utile avec un Ouragan ou explosion nucléaire souffle >200Km/h

Merci pour ces réponses.

donc je vais partir sur un simple pont diviseur de tension.
22k-100k m'allait bien.

Quel est l'intérêt d'en diviser les valeurs par 4 voir par 10 ? dans le doute sur l'impédance de l'anémomètre, qu'elle soit faible ou élevée, c'est aussi bien avec 22k-100k, non ?

merci pour le lien vers l'article. Ce n'est pas celui là que j'avais lu, mais il reprend les mêmes conclusions que j'avais déjà en tête.
j'étais parti dans l'idée, comme lui, de gérer l'amplitude de tension qu'on ne peut pas lire (en dessous de 0,15V et au dessus de 3,1V) via mon programme.

Cependant, j'ai essayé de comprendre le schéma de Vincent (avec les 3 résistances reliées à un noeud central), et maintenant, j'ai compris comment ça marche. C'est fascinant qu'on puisse faire ça avec juste 3 résistances ! :o
j'hésites quand même à aller vers cette solution... je mettrais plutôt 1,2 MOhm en R2 pour redescendre la borne min de la tension de sortie vers 0,2V...
mais c'est séduisant tout de même...

pour les novices comme moi et qui n'ont pas la patience de chercher, voilà ce que j'ai compris du schéma :
il faut considérer que l'intensité i1 qui traverse R1 s'ajoute à l'intensité i2 qui traverse R2, et rejoignent la masse en traversant R3 (avec un courant i3, qui est donc égal à i1+i2, c'est la loi des nœuds il me semble).
puis en combinant des lois d'ohm dans chaque branche de l'étoile, et le fait que la tension aux bornes de 2 résistances est la somme des tensions aux bornes de chacune d'entre elles :
on a Va (tension de l'anémomètre) = Vout (tension de sortie du dispositif, aux bornes de R3) + V1 (tension aux bornes de R1)
donc V1 = Va - Vout
on a aussi 3V3 = V2 + Vout

V1 = i1 *R1, donc on a i1 = (Va - Vout)/R1
puis 3V3 = i2*R2 + Vout, donc i2 = (3V3 - Vout)/R2
et i3 = Vout/R3.
i1 +i2 = i3 (loi des noeuds ?)
donc (Va - Vout)/R1) + (3V3 - Vout)/R2 = Vout/R3
(j'espère que j'ai pas fait d'erreur, mais sinon, c'est l'idée); Il ne reste plus qu'à résoudre l'équation à une seule inconnue : Vout. et on trouve bien Vout qui varie entre 0,5 et 3,3V avec les résistances indiquées par Vincent. Et si on passe R2 à 1,2M, ça baisse entre 0,2 et 3,3V.

Et l'impédance du système se calcule en considérant qu'à la place des tensions Va et 3V3, les points sont à la masse...et donc les 3 résistances sont en parallèle (puisqu'elles partagent toute la masse d'un côté, et le nœud central de l'autre).
et la formule pour calculer la résistance de 3 résistances en parallèle c'est 1 / R = 1/R1 + 1/R2 + 1/R3. ça donne bien 70k comme indiqué par Vincent !
J'ai pas bien compris quel principe physique fait qu'on fait cette hypothèse de mettre les points sous tension à la masse, mais je comprends que le chiffre de Vincent vient de là.

pour finir, j'aimerai quand même vérifier cette histoire d'impédance de l'anémomètre.
pour mesurer l'impédance de sortie de mon anémomètre, j'ai l'intention de procéder comme ceci (après quelques recherches), mais je ne suis pas sûr de mon coup....si vous avez un avis ?
0) on considère que l'anémomètre est un générateur de tension idéal en série avec une résistance Z (son impédance)
1) mettre un sèche cheveux bien posé en face de l'anémomètre pour le faire tourner, et être reproductible entre les phases de l'expérience
2) mesurer la tension V(vide) aux bornes de l'anémomètre. Comme il n'est pas chargé, il n'y a pas d'intensité qui circule, on peut considérer que la tension du générateur idéal est celle qu'on vient de mesurer V(vide)
3) brancher une résistance, disons de 100k, aux bornes de l'anémomètre (si c'est trop grand, je baisserai)
4) mesurer la tension V(charge) aux bornes de l'anémomètre (en réalité, aux bornes de R....et aux bornes du "générateur idéal de tension V(vide) en série avec son impédance Z")
donc on a V(charge) = I*R...
et par ailleurs, l'anémomètre tournant à la même vitesse, il se comporte toujours comme une source de tension idéale produisant la tension V(vide) mesurée précédemment et un courant I circule dans Z et dans R...
donc on a la relation V(vide) = I * (Z+R)
les 2 membres permettent d'écrire V(charge)/R = V(vide)/(Z+R)
on trouve donc Z = R*(V(vide)-V(charge))/V(charge)

Est-ce que cette méthode vous semble correcte ?

Bonjour

oui, la formule est bonne, il faut descendre la valeur de R jusqu'à une diminution significative, mais pas trop :
si V*vide* est un moteur, je crains que R vienne le ralentir et fausser la mesure.

avec des valeurs plus hautes de Z, on choisit R pour que V*charge* = 1/2 V*vide*
Ainsi on a sans calcul Z=R :S:

Parfait !
Je vais tester ça ce week-end.
Oui j’avais lu des choses sur cette mesure avec un potentiomètre qu’on règle en direct !
Mais j’en n’ai pas sous la main…

Bravo ! Tu as tout compris.

Le théorème de Millman donne directement la valeur en sortie des 3 résistances en fonction des tensions dispo et de la valeur des résistances.

[TEX]V_{ADC}=\frac{\frac{Vin}{R1}+\frac{3.3V}{R2}+\frac{0V}{R3}}{\frac{1}{R1}+\frac{1}{R2}+\frac{1}{R3}}[/TEX]

Ta démonstration correspond au théorème de superposition, qui est un cas particulier de Millman.
Avec superposition :
1) tu gardes Vin allumé mais tu mets le 3.3V à 0V (R2 se retrouve en parallèle de R3) et tu calcules la tension issue du pont diviseur R1 et R2||R3.
2) tu gardes le 3.3V allumé mais tu mets Vin à 0V (R1 se retrouve en parallèle de R3) et tu calcules la tension issue du pont diviseur R2 et R1||R3.
3) tu fais la somme des 2 résultats de 1) et 2)

** tu fais ces 3 étapes 2x, une fois avec Vin = 4V et une fois avec Vin = 0V*

Avec le temps, comme tout le monde, je me suis fait un tableur pour calculer plutôt les valeurs des résistances par rapport aux tensions du montage. Quand on fait du design c'est plutôt ça qu'on cherche.

Ca vient du théorème de Thévenin, il permet de trouver la résistance équivalent d'un montage et la source de tension équivalente (qui ne m'intéressait pas vraiment ici)

Si j'applique la méthode à ton tout premier schéma en considérant une impédance de 2Ω (prise au hasard) pour l'anémomètre ça donne ça.

En 1) Je regarde là où l'ADC va être placé, pour analyser ce qu'il va voir.
En 2) J'éteints la source de tension et je redessine le schéma pour comprendre comment s'agence les résistances. La 10k se trouve en || de (la 2Ω en série avec la 2.2k)
En 3) je vois que la résistance de la source (l'anémomètre + pont diviseur) sera de 1.8k.

Si c'est important de savoir ça, c'est parce que les fabricants de microcontrôleurs sérieux (c'est à dire tous sauf ce qui vient de chine) annoncent clairement qu'elle doit être l'impédance de source max qu'on peut raccorder à leur ADC. Sur un Arduino (ATMEGA328P) la résistance de source doit être de 10k max, au delà il peut y avoir un problème car un ADC tire un peu de courant quand il fait une conversion et si l'impédance de source est trop grande ça cause une chute de tension.

[ATTACH=CONFIG]508681[/ATTACH]

D'où la remarque de paulfjujo pour baisser la résistance de source.

La capa de 10µF sert de réservoir d'énergie intermédiaire et on peut la voir aussi comme une source de tension (intermédiaire) et faire une analyse pour voir qu'elle a aussi une impédance. L'ADC va tirer du courant dans la capa, la vidant un peu, ensuite elle se rechargera en 5*(Z*C). Si le temps entre 2 acquisitions de l'ADC est supérieur à 5*(Z*C) alors le capa aura eu le temps de se recharger et l'AOP n'est plus vraiment nécessaire.

Le soucis avec l'ESP32 c'est que le fabriquant ne donne quasiment pas d'info sur l'ADC, il est donc difficile voir impossible de savoir qu'elle résistance de source il faut.

Merci Vincent pour ces explications.
mais si je comprends bien (je n'avais pas "réalisé" ça jusqu'à présent, même si j'avais tous les éléments pour !)
j'ai 2 problèmes à gérer, dont les solutions s'opposent :

  • d'un côté, j'ai un anémomètre qu'on modélise par un générateur de tension idéal en série avec son impédance...impédance inconnue (que je vais essayer de mesurer), et je dois abaisser la tension entre 0.2V et 3.3V par un "système" pour pouvoir la lire. Si l'impédance de l'anémomètre est élevée, et que l'impédance du système diviseur est basse, le courant tiré va fausser la lecture de la tension...donc par défaut, si je ne connais pas l'impédance de l'anémomètre, j'ai intérêt à mettre une impédance élevée pour mon "système" diviseur de tension, pour que l'intensité "tirée" soit faible et que donc la tension aux bornes de l'impédance de l'anémomètre soit négligeable face à la tension du générateur idéal

  • d'un autre côté, l'ADC de l'ESP32, dont on ne connaît pas la spécification sur l'impédance MAXI du système dont il lit la tension, a donc besoin idéalement d'une impédance la plus faible possible. ce qui s'oppose au 1er point ! C'est la raison du commentaire de paulfjujo, mais ça suppose une impédance faible de l'anémomètre, ce qu'on ne sait pas

une façon de rendre indépendant les 2 problèmes est d'intercaler un AOP entre le système diviseur et l'ESP32 => je peux gérer une impédance élevée pour mon système diviseur, et ne pas perturber l'anémomètre (d'autant plus que l'entrée de l'AOP a une impédance infinie, ça va dans le bon sens)...et l'AOP monté en suiveur, qui a une impédance nulle en sortie, présente la même tension à l'ADC, sans impédance, idéal pour l'ESP32.

je comprends qu'une autre façon de faire est de mettre un tampon : le condensateur, qui est chargé par mon système, et qui "rend" cette charge avec une impédance très faible lors de la lecture par l'ESP32...

ma fréquence de lecture est de 0.5s.
est-ce qu'avec un condensateur de 10 µF, une fréquence de lecture de 0.5s, ça règle mon problème ? et je peux d'un côté mettre un système diviseur a forte impédance, et de l'autre le condensateur sert de passe-plat vers l'ADC avec une faible impédance ?

j'ai l'impression que ça ne marche pas :
si je prend Z = 77k (car je vais mettre R2 à 1.2M dans le système diviseur avec 3 résistances)
5*Z*C = 5*77000*10*10^-6 = 3.8 secondes...nettement supérieur à 0.5s ma fréquence de lecture...

ou alors je n'ai pas compris le fonctionnement avec le condensateur ?

Si on ne sait pas exactement comment fonctionne l'adc (échantillonage, blocage, reset . . .) et la valeur de l'impédance anémomètre, alors un suiveur évitera de se poser des questions en boucle.
Il est également possible de choisir un µC avec datasheet complète (au hazard pic 16fxx).
C'est mon point de vue :deepseul: