Ignorer et passer au contenu

Livraison offerte à partir de 50€ d'achats, livrée sous 48h !

Livraison à partir de seulement 2.50€ !

Contents Menu Expand Light mode Dark mode Auto light/dark mode

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.

schéma des broches de l’ESP32 complet

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.

    Câblage pont diviseur de tension capteur adc

    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)

    Courbe de mesure CAN ESP32

    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 :

    Bruit électrique adc ESP32

    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 :

    Comparaison de corrections du bruit adc ESP32

    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 pour le potentiomètre

Schéma de câblage ESP32 adc et potentiomètre

Circuit électrique

Schéma de câblage ESP32 adc et potentiomètre

Circuit électrique du potentiomètre sur une breadboard

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 :

Câblage sur plaque de prototypage adc et potentiomètre