Mesurer une tension alternative

Bonjour,

Je souhaite mesurer une tension alternative à l'aide de mon arduino Uno. Sachant qu'il supporte une tension d'entrée entre 0-5V? Je voulais savoir comment faire en sorte de décaler mon signal dans cette plage.
Pour être clair, admettons que j'ai un signal sinusoïdale oscillant entre -2.4 et 2.4 Volts. Par quel moyen puis-je faire en sorte que ce signal oscille entre 0 et 4.8 Volts à l'entrée de mon arduino?

J'ai fait quelques recherches sur internet mais je n'ai pas trouvé de réponses claires à ma question.

il y a les zero crossing detector, ou avec un pont de diode ou un trigger de schmidt qui permet de redresser la tension.

tiens un petit schema simple qui peut faire l'affaire trigger de schmidt. en entrée tu as un signal alternatif, et en sortie un signal redresser superieur a 0V.

avec un pont de diodes tu as ca:

Mais dans ton cas il sera inutile, car il y a la chute de tensions des diodes, donc un gros inconvenient.

Bonjour,
Il suffit de faire un décalage du 0 de la valeur max de pas sinusoïde négative.
Pour faire simple un petit AOP sommateur avec sur une des entrée ton signal alternatif et sur l'autre entrée une tension positive.
Ton signal pourra ainsi varier entre 0V et 4.8V.
@+

Encore plus simple :
pont_polarisation.png
La valeur du condensateur est à adapter à la fréquence.
Son impédance Z= 1/(2PIF*C) ne doit pas dépasser une centaine d'ohms : le pont de polarisation représente 5k .
Dans le schéma équivalent l'alim est découplée donc pour l'alternatif elle est court-circuitée par le condensateur de découplage et se trouve à la masse "alternative". Les deux résistances de 10k se trouvent alors en parallèle.

Il aurait fallu préciser les valeurs min et max de la fréquence du signal à mesurer.
Le convertisseur analogique digital d'un avr à des possibilités limitées qui sont sur-limitées par les réglages effectués par l'IDE Wiring/arduino.
Il y aura peut-être de la lecture de la datasheet à prévoir.

Re,
Je suis un peu Shadok ce matin, pourquoi faire simple quand on peut faire compliqué. :wink:

j'ai trouvé un mon tuto tres bien expliqué

http://wiki.mchobby.be/index.php?title=SENSEUR-COURANT-Arduino&mobileaction=toggle_view_mobile

ce qui revient au schema de 68tjs, mais avec les explications :slight_smile:

Bonjour,

A mon avis le circuit avec trigger de schmitt ne conviendra pas, le signal de sortie n'ayant plus l'amplitude du signal d'entrée.

Sinon, au cas ou la fréquence un peu élevée ne permettrais pas le montage le plus simple (celui avec décalage du zéro) à cause de la rapidité de la conversion A/D, pour moi il ne reste que le redresseur sans seuil avec AOP et des diodes de redressement dans la boucle de contre-réaction.

La question est : quelle est la plage de fréquences ?

Serge .D

Merci pour vos réponses, je ne veux pas redresser le signal (il y aura une transformée de fourier derrière) je veux juste rajouter un offset pour passer le signal dans la plage 0-5V. Ma plage de fréquence s'étend du DC à 5kHz. Mais je pense avoir trouvé la solution avec un AOP additioneur non inverseur.

ce qui revient au schema de 68tjs, mais avec les explications :)

Le schéma n'est pas équivalent à celui que j'ai proposé : c'est un mauvais marteau-pilon pour enfoncer un clou.
Si on retire le transfo, l'emplacement de C1 ne convient pas du tout : du courant entre dans la source qui est elle même court-circuitée par C1..

Celui que j'ai proposé est un simple pont de polarisation pour un amplificateur classe A.
Le B A B A de l'électronique.

Le schéma parle de lui même :

  • Une capa pour ne pas perturber la source avec une composante continue.
  • Un pont pour recentrer le signal autour de Vcc/2 (2,5 V).

Azpi:
Merci pour vos réponses, je ne veux pas redresser le signal (il y aura une transformée de fourier derrière) je veux juste rajouter un offset pour passer le signal dans la plage 0-5V. Ma plage de fréquence s'étend du DC à 5kHz. Mais je pense avoir trouvé la solution avec un AOP additioneur non inverseur.

5khz, pas de problème pour créer le décalage avec le schéma le plus simple (celui de 68tjs ). Pour des fréquences très basses, il y aurait un problème.

Sauf que 5 kHz cela fait une période de 0,2ms, à mon avis bien trop rapide pour faire pendant ce délai de nombreuses conversions A/D dans le but de déterminer l'amplitude......

Il s'agit bien de déterminer l'amplitude avec des conversions A/D ou bien alors j'aurais mal compris ?

Serge .D

Encore une fois la réponse est dans la datasheet.
Extrait de celle du 328p (tous les avr ont le même cœur)

Si tu veux détecter l'amplitude max avec un minimum de précision il faudrait avoir 10 points par extrémum c'est à dire 20 sur la période du 5 kHz et donc échantilloner à 5k * 20 = 100 kHz.

Si en relachant sur la précision (8 bits au lieu de 10) tu échantillonne à 76,9 kHz, pour faire un compte rond on va dire 75 il n'y aura que 15 échantillons soit des pas de de 25 degrés

La précision te suffira-t-elle ?

Conversion A/D :

A ce sujet, je viens de lire l'extrait de doc donné par 68tjs sur cette conversion A/D et je poserais bien une question à ce sujet :

La doc indique une durée de 13 à 260µs, ce qui fait un écart important.

Est-ce que cela est du au fait que c'est une conversion A/D qui se fait par "approximations successives"; les différences importantes venant du fait que lors de la première comparaison avec l'échantillon, si on a beaucoup de chance avec le choix de la valeur le résultat sort rapidement avec très peu de comparaisons (donc 13µs) et sinon cela peut durer jusqu'à 260 µs s'il est nécessaire de faire beaucoup plus de comparaisons ?

Serge .D

ce qui fait un écart important.

Il faut tout lire :grin:

Premier point :
Quand on lance l'ADC la première mesure est toujours plus longue que les suivantes toutes choses égales par ailleurs.
Rappel : les entrées faussement appellées analogiques par arduino sont d'abord des entrées numériques : port C pour la Uno et port F et k pour la Mega. Le convertisseur AD n'est pas actif après un reset, il faut l'activer par les "Alternate functions".

Deuxième point :
Le convertisseur fonctionne à différentes fréquences.
Il fonctionne aussi sur le principe de charge d'un condensateur interne --> l'impédance de source doit rester maîtrisée pour ne pas interférer sur le temps de charge de la capacité.

Pour éviter tout souci avec les débutants, Wiring/Arduino a choisi la solution "ceinture + bretelles" en sélectionnant la fréquence d’échantillonnage la plus basse.

D'où cet écart important.

68tjs:
.............
Pour éviter tout souci avec les débutants, Wiring/Arduino a choisi la solution "ceinture + bretelles" en sélectionnant la fréquence d’échantillonnage la plus basse.

D'où cet écart important.
................

Merci.

Serge .D

La doc indique une durée de 13 à 260µs, ce qui fait un écart important.

..................

Wiring/Arduino a choisi la solution "ceinture + bretelles" en sélectionnant la fréquence d'échantillonnage la plus basse.

D'où cet écart important.

Je viens d'évaluer cette durée sur mon Nano actuellement disponible et j'obtiens 112 µs.

Serge .D

Avec qu'elle configuration ?
Valeur de la fréquence d'échantillonage ?
Impédance du signal " à mesurer" ?
10 bits de résolution ou format réduit à 8 bits ?

68tjs:
Avec qu'elle configuration ?
Valeur de la fréquence d'échantillonage ?
Impédance du signal " à mesurer" ?
10 bits de résolution ou format réduit à 8 bits ?

Je n'ai pas du tout fait de protocole bien précisé :

Je situe juste les infos dont je dispose :

  • J'utilise une carte nano "clone très asiatique" sur laquelle il y a par ailleurs un projet en cours.
  • la mesure est faite avec millis() dans une boucle "for" avec 1000 itérations. (le résultat en ms se traduit par des µs)
  • Le signal à convertir est "fixe"; c'est juste une tension continue issue d'un diviseur de tension sur le 5V avec deux résistances de 100 k et 15k coté masse. On obtient une résistance de source d'environ 13 k (je n'utilise jamais plus)
  • il y a aussi un condensateur de 68 nF en dérivation sur la résistance de 15k.
  • Je n'ai pas fait d'évaluation sur un signal d'amplitude variable.

Le PC ayant servi à la compilation est celui d'atelier avec XP et une ancienne version du compilateur arduino. (il faut que je regarde son n°)

Serge .D

Donc c'est avec config "Wiring/arduino" ceinture plus bretelles.
C'est la limite basse, on peut faire mieux.

NB
Quand je veux mesurer un temps de traitement je n'utilise pas millis qui a elle même des temps de traitement.
J'utilse le compteur TCNTx d'un timer, souvant le 2.
Il suffit de bien choisir le prédiviseur et de mettre le compteur à 0 avant l'action à mesurer et de lire juste après la fin de l'action.

Avec un pré diviseur égal à 1 la lecture du compteur donne directement le nombre de cycles horloge système utilisés.

68tjs:
Donc c'est avec config "Wiring/arduino" ceinture plus bretelles.
C'est la limite basse, on peut faire mieux.

NB
Quand je veux mesurer un temps de traitement je n'utilise pas millis qui a elle même des temps de traitement.
J'utilse le compteur TCNTx d'un timer, souvant le 2.
Il suffit de bien choisir le prédiviseur et de mettre le compteur à 0 avant l'action à mesurer et de lire juste après la fin de l'action.

Avec un pré diviseur égal à 1 la lecture du compteur donne directement le nombre de cycles horloge système utilisés.

J'y avais pensé, mais comme c'étais juste une évaluation et que le résultat avec millis() pour 1000 boucles vides donnait 0 ms et 112 ms avec les conversions je n'ai pas cherché plus.

Je viens de regarder c'est la version 1.05.r2

Serge .D