🛠 Mode power-down et réveil par watchdog (AVR C nu)

Arduino Leonardo — Fiche carte · avance · Schéma : IMG-leonardo-avance-9-leonardo-low-power-powerdown-watchdog.svg — Leonardo sur batterie en sommeil profond, puce ATmega32u4 endormie et chiot-chien de garde (watchdog) la réveillant toutes les ~2,1 s

Objectifs

Optimiser la consommation de l'ATmega32u4 en AVR C nu : basculer le cœur en mode power-down (sommeil profond, horloges matérielles arrêtées) et le réveiller périodiquement par le watchdog timer configuré en mode interruption (~2,1 s). C'est la base de tout projet sur batterie. Attention spécifique Leonardo : le transceiver USB connecté à un hôte consomme en permanence ; pour mesurer un vrai courant de sommeil, débranchez le câble USB ou coupez la ligne VBUS.

Matériel

Code complet

/* Sommeil power-down + réveil watchdog ~2,1 s — ATmega32u4
 * Build : avr-gcc -mmcu=atmega32u4 -Os sleep.c -o sleep.elf
 * Flash  : avrdude par ICSP, ou outils avr109 via Caterina. */
#include <avr/io.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>

ISR(WDT_vect) {
  PINB = (1 << PINB7); // bascule la LED D13 a chaque réveil
}

int main(void) {
  DDRB |= (1 << DDB7);            // PB7 (D13) en sortie

  MCUSR &= ~(1 << WDRF);          // efface la cause de reset
  WDTCSR |= (1 << WDCE) | (1 << WDE);      // sequence de modification
  WDTCSR = (1 << WDIE) | (1 << WDP2) | (1 << WDP1) | (1 << WDP0); // ~2,1 s, mode interruption

  set_sleep_mode(SLEEP_MODE_PWR_DOWN);     // sommeil le plus profond
  sleep_enable;
  sei;

  while (1) {
    sleep_cpu;      // le coeur s'arrete ; le watchdog le reveille
    sleep_disable;  // sécurité : on ne dort qu'un cycle a la fois
    sleep_enable;
  }
}

Vérification attendue

La LED clignote environ toutes les 2,1 s (la bascule a lieu dans l'ISR du watchdog, puis le cœur repart dormir). Insérez un ampèremètre en série avec l'alimentation, USB débranché : le courant moyen chute drastiquement par rapport au fonctionnement normal, l'essentiel du temps étant passé en power-down. La fiche officielle ne donne pas de courant typique (à vérifier dans la datasheet Microchip de l'ATmega32u4 pour chiffrer précisément).

Erreurs fréquentes

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels