Bonjour
Ayant rappelé l'existence du bloc de compteurs PCNT (Pulse counter) dans les ESP32, il aurait été cavalier de ne pas mentionner un exemple basique d'utilisation 
Faute, à ce jour, de bibliothèque simple de style Arduino pour gérer ces compteurs hardware (autre qu'une bibliothèque ciblant les encodeurs en quadrature) voici un exemple basique utilisant le driver pcnt.h fourni par Espressif dans le SDK acompagnant tout core ESP32 pour Arduino, Doc Espressif
Fonction de l'exemple : Comptage sur GPIO15 d'implusions produites par GPIO22, carte utilisée LOLIN 32
L'état du compteur , qui tourne tout seul dans son coin, est récupéré par polling dans loop()
/* ESP32 : Exemple d'utilisation basique d'un des compteurs 16 bits PCNT
en l'absence de bibliothèque simple à ce jour, utiisation directe du driver 'pcnt.h'
fourni par Espressif dans le SDK accompagnant le core ESP32
Relier GPIO22 (sortie de paquets d'impulsions) à GPIO15 (entrée du compteur)
Non traités : interruption à chaque débordement du compteur , changement de sens de comptage à chaud....etc...
d'après https://github.com/espressif/arduino-esp32/issues/6312
et https://github.com/espressif/arduino-esp32/issues/8244
al1fch 06/2023
*/
#include "Arduino.h"
#include "driver/pcnt.h"
int16_t count = 0; ///
void setup() {
e
pcnt_config_t pcnt_config = {
.pulse_gpio_num = GPIO_NUM_15, // GPIO entrée comptage ou décomptage
.ctrl_gpio_num = PCNT_PIN_NOT_USED, // éventuel GPIO annexe
.lctrl_mode = PCNT_MODE_KEEP,
.hctrl_mode = PCNT_MODE_KEEP,
.pos_mode = PCNT_COUNT_DIS, // front montant inactif
.neg_mode = PCNT_COUNT_INC, // INC sur front descdeant , DEC pour décompter
.counter_h_lim = 32767,
.counter_l_lim = -32768,
.unit = PCNT_UNIT_0,
.channel = PCNT_CHANNEL_0,
};
pcnt_unit_config(&pcnt_config);
pcnt_set_filter_value(PCNT_UNIT_0, 100); //élimination glitches < 100ms
pcnt_filter_enable(PCNT_UNIT_0);
pcnt_event_enable(PCNT_UNIT_0, PCNT_EVT_H_LIM);
pcnt_event_enable(PCNT_UNIT_0, PCNT_EVT_THRES_0);
pcnt_counter_pause(PCNT_UNIT_0);
pcnt_counter_clear(PCNT_UNIT_0); // semble indispensable de fait pour lancer le compteur
pcnt_counter_resume(PCNT_UNIT_0);
Serial.begin(115200);
pinMode(22, OUTPUT);
}
void loop() {
for (int i = 0; i < 100; i++) {
digitalWrite(22, HIGH);
delay(1);
digitalWrite(22, LOW);
delay(1);
}
delay(1000);
pcnt_get_counter_value(PCNT_UNIT_0, &count); //
Serial.println(count); //
}
Pour info : PCNT est exploité ici dans une réaisation de fréquencemetre 40MHZ