micros-cycle.ino
Antes de servir una frecuencia, mide: este banco de prueba usa micros() del Nano Every para cronometrar una lectura ADC y su tratamiento, con min/max/media sobre 100 ciclos. La resolución de 4 µs del 4809 basta para la mayoría de temporizaciones críticas.
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 en A0 (aunque flotante para medir solo el convertidor).
Cableado
Nada crítico; observa que un pin flotante añade tiempo de asentamiento al multiplexor ADC.
Funcionamiento
micros() cuenta el reloj del sistema; la resta t1-t0 gestiona el desbordamiento natural de los unsigned. Las estadísticas min/max revelan las interrupciones que perturban la medida.
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
Para tiempo real duro, compara con los timers TCA en modo captura o desactiva las interrupciones durante la ventana de medida.
micros-cycle.ino
// micros() du 4809 : resolution 4 us (prescaler 8 a 20 MHz).
// Mesure de la duree d'une lecture capteur + boucle de controle.
const int CANAL = A0;
unsigned long t0, t1;
unsigned long minD = 1000000, maxD = 0, somme = 0;
int n = 0;
void setup() {
Serial.begin(115200);
}
void loop() {
t0 = micros();
int v = analogRead(CANAL); // ~100 us sur le 4809
float tension = v * (5.0 / 1023.0);
t1 = micros();
unsigned long duree = t1 - t0;
minD = min(minD, duree);
maxD = max(maxD, duree);
somme += duree;
n++;
if (n >= 100) {
Serial.print(F("min=")); Serial.print(minD);
Serial.print(F(" max=")); Serial.print(maxD);
Serial.print(F(" moy=")); Serial.println(somme / n);
Serial.println(F("us pour lecture+conversion"));
n = 0; minD = 1000000; maxD = 0; somme = 0;
}
delay(10);
}