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.
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 :
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.
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 ?
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 ?
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
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 ?
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.
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.
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°)
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.