Transformation de signal

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

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 ?

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
Montages de base de l'amplificateur opérationnel — Wikipédia]
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 ....

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

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 ?

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

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

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 ?

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

ArnaudF:
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.

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Ω.

dbrion06:
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 :slight_smile:

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:

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?

fdufnews:
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.

hbachetti:
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

ArnaudF:
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.

fdufnews:
Il y a une relation connue entre la tension et la valeur numérique retournée par analogRead().
code = Vanalog*(Vref/1023)

Pratique :slight_smile: ç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

fdufnews:
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 ?

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

Ça, ce n'est pas une donnée d'entrée. C'est une supposition de dbrion06

Oups ...

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

La fonction maps de semble pas fonctionner pour une valeur decimale de val.
avec : map(val,0,5,0,1023);par exemple, si val=2.5 alors seule la partie entière est prise en compte dans la fonction ...

En fait, je ne comprends pas pourquoi tu tiens à utiliser un arduino pour faire une fonction qui est en fin de compte 100% analogique.

Le passage d'un domaine +/-10V à un domaine 0 +5V est une fonction qui peut-être réalisées sans arduino.

Il faut bien te dire que cette fonction qu'elle soit faite en 100% analogique ou moitié analogique, moitié numérique aura toujours une certaine imprécision du fait de la tolérance des composants utilisés.

Donc il faudrait que tu définisses précisément ton besoin. Avec des tolérances.

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

Également préciser ce que représentent ces 5 à 10mA.
Et pourquoi pas donner des liens sur les matériels utilisés, car pour l'instant on voit juste des mots : capteur, instrument, sans plus de précisions.

fdufnews:
En fait, je ne comprends pas pourquoi tu tiens à utiliser un arduino pour faire une fonction qui est en fin de compte 100% analogique.

ça c'est parce que je n'ai pas de connaissance en electronique et je me base sur un travail qui avait été réalisé par un colègue pour faire plus ou moins la même chose mais avec un capteur spécial pour Arduino ce qui fait que l'intégration était plus facile...