Où sommes nous ?

Retour

Convertisseur ADC

On entend pire que pendre sur la "qualité" de l'unique convertisseur analogique (ADC) de l'ESP8266. Pour en avoir le coeur net, j'ai effectué quelques testes.

L'ADC de l'ESP8266

Un ESP8266 dispose donc d'un unique convertisseur analogique de 10 bits (valeur de 0 à 1023 donc) et permettant

Côté programmation

Le squetch de test est vraiment très simple et se trouve sur mon GitHub.

Activation de l'ADC vers la tension d'alimentation

La première chose à faire et d'indiquer que l'ADC sera utilisé pour mesurer la tension interne. Ça se fait en plaçant les lignes suivantes en dehors de toute fonction de notre code.

extern "C" {
  #include "user_interface.h"
}

ADC_MODE(ADC_VCC);

Lecture de la valeur

La tension d'alimentation se lit par la fonction ESP.getVcc(). J'imagine qu'il faut un certain temps entre chaque conversion (les docs de l'ESP sont vraiment très spartiates) ... et de toutes façons, quel serait l'intérêt d'être submergé de valeur ? Bref, avec une tempo bien venue, le reste du code devient

void setup(){
	Serial.begin(115200);
	delay(100);
}

void loop(){
	Serial.println( ESP.getVcc() );
	delay(2000);
}

Et nous obtiendrons donc sur la console une valeur toutes les 2 secondes.

Méthodologie

J'ai alimenté mon ESP avec un convertisseur DC-DC comme celui-ci, après avoir vérifié avec mon multimètre qu'il m'affichait des valeurs correctes. J'ai ensuite fait varier la tension de 2v à 3,5v (en dessous de 2v, l'ESP n'était pas stable), pris à chaque fois un minimum de 30 retours de l'ADC et fait une étude statistique avec Libre office sur la différence entre la valeur réelle et celle mesurée.

Ce qui donne donc le résultat suivant :

Vdd (mV)
2000 2170 2320 2490 2620 2790 2890 3020 3200 3280 3380 3510 3560
Moyenne -13,68 -17,97 -40,88 -40,25 -44,56 -40,60 -60,48 -56,15 -65,42 -61,51 -83,32 -75,85 -85,12
Erreur standard 0,18 0,11 1,80 2,28 0,16 0,21 0,35 0,66 1,89 0,21 0,15 2,31 1,48
Mode -13,00 -18,00 -43,00 -43,00 -44,00 -41,00 -62,00 -58,00 -67,00 -62,00 -84,00 -79,00 -89,00
Médiane -14,00 -18,00 -43,00 -43,00 -44,00 -41,00 -60,00 -57,00 -67,00 -62,00 -83,00 -79,00 -87,00
Premier quartile -14,00 -18,00 -44,00 -44,25 -45,00 -41,75 -62,00 -58,00 -68,00 -63,00 -84,00 -80,00 -88,75
Troisième quartile -13,00 -18,00 -41,00 -42,00 -44,00 -40,00 -59,00 -55,00 -66,00 -60,00 -83,00 -78,00 -85,00
Variance 1,27 0,50 106,98 207,47 1,16 1,91 5,33 17,08 117,75 2,50 1,44 208,03 74,96
Écart type 1,13 0,71 10,34 14,40 1,08 1,38 2,31 4,13 10,85 1,58 1,20 14,42 8,66
Kurtosis -0,21 2,06 31,18 17,04 1,01 1,70 -0,41 18,15 30,62 -0,40 0,22 16,31 28,63
Asymétrie -0,01 -0,04 5,51 4,24 -0,87 0,85 0,34 3,62 5,44 0,42 0,72 4,15 5,17
Plage 5,00 4,00 62,00 69,00 5,00 7,00 10,00 26,00 66,00 6,00 5,00 69,00 52,00
Minimum -16,00 -20,00 -46,00 -46,00 -48,00 -43,00 -65,00 -61,00 -72,00 -64,00 -85,00 -83,00 -90,00
Maximum -11,00 -16,00 16,00 23,00 -43,00 -36,00 -55,00 -35,00 -6,00 -58,00 -80,00 -14,00 -38,00
Nombre 41,00 39,00 33,00 40,00 43,00 42,00 44,00 39,00 33,00 57,00 62,00 39,00 34,00

Moy/Vdd (%) -0,68 -0,83 -1,76 -1,62 -1,70 -1,46 -2,09 -1,86 -2,04 -1,88 -2,47 -2,16 -2,39
Mod/Vdd(%) -0,65 -0,83 -1,85 -1,73 -1,68 -1,47 -2,15 -1,92 -2,09 -1,89 -2,49 -2,25 -2,50
Erreur moyenne (v) -0,01 -0,02 -0,04 -0,04 -0,04 -0,04 -0,06 -0,06 -0,07 -0,06 -0,08 -0,08 -0,09
Erreur max (v) -0,01 -0,02 0,02 0,02 -0,04 -0,04 -0,06 -0,04 -0,01 -0,06 -0,08 -0,01 -0,04

Ce qui donne, graphiquement.

Comme on peut le voir, il y a un écart grandissant en fonction de la tension d'entrée pouvant atteindre presque 0,1 Volt (soit 2,5%) lorsqu'on atteint la tension maximum. On peut cependant facilement déduire une droite de correction pour s'approcher de la réalité.

La plage de valeurs peut paraitre importante mais n'est dû qu'à des pics vraiment épisodiques : comme on peut le voir, le Mode, la Moyenne et les quartiles sont très fortement regroupés ... bref, ils sont facilement éliminables par une simple moyenne sur plusieurs échantillons.

Conclusion (temporaire)

2,5% ou 1/10e de volt rapporté sur 3,5 volts, est-ce vraiment important ? Après tout, beaucoup des composants n'ont pas cette précision. De toutes façons, si cela nous gène, il est relativement facile d'y appliquer une droite de compensation.

Plus gênant sont peut-être les pics ... mais on peut aussi facilement passer à travers (comme on le verra plus bas).

Donc, l'un dans l'autre ... ben les résultats ne sont pas si mauvais que cela et donne une relativement bonne idée de ce qui alimente notre ESP.

Test en situation

Prenons un cas concret, à savoir la sonde de température de la piscine alimentée par des batteries solaires : comme on peut le voir, le signal est extrêmement bruité avec les fameux 0,1 volt de battement ...

Améliorons les choses

on trouvera le code complet sur mon GitHub.

J'ai modifié mon code pour tenter de corriger la chose : je fais 3 acquisitions successives comme suit

int vcctab[3];	// Stocke les différents échantillons de Vcc
int nbre = 0;
vcctab[nbre++] = ESP.getVcc();

les 2 suivantes sont faites après la lecture des températures de chacune des 2 sondes

float temp =  SondeTempInterne.getTemperature( false );
if( SondeTempInterne.isValidScratchpad() ){	// On s'assure que la sonde est présente
	publish( MQTT_TempInterne, String( temp ).c_str() );
	vcctab[nbre++] = ESP.getVcc();
}

On trie les valeurs résultantes

for( int i = 0; i<nbre; i++ )
	for( int j = 0; j<nbre; j++ ){
		if(vcctab[i]>vcctab[j]){
			int t = vcctab[i];
		    	vcctab[i] = vcctab[j];
			vcctab[j] = t;
		}
	}

et on ne tient compte que de la valeur médiane. Ce qui donne.

SondePiscine/Message	3 échantillon(s) pour Vcc : 2887 2884 2876
SondePiscine/Vcc 2884

Le résultat est édifiant : beaucoup plus propre n'est-ce pas ?

Ce qu'il reste à faire


Visitez :
La liste de nos voyages
Nos sorties Ski et rando
Copyright Laurent Faillie 2001-2018
N'oubliez pas d'entrer le mot de passe pour voir aussi les photos perso.
Contactez moi si vous souhaitez réutiliser ces photos et pour les obtenir avec une plus grande résolution.
Visites durant les 7 derniers jours Nombre de visites au total.

Vous pouvez laissez un commentaire sur cette page.