Mesurer des tensions analogiques avec l’ADC de l’ESP32
(Mis à jour le 22/08/2022)
L’ADC (Analog to Digital Converter) ou CAN (Convertisseur Analogique à Numérique) permet comme son nom l’indique de convertir une tension analogique en une valeur binaire.
Il y a 2 ADC de 12 bits sur l’ESP32, l’ADC1 avec 8 canaux et l’ADC2 avec 10 canaux. Chaque canal de l’ADC permet de faire une mesure sur un pin.

Limitation de l’ADC sur l’ESP32
L’ADC n’est pas un point fort de l’ESP32 car il possède de nombreux défauts. Préférez celui de l’Arduino ou utiliser un ADC externe si vous voulez faire des mesures précises.
Avertissement
Même si cela semble étrange, l’ADC de l’Arduino sur 10 bits (1024 valeurs) est plus précis et plus fiable que celui de l’ESP32 sur 12 bits (4096 valeurs).
L’ADC de l’ESP32 possède plusieurs défauts :
L’ADC2 ne peut pas être utilisé avec le WiFi activé car il est utilisé en interne par le driver WiFi. Puisqu’il y a de grandes chances d’utiliser le WiFi sur un microcontrôleur prévu pour l’utiliser, il n’y a que l’ADC1 et ses 8 canaux qui peuvent être utilisés.
-
L’ADC peut mesurer uniquement une tension comprise entre 0 et 3.3V . On ne peut pas directement mesurer des tensions analogiques variant entre 0 et 5V.
-
Non-linéarité
L’ADC de l’ESP32 n’est pas très linéaire (la courbe de réponse de l’ADC n’est pas une droite linéaire), surtout aux extrémités de sa plage d’utilisation (vers 0V et 3.3V)
Concrètement, cela signifie que l’ESP32 n’est pas capable de distinguer un signal de 3.2V et 3.3V : la valeur mesurée sera la même (4095). De même, pour les petites tensions l’ESP32 ne fera pas la différence entre un signal de 0V et 0.2V.
Note
Il est possible de calibrer l’ADC pour réduire ce défaut de linéarité. Un exemple est disponible ici .
-
Le bruit électrique de l’ADC implique une légère fluctuation des mesures :
Là aussi il est possible d’essayer de « corriger » ce défaut en rajoutant un condensateur à la sortie et avec du suréchantillonage :
Utilisation
L’utilisation basique de l’ADC de l’ESP32 est la même que sur l’Arduino avec la fonction analogRead()
.
-
Pour lire la tension du pin VP (GPIO36) de l’ESP32 :
pinMode(36, INPUT); //Il faut déclarer le pin en entrée analogRead(36);
Note
Il y a aussi des fonctions plus avancées.
-
Pour changer la résolution de l’ADC :
analogReadResolution(resolution)//Résolution entre 9-12 bits
Mini-Projet
Nous allons tester l’ADC en utilisant un potentiomètre (résistance variable).
Schéma électrique pour le potentiomètre


Code pour lire les valeurs du potentiomètre
Solution
// Le potentiomètre est connecté au GPIO 36 (Pin VP)
const int potPin = 36;
// Valeur du potentiomètre
int potValue = 0;
void setup() {
Serial.begin(115200);
delay(1000);
pinMode(potPin,INPUT_PULLUP);
}
void loop() {
// Mesure la valeur du potentiomètre
potValue = analogRead(potPin);
Serial.println(potValue);
delay(250);
}
Résultats obtenus
Lorsqu’on tourne le potentiomètre, on obtient :
