Go Down

Topic: Transformation de signal (Read 1 time) previous topic - next topic

ArnaudF

Bonjour,

Je suis nouveau utilisateur de système Arduino UNO. J'ai un projet à mener qui est relativement simple mais je ne sais pas comment y parvenir. J'ai fais quelques essais sur Tinkercad mais sans succes...

Mon objectif est de prendre en entré de mon arduino un signal qui peut être amené à varier de -10v à 10v (je vais l'appeler SignalIN) et de le transformer via cette opération : SignalOUT=((-SignalIN + 10)*(3/10)) et de le sortir via un output.
De cette manière j'ai un signal qui va être transformé d'une plage de -10v_10v à un signal 0v_6v.

Comment puis-je proceder ? J'ai l'impression que les sorties sont limitées à des valeurs uniques de 0v et 5v et ça m'embete... Après je n'ai pas les connaissance necessaire pour savoir si on peut faire autrement.

Pouvez vous m'eclairer sur le sujet ?

Cordialement,
Arnaud

hbachetti

Il va falloir un peu d'électronique supplémentaire.
S'agit-il d'un signal continu ou alternatif ?
D'où sort-il ?
Quelle impédance ?
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

dbrion06

Je transformerais le signal, si je veux vraiment utiliser un Arduino, en un signal analogique variant de zero à 5 volts, en additionnant analogiquement :
la moitie du 5 volts
le quart du signal d'entrée.
Je rajouterai l'hypothèse que l'impédance du signal d'entrée  est faible devant , disons, 40 kohms
et qu'il ne varie pas trop vite et j'irais voir du côté de
[url]https://fr.wikipedia.org/wiki/Montages_de_base_de_l%27amplificateur_op%C3%A9rationnel#Amplificateur_diff%C3%A9rentiel/url]
avec V1 : signal -gain  -1/4-

Ensuite, le convertisseur analogique numérique peut faire son office, et,
 si le signal est très lent, analogWrite peut alimenter, par le biais d'un FET, du 6volts (le calcul dans l'arduino est alors une simple règle de trois... )
si le signal est rapide, il faut faire tout le calcul en analogique (changer des valeurs de résistances...) et éventuellement, corriger le signe ....


hbachetti

Un signal continu qui varie entre -10V et +10V peut être shifté avec un AOP alimenté en +/-12V ou +/- 15V.
Par exemple :
- un pont diviseur 1/4 (220K / 47K par example) qui abaisserait le niveau de tension à -2.5V / +2.5V
- un AOP suiveur non inverseur pour abaisser l'impédance
- un AOP additionneur non inverseur qui ferait l'addition du signal d'entrée et d'une tension fixe de +2.5V

Avec une tension d'entrée de -10V on obtient :
-10V / 4 = -2.5V après le pont diviseur
-2.5V + 2.5V = 0V après addition

Avec une tension d'entrée de +10V on obtient :
+10V / 4 = +2.5V après le pont diviseur
+2.5V + 2.5V = 5V après addition

Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

ArnaudF

Il va falloir un peu d'électronique supplémentaire.
S'agit-il d'un signal continu ou alternatif ?
D'où sort-il ?
Quelle impédance ?

Il s'agit d'un courant continu provenant d'un capteur velocimetre laser. Le signal m'informe par le fait que lorsqu'il est positif alors le systeme avance et lorsque c'est négatif le système recule.Le fait que le signal s'etend sur une plage de 20v est du au fait que cela donne une information sur la vitesse de deplacement mais ici cà ne m'interesse pas.
Afin de pouvoir connecter cet instrument à une unité de navigation, il faut que le signal soit conforme. Ici le signal doit être sur une plage de 0 à 50 v, avec de 0 à 3v (LOW) la phase d'avance et de 3 à 50 (HIGH) le moment ou le systeme recul. C'est pour cela que j'ai crée la formule précédente "SignalOUT=((-SignalIN + 10)*(3/10))"

Je ne suis pas du tout electronicien, ce n'est pas du tout mon coeur de métier, donc je vais essayer de vous repondre du mieux que je peux...
Concernant les caractéristiques du signal d'entrée je sais juste qu'il est sur la plage -10v_10v (la frequence de mesure du capteur est de 500Hz mais je ne sais pas si c'est lié au courant de sortie) et que la sortie doit être sur la plage 0v_50v avec une plage de 5 à 10mA et une frequence maximale ne pas depasser de 100 kHz


ArnaudF

Un signal continu qui varie entre -10V et +10V peut être shifté avec un AOP alimenté en +/-12V ou +/- 15V.
Par exemple :
- un pont diviseur 1/4 (220K / 47K par example) qui abaisserait le niveau de tension à -2.5V / +2.5V
- un AOP suiveur non inverseur pour abaisser l'impédance
- un AOP additionneur non inverseur qui ferait l'addition du signal d'entrée et d'une tension fixe de +2.5V

Je ne connais vraiment pas grand chose en electronique, ce que vous me decrivez plus au necessite un matériel particulier ou il s'agit juste de composants electroniques classiques ?

dbrion06

Ce sont des composants électroniques très classiques (et souvent, on a 2 ou 4 amplificateurs operationnels dans le même boîtier)

fdufnews

#7
Apr 10, 2019, 03:58 pm Last Edit: Apr 10, 2019, 04:04 pm by fdufnews
De cette manière j'ai un signal qui va être transformé d'une plage de -10v_10v à un signal 0v_6v.
On peut aussi le faire avec 3 résistances

Le niveau en sortie de ce montage est relativement dépendant de l'impédance de la charge. On peut éventuellement ajouter un ampli op en suiveur pour isoler de la charge.

Par contre, il faudrait clarifier quelque chose.
Au début tu parlais d'une sortie 5V et maintenant tu parles d'une sortie 50V.

hbachetti

Quote
On peut aussi le faire avec 3 résistances
Cela peut se tenter, effectivement, en prenant en compte le fait que le générateur a une impédance de sortie de 40KΩ.
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

ArnaudF

Ce sont des composants électroniques très classiques (et souvent, on a 2 ou 4 amplificateurs operationnels dans le même boîtier)
Merci pour vos reponses :)

Mettons que j'utilise la serie de composants que vous avez cité et que j'obtient un signal qui se situe sur une plage 0_5V.
Je souhaiterai alors faire en sorte qu'en sortie je recupère une tension de 5V si celle d'entrée est comprise entre 0 et 2.5v et une tension de 0V si celle d'entrée est comprise entre 2.5v et 5v.
Cependant si j'ai bien compris, lorsque je vais devoir faire le code je dois utiliser des valeurs comprises entre 0 et 1023 ce qui ne correspond pas directement à la lecture du voltage.
Si je ne me suis pas trompé ça me donnerai quelquechose comme ça:

Code: [Select]

int sensorvalue = 0;
  
void setup()
{
  pinMode(13, OUTPUT);
  pinMode(A0, INPUT);
}

void loop()
{
  sensorvalue=analogRead(A0);
  if (sensorvalue < 511)
  digitalWrite(11,HIGH);
  else digitalWrite(11,LOW);
  delay(10);
}


Ce qui me gène ici est le fait que je n'utilise pas directement la valeur du voltage. Je ne trouve pas cela très precis or c'est ce que j'ai besoin. En effet 2.5v correspond si je ne me trompe pas à la valeur de 511.5 sur l'echelle 0>1023.
Y a t'il un moyen d'utiliser directement la valeur de voltage ? ou est ce qu'il est possible de mettre dans le if des notion de decimales tel 511.5 ou 2.5?

ArnaudF

Par contre, il faudrait clarifier quelque chose.
Au début tu parlais d'une sortie 5V et maintenant tu parles d'une sortie 50V.
En fait le 50V dont je parle est celle de l'instrument que je veux brancher en sortie de mon Arduino. Cependant il n'est pas necessaire d'atteindre cette tension. En fait de 0à3v l'appareil interprete cela comme une marche avant et de 3 à 5v il l'interprete comme une marche arrière. Du coup si je fournie une tension de 0à5v avec l'arduino c'est suffisant car sur cette plage je peux dire si j'avance ou je recule. Si je sort du 0V j'avance car compris entre 0et3v et si je donne du 5v je recule car compris entre 3et5v.

fdufnews

Cela peut se tenter, effectivement, en prenant en compte le fait que le générateur a une impédance de sortie de 40KΩ.
Ça, ce n'est pas une donnée d'entrée. C'est une supposition de dbrion06

fdufnews

#12
Apr 10, 2019, 04:31 pm Last Edit: Apr 10, 2019, 04:33 pm by fdufnews
Ce qui me gène ici est le fait que je n'utilise pas directement la valeur du voltage. Je ne trouve pas cela très precis
Il y a une relation connue entre la tension et la valeur numérique retournée par analogRead().
code = Vanalog*(Vref/1023)

La précision ne dépend que de la référence de tension de l'ADC et des performances dudit ADC.
La référence de l'ADC, dans la configuration par défaut d'un Arduino, c'est la tension d'alimentation de la carte. Et effectivement suivant comment la carte est alimentée cette tension peut varier.
Et les performances de l'ADC elles sont garanties par le fabricant et tu les trouves dans la documentation de l'ATmega328 si tu as une carte Arduino Uno par exemple.

Si tu veux entrer la tension comme paramètre dans ton programme, soit comme valeur fixe dans le code soit au travers d'une console dans un mode interactif, tu peux très bien le faire et réaliser ensuite la conversion dans le programme.

ArnaudF

Il y a une relation connue entre la tension et la valeur numérique retournée par analogRead().
code = Vanalog*(Vref/1023)
Pratique :) ça revient a faire un calcul que j'avais fais a la main mais diretement intégré au code. C'est plus intuitif avec votre code merci

Et effectivement suivant comment la carte est alimentée cette tension peut varier.
Et les performances de l'ADC elles sont garanties par le fabricant et tu les trouves dans la documentation de l'ATmega328 si tu as une carte Arduino Uno par exemple.
Je compte alimenter l'arduino avec une pile retangle 9v, le système étant embarqué au sein d'un vehicule cela me semblais plus pratique. Cependant si la stabilité de l'alimentation est lié avec la précision les performance du convertisseur , peut etre faut ils que j'utilise une source d'alimentation plus stable ?
Ici je recherche la precision car je il ne faut surtout pas que j'indique que j'avance à un moment où en realité je recule et inversement.
D'ailleur à ce sujet, le montage qui a été proposé avec pont diviseur et AOP est il stable et précis dans la conversion/rehaussement ? Comme je l'ai dit il faut impérativement que la conversion de la tension soit la plus parfaite possible.

Si je doit realiser ce montage, quels sont les information/caratéristique indispensable qu'il faut fournir pour parvenir à choisir les bonnes pièces ?

CelticLord

Pour conversion AD 0 1023 la fonction map est faite pour ca

Go Up