adc-filtre.ino

Arduino Nano Every · Archivo : adc-filtre.ino · Lenguaje : Arduino · Uso : ADC 10 bits filtré par moyenne glissante

El convertidor analógico del Nano Every sigue siendo de 10 bits pero gana referencias internas de 1,024/2,048 V, valiosas para señales pequeñas. Este filtro exponencial suaviza el potenciómetro sin búfer y solo saca si el valor se mueve de verdad.

Hardware

Un Arduino Nano Every (ATmega4809 a 20 MHz, mismo formato que el Nano, USB micro-B, chip UART separado, pines de 5 V, compatibilidad directa con el Nano clásico). Nano Every, fuente analógica 0-5 V en A0 (potenciómetro para probar).

Cableado

Señal en A0, GND común; nunca superes VCC (5 V) en un pin del 4809.

Funcionamiento

La media exponencial (alpha=0.1) pondera cada lectura: constante de tiempo ~200 ms a 50 Hz. El umbral de 2 puntos evita llenar el monitor con ruido de fondo.

Ejecución

Instala el paquete Arduino megaAVR Boards en el IDE, selecciona Arduino Nano Every y carga. El Serial USB está separado del Serial1 de hardware (pines RX/TX): el código serie clásico funciona tal cual.

Variantes

Pon analogReference(INTERNAL) para un sensor 0-1 V sin amplificador, o sube ALPHA si la reactividad prima sobre el ruido.

adc-filtre.ino

// ADC du 4809 : 10 bits comme le 328P, mais reference configurable.
// Filtre exponentiel + seuil de changement pour le moniteur serie.
const int CANAL = A0;
const float ALPHA = 0.1; // poids de la nouvelle mesure

float valeur = 0;
bool init = false;
unsigned long dernier = 0;

void setup() {
  Serial.begin(115200);
  analogReadResolution(10); // 0..1023 (par defaut sur Every)
  analogReference(DEFAULT); // 5 V ; INTERNAL = 1.024 V ou 2.048 V
}

void loop() {
  if (millis() - dernier < 20) return; // 50 Hz
  dernier = millis();
  float brut = analogRead(CANAL);
  if (!init) { valeur = brut; init = true; }
  // moyenne exponentielle : reactivite sans buffer de 16 mesures
  valeur = valeur * (1 - ALPHA) + brut * ALPHA;

  static float derniereSortie = -10;
  if (abs(valeur - derniereSortie) >= 2) { // mort d'affichage
    derniereSortie = valeur;
    Serial.print(F("brut="));
    Serial.print(valeur, 1);
    Serial.print(F(" V="));
    Serial.println(valeur * (5.0 / 1023.0), 3);
  }
}

← Volver a la ficha