micros-cycle.ino

Arduino Nano Every · Fichier : micros-cycle.ino · Langage : Arduino · Usage : Mesurer un temps court avec micros()

Avant d'asservir une fréquence, mesurez : ce banc de test utilise micros() du Nano Every pour chronométrer une lecture ADC et son traitement, avec min/max/moyenne sur 100 cycles. La résolution de 4 µs du 4809 suffit à la plupart des temporisations critiques.

Matériel requis

Un Arduino Nano Every (ATmega4809 à 20 MHz, brochage identique au Nano, USB micro-B, convertisseur UART séparé, broches 5 V, pile de compatibilité avec le Nano classique). Nano Every, source sur A0 (même flottante pour mesurer le convertisseur seul).

Câblage

Rien de critique ; notez qu'une broche flottante ajoute du temps de settling au multiplexeur ADC.

Fonctionnement

micros() compte l'horloge système ; la soustraction t1-t0 gère le débordement naturel des unsigned. Les statistiques min/max révèlent les interruptions qui perturbent la mesure.

Exécution

Installez le package Arduino megaAVR Boards dans l'IDE, sélectionnez Arduino Nano Every, téléversez. Le Serial USB est séparé du Serial1 matériel (broches RX/TX) : le code série classique fonctionne tel quel.

Variantes

Pour du temps réel dur, comparez avec les timers TCA en mode capture, ou désactivez les interruptions pendant la fenêtre de mesure.

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

← Retour à la fiche