Courbe U (I) d'une résistance

Bonjour,
Je débute sur Arduino et je souhaite mesurer U et I pour une résistance pour différentes valeurs de U (0 à 5 V). Avant de faire une boucle, je n'arrive déjà pas à modifier manuellement la valeur de U avec la ligne analogWrite (3, x), x étant la valeur que je change entre 0 et 255. Lorsque je téléverse le programme suivant j'ai parfois un courant I et pas de tension U, ou l'inverse, ou les 2 valeurs à 0.
Merci d'avance pour votre aide.

schéma

...
// Tension réglable
int U_NUM ;
float U ;
int I_NUM ;
float I ;
void setup()
{
pinMode(3, OUTPUT);
pinMode(A0, INPUT) ;
pinMode(A1, INPUT) ;
Serial.begin(9600) ;
Serial.print("U(V)"); // Nom de la colonne 1 dans le moniteur série
Serial.print('\t'); // Tabulation
Serial.println("I(mA)"); // Nom de la colonne 2 dans le moniteur série
}

void loop()
{
analogWrite(3, 127);
U_NUM = analogRead(A0);
U = U_NUM * 5 / 1023.0;
I_NUM = analogRead(A1);
I = I_NUM * 5 / 10.23; // conversion I en mA
Serial.print(U);
Serial.print('\t');
Serial.println(I);
delay (1000);
}

Bonjour,

Contrairement à son nom, analogWrite() ne produit pas du dourant continu, mais un signal PWM ce qui explique que quelques fois tu lis 5V et quelques fois 0V.

bonjour et bienvenue,

Merci de prendre quelques minutes pour lire les bonnes pratiques du forum francophone et les appliquer.

En particulier, la mise en forme du code avec les balises code

Je pensais que l'on avait la tension moyenne réglable de 0 à 5 V.
Y-a-t-il une solution pour avoir une tension continu réglable ?

La bonne solution est d’utiliser un DAC comme le MCP4725

Un palliatif est de filtrer la sortie PWM avec une résistance et un condensateur. Mais si on veut une sortie basse impédance il faut un ampli opérationnel. Ça introduit aussi un retard sur la sortie.

Il existe aussi des microprocesseurs qui ont une sortie analogique.

Comme l'a demandé @fdufnews édite ton premier message et mets ton code entre balises de code.

+1, bon DAC.

La relation est linéaire, sauf si la résistance chauffe.

Ça sent le TP de physique de collège...

Il faut faire la différence entre la théorie et la pratique.
Ce que tu dis est vrai seulement si on fait une integrale de la tension sur une période de PWM.

Mathématiquement c’est simple.

Si tu veux passer à la pratique il te faut un circuit qui remplace l’intégrale.
Il existe une solution (filtre intégrateur RC) qui ne nécessite qu’une résistance câblée en série et un condensateur cablé en derivation entre la sortie de la resitance et la masse.

La PWM a une frequence réglable, par défaut avec l’initialisation à la mode Arduino cette frequence est très basse ce qui n’aide pas le fonctionnement du circuit RC, il faut des valeurs élevées de composants.
Il existe des bibliothèques qui permettent de changer cette frequence si tu ne trouves pas de condensateur de valeur suffisament élevée.

Il faut un contrôle à l’oscillo, attention un voltmètre numérique est équipé d’un intégrateur pour filtrer le bruit.

Naïvement, je voyais cette sortie PWM comme l'équivalent de la tension délivrée par un hacheur.
Ce qui est étrange c'est qu'on peut avec cette sortie augmenter progressivement l'éclairement d'une LED en faisant varier la valeur de analogWrite de 0 à 255. Par contre, les entrées analogiques A0, A1 mesurent une tension instantanée donc lorsqu'on mesure la tension PWM, on tombe sur 5 V ou 0V comme l'a dit kamill. Au final, cela serait l'entrée analogique qui poserait un problème pour mesurer une tension. Une entrée digitale ne fonctionnerait pas non plus ?

Ce n'est pas étrange, la del (led) s'allume bien au rythme de la PWM.

Tu as juste oublié un "détail" : la persistance rétinienne .
C'est ton œil qui fait l'intégrateur.

Nous sommes d'accord le terme analogWrite est le pire choix qui pouvait être fait.

Pour ceux qui l'ignore arduino est une copie de Wiring.
analogWrite est donc un choix de Wiring.

Néanmoins dans sa version 1.0 Wiring avait pris la décision de remplacer analogWrite() par pwmWrite().
Arduino n'a pas suivi, préférant continuer a semer la confusion.

Totalement faux.
L'entrée analogique fait parfaitement son travail, c'est toi qui ne comprend pas comment elle fonctionne.

Encore moins !
Tu ne comprends pas davantage comment fonctionne une entrée numérique.
Une entrée numérique obéis à de l'électronique logique.
Il y a deux seuils: bas et haut.

  • Si la tension à l'entrée est inférieure au seuil bas on décrète que c'est un niveau bas, un"zéro logique".
  • Si la tension est supérieure au seuil haut, on décrete que c'est un niveau "un logique".
  • Si la tension est entre les deux seuils on ne peut rien dire, ce cas est interdit.

Réfléchis un peu, selon l'instant où se fait la comparaison, instant que tu ne maitrises pas, un digitalRead() renvera soit un 1 soit un 0.

Un réseau R2R permet de transformer le courant numérique en courant analogique.

Voir

C'est la base des DACs.
Bon exercice pour comprendre le principe.

Le Bémol si on veut le faire à la main, c'est qu'il faut une sortie par bit.

Un DAC R/2R 8 bits c'est 8 sorties.
Soit une carte Mega, soit une nano + registre à décalage ou expenseur I2C
Cela sent l'usine à gaz.

Un DAC I2C serait plus simple et probablement moins couteux.
Les premières ESP32 avaient un DAC, je ne sais pas ce qu'il vaut, les nouvelles ESP ont-elles toujours un DAC, je ne sais pas davantage.

Une fréquence de récurrence de la MLI bien choisie (pas le réglage de base arduino) et un filtre RC font aussi l'affaire : une résistance, un condensateur.

Bonjour

Double DAC 8 bits présent dans les ESP32 et ESP32-S2,
https://espressif-docs.readthedocs-hosted.com/projects/arduino-esp32/en/latest/api/dac.html
comportement ? https://www.esp32.com/viewtopic.php?t=5098

absent dans les ESP32-C3 et ESP32-S3

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.