adc-12bits.ino

Arduino Nano ESP32 · Archivo : adc-12bits.ino · Lenguaje : Arduino · Uso : Exploiter l'ADC 12 bits et son atténuation

El ADC del ESP32-S3 llega a 12 bits pero es caprichoso: no lineal abajo, ruidoso, dependiente de la atenuación. Este sketch fija los ajustes recomendados (11 dB, reloj APB), promedia 32 lecturas y aplica una calibración propia de dos puntos.

Hardware

Un Arduino Nano ESP32 (ESP32-S3 de doble núcleo, Wi-Fi 2,4 GHz + Bluetooth Low Energy, formato físico compatible con el Nano, USB nativo, pines de 3,3 V únicamente). Nano ESP32, fuente analógica 0-3,3 V en A0; multímetro para calibrar.

Cableado

Señal en A0 y GND común; la escala llena real es ~3,1-3,3 V según atenuación, nunca pases de 3,3 V.

Funcionamiento

analogSetPinAttenuation(ADC_11db) cubre 0-3,3 V; el reloj APB evita la deriva del ADC_80M. La media digital divide el ruido, la calibración de dos puntos corrige ganancia/offset.

Ejecución

Instala el paquete Arduino ESP32 Boards (o sigue la guía oficial del Nano ESP32), selecciona Arduino Nano ESP32 y carga. Los pines son de 3,3 V: nunca envíes 5 V a una entrada. El monitor serie usa el USB nativo.

Variantes

Para precisión, pasa a un ADS1115 externo por I2C, o usa esp_adc_cal (API bajo nivel) con el eFuse de calibración de fábrica.

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);
}

← Volver a la ficha