🛠 Mode power-down et réveil par watchdog (AVR C nu)
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
- 1 Arduino Leonardo (flasheable por ICSP o herramientas avr109; aquí el código es autónomo)
- Alimentación por batería de 3,7-5 V o fuente de laboratorio con amperímetro
- Programador ICSP o bootloader Caterina para la carga del binario
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
- Medir el sueño con el cable USB conectado: el transceptor USB permanece alimentado y "despierta" la medición; la corriente de sueño solo es observable con el USB desconectado (o VBUS cortado).
- Olvidar la secuencia WDCE/WDE: los bits de periodo del watchdog solo se modifican mediante la secuencia autorizada en 4 ciclos de instrucción; de lo contrario, la configuración se ignora.
- WDRF no borrado en MCUSR: el watchdog en modo reinicio puede provocar reinicios en bucle en lugar de interrupciones.
- Despertar por interrupción USB o UART parásita: en power-down, algunas líneas activas impiden el sueño; desconecte sensores y módulos durante la medición.
- Olvidar
sleep_disabledespués del despertar: sin esta seguridad, unsleep_cpuinesperado puede dormir el núcleo antes de que termine el procesamiento.
Otros tutoriales para esta placa
- Faire clignoter la LED intégrée (broche 13)
- Bouton et console série : Serial (USB) vs Serial1 (broches 0/1)
- Lire un capteur analogique : potentiomètre et ADC 10 bits
- Clavier USB : taper du texte avec la bibliothèque Keyboard
- Souris USB : déplacer le curseur avec la bibliothèque Mouse
- Asservir un servo moteur avec un potentiomètre (PWM)
Ejemplos de código para esta placa
clignotante.inoArduinobouton-led.inoArduinoclavier-auto-tape.inoArduinosouris-cercle.inoArduinotelecommande-media.inoArduinobouton-clic-souris.inoArduino