Mesurer des tensions analogiques avec l’ADC de l’ESP32

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.

../../_images/full_pinout_Wroom_rev2.png

Pinout de la carte uPesy ESP32 Wroom Devkit

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.

Note

On peut utiliser un pont diviseur de tension pour ramener une tension comprise entre 0 et 5V à une tension comprise entre 0 et 3.3V.

../../_images/ADC3.fr.png

Pont diviseur de tension pour passer d’une tension comprise entre 0-5V à 0-3.3V

  • 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)

    ../../_images/ADC0.png

    Non linéarité de l’ADC de l’ESP32

    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 :

    ../../_images/ADC1.png

    Bruit électrique de l’ADC de l’ESP32

    Là aussi il est possible d’essayer de « corriger » ce défaut en rajoutant un condensateur à la sortie et avec du suréchantillonage :

    ../../_images/ADC2.jpg

    Correction du bruit électrique de l’ADC de l’ESP32

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

../../_images/projet1_circuit.png

Circuit électrique

../../_images/mini_projet_1.jpg

Essayez d’écrire le programme par vous-même !

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);
}

Lorsqu’on tourne le potentiomètre, on obtient :

0
0
0
0
400
400
400
401
460
496
569
688
934
1232
1424
1461
1735
2300
2719
3007
3551
3859
3903
3903
4095
4095
4095
4095