🛠 Temps réel : timers matériels et interruptions sur le GIGA R1
Objectifs
Sortir du modèle « delay partout » pour générer un signal audio à cadence exacte. Le Cortex-M7 à 480 MHz du GIGA R1 dispose de timers matériels et d'interruptions ; nous allons utiliser un ticker matériel (mbed::Ticker, exposé par le cœur Arduino Mbed) pour échantillonner une forme d'onde sur le DAC 12 bits pendant que loop reste disponible. Vous apprendrez aussi les précautions d'interruption liées aux bogues documentées (#789 sur attachInterrupt).
Matériel
- 1 carte Arduino GIGA R1 WiFi
- 1 casque ou ampli sur la prise jack embarquée (DAC0)
- 1 oscilloscope logique ou une simple LED sur une broche pour observer la cadence (optionnel)
Code complet
// GIGA R1 WiFi — ton precis genere par ticker matériel, loop reste libre
#include <Arduino.h>
#include "mbed.h"
const int DAC_PIN = DAC0; // jack audio embarque
mbed::Ticker ticker;
uint32_t phase = 0;
const uint32_t PAS = 32; // pas de phase -> fréquence du ton
volatile uint32_t compteur = 0; // partage ISR <-> loop : volatile obligatoire
void echantillonner { // s'execute en contexte d'interruption
phase = (phase + PAS) & 0xFFF; // onde 12 bits
analogWrite(DAC_PIN, phase);
compteur++;
}
void setup {
Serial.begin(115200);
analogWriteResolution(12);
ticker.attach(echantillonner, 0.0001); // 10 kHz constants
}
void loop {
static uint32_t dernier = 0;
if (compteur - dernier >= 10000) { // ~1 s d'echantillons a 10 kHz
dernier = compteur;
Serial.print("echantillons 10 kHz : ");
Serial.println(compteur);
// loop peut faire autre chose : capteurs, réseau, I2C...
}
}
Vérification attendue
Un son continu et stable sort de la prise jack, sans craquement même si loop fait des traitements longs. Le Moniteur série affiche un compteur qui augmente exactement de 10 000 par seconde, preuve que la cadence est tenue par le timer matériel et non par loop.
Erreurs fréquentes
- Oubli de
volatilesur une variable partagée entre l'ISR et loop : le compilateur optimise et la boucle ne voit jamais les mises à jour. - Appels bloquants (Serial.print, delay) dans la routine d'interruption : blocages et crashes ; l'ISR doit rester la plus courte possible.
attachInterruptsur des broches ou modes mal supportés : des crashes ont été documentés (bogue #789, fermée) ; préférez les tickers mbed quand c'est possible et mettez à jour le cœur.- Confusion ticker matériel / Ticker logiciel (millis) : seul le ticker matériel garantit la cadence sous charge.
- Fréquence d'ISR trop élevée avec DAC : le cœur M7 est rapide (480 MHz) mais l'écriture analogWrite en ISR a un coût ; mesurez avant d'augmenter.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.inoArduinobouton.inoArduinorespiration.inoArduinoanalogique.inoArduinodac-onde.inoArduinooled-i2c.inoArduino