adc_oneshot.c

ESP32-H2 · Fichier : adc_oneshot.c · Langage : C · Usage : Lire un capteur analogique avec l'ADC oneshot

L'ADC du H2 passe par le nouveau pilote esp_adc : on configure unité, canal, atténuation et largeur, puis adc_oneshot_read renvoie le brut. La conversion en millivolts par table de calibration remplace la règle de trois approximative.

Matériel requis

Une carte ESP32-H2 (RISC-V 96 MHz, radio IEEE 802.15.4 uniquement — pas de Wi-Fi) type DevKitM-1, alimentée par USB. 1 potentiomètre 10 kΩ (ou capteur analogique type MPX5700, sortie < 3,3 V).

Branchement

Curseur du potentiomètre sur ADC3 (GPIO4), les deux autres pattes sur 3,3 V et GND. Jamais plus de 3,3 V sur une broche ADC.

Fonctionnement

adc_oneshot_new_unit ouvre l'unité, config_channel fixe 12 bits + atténuation 12 dB (pleine échelle ≈ 3,3 V), read renvoie l'échantillon. La double lecture élimine la traîne du multiplexeur. Programmez avec ESP-IDF (idf.py set-target esp32h2) ; le port USB-Serial/JTAG (GPIO26/27) sert de console et de port de flash. Maintenez Boot + Reset pour le mode download si besoin.

Pour aller plus loin

Moyennez 16 échantillons pour stabiliser, ou déclenchez la lecture par le contrôleur LP timer entre deux sommeils.

adc_oneshot.c

// adc_oneshot.c — lecture 12 bits + conversion en millivolts.
#include "driver/adc.h"
#include "esp_adc/adc_oneshot.h"
#include "esp_log.h"

static const char *TAG = "adc";

void app_main(void)
{
    const adc_oneshot_unit_init_cfg_t ucfg = { .unit_id = ADC_UNIT_1 };
    adc_oneshot_unit_handle_t adc;
    ESP_ERROR_CHECK(adc_oneshot_new_unit(&ucfg, &adc));

    adc_oneshot_chan_cfg_t chan = {
        .bitwidth = ADC_BITWIDTH_12, .atten = ADC_ATTEN_DB_12,
    };
    ESP_ERROR_CHECK(adc_oneshot_config_channel(adc, ADC_CHANNEL_3, &chan));

    int mv = 0, raw = 0;
    while (1) {
        ESP_ERROR_CHECK(adc_oneshot_read(adc, ADC_CHANNEL_3, &raw));
        adc_oneshot_read(adc, ADC_CHANNEL_3, &raw);   // 2e lecture : plus stable
        // Conversion brute -> mV par la table de calibration du SDK :
        mv = raw * 3300 / 4095;
        ESP_LOGI(TAG, "raw=%d soit ~%d mV (potentiometre ?)", raw, mv);
        vTaskDelay(pdMS_TO_TICKS(500));
    }
}

← Retour à la fiche