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

Arduino Leonardo — Ficha de placa · 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

Objetivos

Optimizar el consumo del ATmega32u4 en C AVR puro: cambiar el núcleo al modo power-down (sueño profundo, relojes de hardware detenidos) y despertarlo periódicamente mediante el watchdog timer configurado en modo interrupción (~2,1 s). Esta es la base de cualquier proyecto alimentado por batería. Atención específica para la Leonardo: el transceptor USB conectado a un host consume constantemente; para medir una corriente de sueño real, desconecte el cable USB o corte la línea VBUS.

Material

Código completo

/* Sommeil power-down + reveil 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 reveil
}

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;  // securite : on ne dort qu'un cycle a la fois
    sleep_enable;
  }
}

Verificación esperada

El LED parpadea aproximadamente cada 2,1 s (el cambio ocurre en la ISR del watchdog, luego el núcleo vuelve a dormir). Inserte un amperímetro en serie con la alimentación, con el USB desconectado: la corriente media cae drásticamente en comparación con el funcionamiento normal, ya que la mayor parte del tiempo se pasa en power-down. La ficha oficial no proporciona una corriente típica (verifique en la hoja de datos de Microchip del ATmega32u4 para cuantificarlo con precisión).

Errores frecuentes

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales