adc-12bits.ino

Arduino Nano ESP32 · Fichier : adc-12bits.ino · Langage : Arduino · Usage : Exploiter l'ADC 12 bits et son atténuation

L'ADC de l'ESP32-S3 monte à 12 bits mais est capricieux : non-linéaire en bas d'échelle, bruité, dépendant de l'atténuation. Ce croquis fixe les réglages conseillés (11 dB, horloge APB), moyenne 32 lectures et applique une calibration deux points maison.

Matériel requis

Un Arduino Nano ESP32 (ESP32-S3 double cœur, Wi-Fi 2,4 GHz + Bluetooth Low Energy, brochage physique compatible Nano, USB natif, broches 3,3 V uniquement). Nano ESP32, source analogique 0-3,3 V sur A0 ; multimètre pour calibrer.

Câblage

Signale sur A0 et GND commun ; la pleine échelle réelle est ~3,1-3,3 V selon l'atténuation, ne jamais dépasser 3,3 V.

Fonctionnement

analogSetPinAttenuation(ADC_11db) couvre 0-3,3 V ; l'horloge APB évite la dérive du ADC_80M. La moyenne numérique divise le bruit, la calibration deux points corrige le gain/offset.

Exécution

Installez le package Arduino ESP32 Boards (ou le guide Nano ESP32 officiel), sélectionnez Arduino Nano ESP32, téléversez. Les broches sont en 3,3 V : n'envoyez jamais 5 V sur une entrée. Le moniteur série utilise l'USB natif.

Variantes

Pour du précis, passez par un ADS1115 externe sur I2C, ou utilisez esp_adc_cal (API bas niveau) avec le eFuse de calibration usine.

adc-12bits.ino

// ADC de l'ESP32-S3 : 12 bits natifs, mais non lineaire en bas
// d'echelle. attenuation 11 dB = pleine echelle ~3,3 V.
const int CANAL = A0;

void setup() {
  Serial.begin(115200);
  analogReadResolution(12);          // 0..4095
  analogSetPinAttenuation(CANAL, ADC_11db);
  analogSetPixelClockSource(ADC_PIXEL_CLOCK_APB); // horloge stable
}

void loop() {
  // moyenne sur 32 lectures : l'ADC ESP32 est bruité
  uint32_t somme = 0;
  for (int i = 0; i < 32; i++) somme += analogRead(CANAL);
  float brut = somme / 32.0;

  // calibration lineaire par deux points (bricolage maison)
  const float A = 3.3 / 4095.0 * 1.02f;
  const float B = -0.02;
  float tension = brut * A + B;

  Serial.print("brut=");
  Serial.print(brut, 0);
  Serial.print(" -> ");
  Serial.print(tension, 3);
  Serial.println(" V");
  delay(500);
}

← Retour à la fiche