Lecture tension sur ESP32 incorrecte

petit schemat vite fait avec une batterie de 5V j'obtiens 3,80V

Petite particularité, si je mesure le 1er ESP avec un multimètre entre le 3v3 et GND, j'ai 2.6V :-/ avec le 2eme 3.28V ( même cable et même pc )

Si on veut espérer de trouver la solution il faut être très précis.
Peut tu nous détailler tes calculs stp.

Pour moi la tension appliquée sur l'entrée analogique de l'ESP est 0,454 V.
V = 5 V * (10k / (100k+ 10k) )

  1. est-on d'accord sur la formule ?
  2. Trouves tu ce résultat avec un multimètre ?
  3. Quel nombre renvoi le convertisseur analogique de l'ESP ?
  4. Quelle est la valeur de la référence de tension du convertisseur analogique de l'ESP ?
  5. Comment se fait la conversion nombre -> volt.

oui, voici le code avec le 3,3v de l'ESP ) la place de la batterie 5V.
J'obtiens 1.84V au lieu de 3.3v
je dois me tromper qq part, mais je ne vois pas.

// ESP32 Voltmètre test
//#include <SPI.h>

#define analogInPin 34 // ADC
float R1 = 100000.0; // Résisrance_1 100K
float R2 = 10000.0; // Résistance_2 10K
float va = 0.0;
float vout = 0.0;

void setup()
{
Serial.begin(115200);
pinMode(analogInPin, INPUT);
}

void loop()
{
uint8_t num_sample = 30;
int sum = 0;

while (0 < num_sample) // Pour faire la moyenne
{
int analogValue = analogRead(analogInPin);
sum += analogValue;
num_sample--;
delay(100); // délais entre 2 mesures
}

float ave = (float)sum/30.0; // pour avoir la Moyenne de 30 mesures
Serial.print ("Moyenne sur 30 :");
Serial.println (ave);
vout = (ave*3.3) / 4095.0; // 3.3v Maxi sur ADC
//va = vout / (R2 / (R1+R2) );
va = vout / (float) (R2/(R1+R2));
Serial.print ("Valeur d'entrée : ");
Serial.println (vout);
Serial.print ("Tension mesurée : ");
Serial.println (va);

delay(100);
}

Mesure avec le multimètre entre le GND et l'entrée ADC 34 = 0.450v pour une batterie de 5V
Avec le 3.3v j'ai 0.295v

le voltage ref sur l'esp32 n'est pas plutôt de 1.1V ?
vout = (ave*1.1) / 4095.0; // 3.3v Maxi sur ADC

La datasheet des ESP8266 et ESP32 précise que la tension sur les entrées ne doit pas dépasser 3.3V + 0.3V.

Tout à fait avant de dire que le matériel est en panne il faut connaître ses caractéristiques principales et faire le calcul préparatoire à la main.

Les ESP je n'ai vraiment pas accroché, j'ai vite oublié "les détails" comme la tension de référence mais j'avais un très vague souvenir que 1,1 V c'était pour la première version 8866 et que pour la 32 la référence était à 3,3V, mais c'est très vague et c'est pour cela que j'ai posé la question.
Mais comme d'habitude on pose plusieurs questions, qui nous paraissent utiles, et nous n'avons que des réponses incomplètes.

@michelduyn
Au moment de ma réponse je me fiche du code.
Je cherche à savoir si les bases sont saines.

Et pour moi les bases sont :

  1. mesure au voltmètre -> détection d'une possible erreur de résistance qui est toujours possible. Ce doit être un réflexe et non pas fait sur demande.
  2. bonne connaissance du fonctionnement de l'ADC de l'ESP32
    C'est à dire le nombre d'échantillons (Artouste à indiqué 2^12 soit 4095 ) et la valeur de la référence de tension du convertisseur analogique de l'ESP32.
    J'espérais avoir ces renseignements simplement sans avoir à aller les chercher dans 20 ou 50 lignes de code.

Je suis un électronicien analogicien de formation et un codeur très très amateur.
Je n'imagine pas coder sans être certain de bien connaître le matériel que je vais utiliser.

Bonsoir

La datasheet des ESP8266 et ESP32 précise que la tension sur les entrées ne doit pas dépasser 3.3V + 0.3V.

IL s'agit là de la valeur à ne pas dépasser pour éviter la destruction de la puce, pas de la tension de référence du convertisseur analogique/numérique qui vaut environ 1,1V

:warning:Dans le cas de l"ESP32 **les choses se compliquent avec la présence d'un atténuateur programmable qui peut prendre 4 valeurs (imaginer un pont diviseur programmable à l'intérieur de la puce , inséré entre la borne analogique et l'entrée effective du convertisseur)

Lire ceci : https://randomnerdtutorials.com/esp32-adc-analog-read-arduino-ide/

ou ici, à la source chez Espressif , mais pour le framework IDF, pas l'IDE Arduino pour ce qui est des fonctions
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/adc.html

Avec la valeur d'attenuation par défaut (ADC_11dB) on peut , en première approche prendre 3,3 dans sa formule de conversion (tension de référence d'environ 3,3V en apparence, 1,1V en interne dans l'ADC) mais on a tout intérêt à faire quelques mesures avec des valeurs de tensions connues pour donner à ce coefficient une valeur plus proche de la réalité

Outre la tension de référence erronée, il y a une autre erreur je pense.
vout c'est la tension à l'entrée de l'ESP.
si va c'est la tension de la batterie alors la formule correcte est

va = vout / (float) ((R1+R2)/R2);
Il faut en effet appliquer l'inverse de l'atténuation apportée par le pont de résistances pour retrouver la tension à l'entrée.

Bonjour à tous,
Bon j'ai refait les mesures pour être certain.

R1 = 100k ------ R2 = 10K

Je peux donc faire une mesure jusque 36.3v et avoir un max de 3,3v à l'entrée ADC.

J'ai bien avec 3.3V de tension utilisée pour ce test , +/- 0.294v sur l'entrée ADC 34.
Normal car (3.3 x 10000 ) / ( 100000+10000 ) = 0.298v
Formule = Vout = (V x R2 ) / ( R1+r2 )

La valeur analogue sur l'adc est de 205.53 ( analogRead(34) )

Je choisis bien l'attenuation 3.3v sur le pin 34 : analogSetPinAttenuation( 34 ,ADC_11db);

Je choisis bien une résolution de 12 bits ( 4096 ) : analogSetWidth(12);

Pour moi, c'est la valeur analogue qui est mal calculée quelque part :-/
car si je fait : ADC raw digital reading result ( 205.53 ) * VMax ( 36.3) / Maximum of the output ADC raw digital reading result ( 4096) ,
j'ai effectivement 1.83v :-/

Bonjour
perso je ne travaille quasi jamais en float sur de l'acquisition AD
Si vraiment j'ai besoin de decimales , je "float" en fin de calcul/conversion

fait un debug ---> serial
aprés chaque opération de ton calcul et compare avec ce qui est attendu sur le papier

Si on se réfère aux informations trouvées ici

Il y a plusieurs problèmes.

  1. il faut éviter d'avoir un pont diviseur avec une trop forte atténuation car tu vas faire ta mesure dans le bas de la courbe là où il y a une forte non linéarité.
  2. l'atténuation de 11dB devrait donner un résultat de conversion différent.
  • ADC_11db: The input voltage of ADC will be attenuated, extending the range of measurement to up to approx. 2600 mV. (1V input = ADC reading of 1575).

Avec environ 300mV sur l'entrée tu devrais avoir un résultat de conversion entre 400 et 500 et non pas dans les 200.

Oui, effectivement, d'après mes calculs, je devrais tourner vers les 365 --- 370 par là, et pas 205. .... c'est bien pour çà que je me casse la tête depuis 1 semaine :frowning:
Déjà essayé avec d'autre valeurs résistance ( plus faible ) ... mais j'ai le même résultat.

puis ma tension d'entrée adc est bien correcte. 0.294v

Oui mais comme je l'ai dit plus haut ce n'est pas dans la meilleure partie de la courbe de l'ADC.
Comme on le voit sur le site de randomnerdtutorials le bas de la courbe montre une fonction de transfert avec une grosse non linéarité.
Il faudrait choisir un pont diviseur qui place la tension à surveiller dans le milieu de la fourchette de mesure de l'ADC. Dans cette partie de la courbe la linéarité n'est pas trop mauvaise et au pire une calibration 1 point permet de recaler les résultats.

Mouai bon, je pense que c'est peine perdue. Déjà entre les 2 ESP32 différents que j'ai, j'ai des valeurs tout a fait différentes :frowning:
Je vais finalement passer par un ADC1113 ... domage.
Avec un bête arduino, même nano, çà fonctionne très bien, j'ai encore fait le test. Je vais en reser là avec les ADC du ESP32.
Encore merci ..... et si jamais vous avez le courrage de tester.... dites moi le résultat des mesures.

Michel

avant que je sorte un esp32 , fait la manip avec le code proposé là

Bonjour Artouste,
Déjà fait. et tout est correct. Avec le pot, je passe bien de 0 à 4095.
J'ai trouvé d'autres exemples qui affiche 2V lorsque j'ai 2V à l'entrée ADC.
Toujours avec un pot de 10K. et c'est ok.
Mais avec le pont diviseur .... pas possible. Je certifie que le même code en changeant le 4096 par 1024, tout est ok avec un arduino .
Comme j'ai expliqué plus haut, avce un ESP32 j'ai une valeur lue analogue de 294 et avec un autre 185. si je change de Pin, que je teste sur le 36 à la place du 34 ... çà change encore.
C'est vraiment pas stable

comme à dit fdufnews, je suis trop bas dans la courbe, je comprends bien.
Mais j'ai pas envie d'avoir une usine a gaz avec des table de conversion etc juste pour lire une bête tension. Ce qui m'intéresse , c'est de savoir si d'autre personne on le même problème avec d'autres type ESP32. J'ai vu des video ou il n'y a aucun problème, çà fonctionne directement sans se casser la tête, et d'autre ou il faut faire des calibrages et avoir une table de référence etc. Je crois que certain sont calibré correctement sortie usine et d'autre pas.

Je ferai également un retour d'ici 2 à 3jours et ceci pour des puces ESP32 dans des modules WROOM32 ou hors d'un module.
Par contre je n'ai aucune carte identique aux tiennes, @michelduyn

bonjour al1fch,
ok pas de problème. mais si déjà si qqun peu faire un test .... et me dire quoi et quelle marque ... c'est sympa.

des exemples qui fonctionnent ici : Tech Note 115 - Using the ESP32 ADC for wide range DC voltage measurements - YouTube

ou ici : Tech Note 115 - Using the ESP32 ADC for wide range DC voltage measurements - YouTube