Entrées analogiques (ADC)

L’ADC sur l’ESP32

L’ESP32 possède 2 ADC séparés : l’ADC1 avec 8 canaux et l’ADC2 avec 10 canaux, pour un total de 18 entrées analogique. Par exemple, il y a sur le pin GPIO34, le canal numéro 6 de l’ADC1 (ADC1_CH6) . Seulement en pratique, il y en a beaucoup moins de disponibles à cause du Wi-Fi.


Avertissement: L’ADC2 ne peut pas être utilisé quand le Wi-Fi est activé : Le Wi-Fi de l’ESP32 l’utilise pour fonctionner.


Correspondance pour l’ADC1

ADC1_CH0

ADC1_CH1

ADC1_CH2

ADC1_CH3

GPIO 36

GPIO 37

GPIO 38

GPIO 39

ADC1_CH4

ADC1_CH5

ADC1_CH6

ADC1_CH7

GPIO 32

GPIO 33

GPIO 34

GPIO 35


Note: En général, les broches GPIO37 et GPIO38 ne sont pas disponibles, si votre carte possède un module WROOM ou WROVER. Ces modules n’exposent pas ces broches. Seules les cartes qui utilisent directement la puce ESP32 (sans passer par un module) peuvent éventuellement les exposer.


Correspondance pour l’ADC2 (rarement utilisé)

ADC2_CH0

ADC2_CH1

ADC2_CH2

ADC2_CH3

ADC2_CH4

GPIO 4

GPIO 0

GPIO 2

GPIO 15

GPIO 13

ADC2_CH5

ADC2_CH6

ADC2_CH7

ADC2_CH8

ADC2_CH9

GPIO 12

GPIO 14

GPIO 27

GPIO 25

GPIO 26

De manière générale l’ADC de l’ESP32 n’est pas très fiable malgré ses 12 bits de résolution. 


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.

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.

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)

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 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-échantillonnage :


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


Nous allons tester l’ADC en utilisant un potentiomètre (résistance variable).

Schéma électrique pour le potentiomètre

Circuit électrique

Circuit électrique du potentiomètre sur une breadboard


Code pour lire les valeurs du potentiomètre

// 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 :

Créé avec HelpNDoc Personal Edition: Faites de la documentation un jeu d'enfant avec un outil de création d'aide