Vous êtes sur la page 1sur 6

ÉCOLE SUPERIEURE D’INGENIERIE AUTOMOBILE ET AERONAUTIQUE

FILIERES MECATRONIQUES
2ème Année Cycle Ingenieur

P O L Y C O P I E D E C O U R S

ELEMENT DE MODULE
PROGRAMMATION C POUR SYSTEMES EMBARQUES

CHAPITRE N°2 :
Application au SoC ESP32
"CPU Xtensa® dual-core 32-bit LX6"

CONTENU :

 DESCRIPTION GENERALE
 MISE EN ŒUVRE DES ENTREES/SORTIES DIGITALES
 MISE EN ŒUVRE DES ENTREES ANALOGIQUES
 MISE EN ŒUVRE DES SORTIES PWM POUR LA COMMANDE PROPORTIONNELLE

Ahmed Hanafi
Ahmedhanafi72@gmail.com

Année Universitaire

2023 - 2024
ÉCOLE SUPERIEURE D’INGENIERIE AUTOMOBILE ET AERONAUTIQUE FES

PROGRAMMATION C POUR SYSTEM ES EMBARQUES

Chapitre N°2 : Application au SoC ESP32 "CPU Xtensa® dual-core 32-bit LX6"
1. DESCRIPTION GENERALE
L'ESP32 est un système sur puce (SoC : System On Chip) combiné Wi-Fi 2,4 GHz et Bluetooth conçue par la société Espressif avec la
technologie à faible consommation TSMC 40 nm. Il est conçu pour obtenir la meilleure puissance et performance RF, faisant preuve de
robustesse, de polyvalence et fiabilité dans une grande variété d’applications et avec plusieurs scénarios de gestion d'alimentation. Il
se décline en plusieurs versions résumées par la nomenclature de la Figure N°1 :

Figure N°1 : Nomenclature de la série ESP32


La puce qui équipe le module "DOIT ESP32 DevKit" des travaux pratique est le SoC ESP32-D0WD-V3 caractérisé par :

Figure N°2 : Brochage SoC ESP32-D0WD-V3 (Package QFN 5*5)


 CPU & Mémoire :
▪ Microprocesseur Xtensa® dual-core 32-bit LX6 240 MHz
▪ ROM 448 KB
▪ SRAM 520 KB
▪ SRAM 16 KB in RTC
▪ QSPI flash 4/8/16MB
 Horloges & Timers
▪ 2 groupes de timers avec 2 Timers 64-bit et 1 watchdog dans chaque groupe
▪ Oscillateurs internes avec calibration : 8 MHz et RC
▪ Oscillateurs externes : 40 MHz pour les fonctionnalités Wi-Fi/Bluetooth et 32 kHz pour l'horloge temps réel (RTC)

HANAFI AHMED 1
ÉCOLE SUPERIEURE D’INGENIERIE AUTOMOBILE ET AERONAUTIQUE FES

PROGRAMMATION C POUR SYSTEM ES EMBARQUES

Chapitre N°2 : Application au SoC ESP32 "CPU Xtensa® dual-core 32-bit LX6"
 Interfaces périphériques intégrées :
▪ 34 entrées sorties programmables (GPIO0 - GPIO33)
▪ 16 sorties Modulation de largeur d’impulsion (PWM)
▪ 18 canaux d'entrées analogiques ADC 12-bits
▪ 2 sorties DAC 8-bits
▪ 10 entrées Détecteur tactile capacitif (Touch Sensors)
▪ Ultra-Low-Power (ULP) coprocessors
▪ Interfaces de communication :
• 4 × SPI - 2 × I2S - 2 × I2C - 3 × UART - TWAI® compatible with ISO 11898-1 (CAN Spécification 2.0)
• Ethernet MAC interface with dedicated DMA and IEEE 1588 support
 Connectivité sans fil :
▪ WiFi : débit de données de 150,0 Mbps avec HT40
▪ Bluetooth : BLE (Bluetooth Low Energy) et Bluetooth classique
 Power Management
▪ Contrôle fin de la résolution de la consommation en grâce à une sélection fréquences d'horloges, rapport cyclique, Mode
opérationnel WiFi et Contrôle individuel de la puissance des composants internes
▪ Cinq modes de puissance conçus pour des scénarios typiques :
• Active mode : La puce radio est allumée et elle peut recevoir, écouter et transmettre.
• Modem-sleep mode : le CPU ON et horloge interne est configurable. WiFi, Bluetooth et radio sont désactivés.
• Light-sleep mode : le CPU en pause. La mémoire et les périphériques liés au RTC et le coprocesseur Ultra Low
Power (ULP) tournent encore. Les événements causant des interruptions pourront réveiller l’ESP32.
• Deep-sleep mode : Sont activés que la mémoire du RTC et ses périphériques ainsi que le coprocesseur ULP. Les
données WiFi et Bluetooth sont stockées dans la mémoire RTC.
• Hibernation mode : L’oscillateur interne de 8 MHz et le coprocesseur ULP sont désactivés. Seulement un Timer du
RTC et quelques GPIO’s tournent. Ces derniers peuvent faire sortir l’ESP32 de son endormissement.
La diagramme bloc de la Figure N°3 résume toutes les fonctionnalités du SoC ESP32 :

Figure N°3 : Fonctionnalités du SoC ESP32-D0WD-V3

2. MISE EN ŒUVRE DES ENTREES/SORTIES DIGITALES (GPIO0 - GPIO33) :


L’ESP-IDF (ESP Iot Development Framework) est le framework officiel du fabricant Espressif, et donc certainement le plus complet
pour supporter toutes les fonctionnalités d’un ESP32. Il fournit une bibliothèque "driver/gpio.h" avec toutes les fonctions utiles pour
contrôler les broches d’entrée et de sortie numériques de l’ESP32. Pour l'inclure dans votre projet, on utilise la directive :
#include "driver/gpio.h"
Les principales fonctions de cette bibliothèque sont les suivantes :

gpio_set_direction(gpio_num, mode)
• Configurer la direction GPIO
• Paramètres :
▪ gpio_num – le numéro pin GPIO. Si on veut définir la direction de GPIO16, on met : GPIO_NUM_16 (ou 16)
▪ mode – GPIO direction (GPIO_MODE_OUTPUT ou GPIO_MODE_OUTPUT)

HANAFI AHMED 2
ÉCOLE SUPERIEURE D’INGENIERIE AUTOMOBILE ET AERONAUTIQUE FES

PROGRAMMATION C POUR SYSTEM ES EMBARQUES

Chapitre N°2 : Application au SoC ESP32 "CPU Xtensa® dual-core 32-bit LX6"

gpio_set_pull_mode(gpio_num, pull_mode)
• Configurez les résistances pull-up/pull-down d'une entrée GPIO (sauf pour les GPIO 34-39)
• Paramètres :
▪ gpio_num – le numéro pin GPIO. Si on veut définir la direction de GPIO16, on met : GPIO_NUM_16 (ou 16)
▪ pull_mode – GPIO pull up/down mode (GPIO_PULLDOWN_ONLY ou GPIO_PULLUP_ONLY)

gpio_set_level(gpio_num, level)
• Définir le niveau logique d'un sortie GPIO.
• Paramètres :
▪ gpio_num – le numéro pin GPIO. Si on veut définir la direction de GPIO16, on met : GPIO_NUM_16 (ou 16)
▪ level – Niveau logique à la sortie : 0 (low) ou 1 (high)

int Valeur = gpio_get_level(gpio_num)


• Récupérer le niveau logique d'une entrée GPIO.
• Paramètres :
▪ gpio_num – le numéro pin GPIO. Si on veut définir la direction de GPIO16, on met : GPIO_NUM_16 (ou 16)
• Returns
▪ Valeur = 0 si le niveau d’entrée GPIO est 0
▪ Valeur = 1 si le niveau d’entrée GPIO est de 1

3. MISE EN ŒUVRE DES ENTREES ANALOGIQUES :


L'ESP32 intègre deux ADC 12 bits SAR (Successive Approximation Register), prenant en charge un total de 18 canaux de mesure
(broches compatibles analogiques) pouvant lire chacune des tensions analogiques comprise entre 0 et 3,3V :
▪ ADC1 : 8 canaux GPIO32 - GPIO39
▪ ADC2 : 10 canaux GPIO0, GPIO2, GPIO4, GPIO12 - GPIO15, GOIO25 - GPIO27
Vref (typiquement 1,1V) est la tension de référence utilisée en interne par les ADC ESP32 pour mesurer la tension d’entrée qui doit
être comprise entre 0 V à Vref. Afin de convertir des tensions supérieures à Vref, les tensions d’entrée peuvent être atténuées avant
d’attaquer les ADC avec 4 options d’atténuation disponibles, plus l’atténuation est élevée, plus tension d’entrée mesurable est élevée :
Atténuation Atténuation Paramètre Plage de tension d’entrée mesurable
0 dB ADC_ATTEN_DB_0 100 mV ~ 950 mV
2,5 dB ADC_ATTEN_DB_2_5 100 mV ~ 1250 mV
6 dB ADC_ATTEN_DB_6 150 mV ~ 1750 mV
11 dB ADC_ATTEN_DB_11 150 mV ~ 2450 mV

ESP-IDF fournit la bibliothèque "driver/adc.h" pour le pilotage des ADC et la bibliothèque "esp_adc_cal.h" pour l'étalonnage et la
récupération de la tension analogique. Pour l'inclure dans votre projet, on utilise la directive :
#include "driver/adc.h"
#include "esp_adc_cal.h"
Les principales fonctions de la bibliothèque "driver/adc.h" sont les suivantes :

adc1_config_channel_atten(channel, atten)
• Définir l’atténuation d’un canal donné sur ADC1. Pour un canal donné, cette fonction doit être appelée avant la première lecture
sur ce canal. Cette fonction peut être appelée plusieurs fois pour configurer plusieurs canaux ADC simultanément.
• Paramètres :
▪ channel : Canal ADC1 à configurer (ADC1_CHANNEL_6 par exemple)
▪ atten : Niveau d’atténuation (voir tableau ci-haut)

adc1_config_width(width_bit)
• Configurer la résolution de capture pour tous les canaux de l’ADC1, tout en activant l’inversion de sortie pour l’ADC1.
• Paramètres :
▪ width_bit : Résolution en bits pour ADC1 9, 10, 11 ou 12 bits (par défaut) (ADC_WIDTH_BIT_9 - ADC_WIDTH_BIT_10
-ADC_WIDTH_BIT_11 - ADC_WIDTH_BIT_12)

HANAFI AHMED 3
ÉCOLE SUPERIEURE D’INGENIERIE AUTOMOBILE ET AERONAUTIQUE FES

PROGRAMMATION C POUR SYSTEM ES EMBARQUES

Chapitre N°2 : Application au SoC ESP32 "CPU Xtensa® dual-core 32-bit LX6"

int adc1_get_raw(channel)
• Prenez une lecture ADC1 à partir d’un seul canal. Pour un canal donné, on doit appeler en premier la fonction
adc1_config_channel_atten(channel). La configuration d’un nouveau canal n’empêche pas la lecture d’un canal
précédemment configuré.
• Return
▪ -1 : Erreur de paramètre
▪ N : valeur numérique correspondante au canal ADC1.
Pour l'étape d'étalonnage des ADC en utilisant la bibliothèque "esp_adc_cal.h", elle est importante vu que les puces ESP32 varient en
termes de tensions de référence internes Vref. Pour l’étalonnage de l’ADC, nous suivons deux étapes :
▪ 1ère étape : Création d'une une instance de type esp_adc_cal_characteristics_t qui contiendera les valeurs utilisées pour
l'étallonnage ;
▪ 2ème étape : Appel de la fonction esp_adc_cal_characterize() pour mettre à jour cette instance avec 4 arguments.
Dans la ligne de code suivante, nous étalonnons l’ADC1 avec une atténuation 11 dB et une résolution 12 bits par défaut :
esp_adc_cal_characteristics_t adc1_chars;

esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_DEFAULT, 0, &adc1_chars);


Enfin, pour convertir la valeur numérique fournit par l'ADC en une lecture de tension en millivolts, nous utilisons la fonction
esp_adc_cal_raw_to_voltage() qui utilise 2 arguements :
▪ 1ère argument : valeur numérique de l’ADC obtenue à partir de la fonction : adc1_get_raw() pour ADC1 et adc2_get_raw
pour ADC2.
▪ 2ème argument : le pointeur vers l'instance qui a été initialisée avec les paramètre d'étalonnage via la fonction
esp_adc_cal_characterize() que nous avons utilisé pour calibrer l'ADC.
Dans la ligne de code suivante, nous obtenons la lecture de la tension (mV) du canal 0 de l’ADC1 :
uint32_t V = esp_adc_cal_raw_to_voltage(adc1_get_raw(ADC1_CHANNEL_0), &adc1_chars);

4. MISE EN ŒUVRE DES SORTIES PWM :

HANAFI AHMED 4
ÉCOLE SUPERIEURE D’INGENIERIE AUTOMOBILE ET AERONAUTIQUE FES

PROGRAMMATION C POUR SYSTEM ES EMBARQUES

Chapitre N°2 : Application au SoC ESP32 "CPU Xtensa® dual-core 32-bit LX6"
TRAVAIL N°1 : Procédures élémentaires des entrées/sorties digitales
On désire réaliser le montage ci-dessous avec le cahier des charges suivants :
▪ Un bouton poussoir connecté au GPIO4 avec l'activation de la résistance pull-up ;
▪ Une LED (D1) connectée au GPIO16 et une LED (D2) connectée au GPIO17 avec leur résistance de protection ;
▪ Lorsque le bouton est relâché, la LED D1 est allumée, la LED D2 est éteinte ;
▪ Lorsque le bouton est appuyé, la LED D1 est éteinte, la LED D2 est allumée.

R = 220W

5V D16
D17

ESP32 DevKit
D1 D2
D4
BP1

R
Gnd Gnd

TRAVAIL N°2 : Procédures élémentaires des entrées analogiques


On désire utiliser l'entrée analogique ADC1_0 pour acquérir la luminosité ambiante à l'aide d'un capteur LDR et commander une LED
connectée à la broche G22 :
▪ En cas d'obscurité, la LED L s'allume ;
▪ En cas d'éclairement, la LED L s'éteint.

TRAVAIL N°3 : Mise en œuvre des sorties PWM


On désire utiliser l'entrée analogique ADC1_0 pour acquérir la luminosité ambiante à l'aide d'un capteur LDR et commander une LED
connectée à la broche G22 :
▪ En cas d'obscurité, la LED L s'allume ;
▪ En cas d'éclairement, la LED L s'éteint.

HANAFI AHMED 5

Vous aimerez peut-être aussi