Economiser l’énergie est devenue une préoccupation importante lorsque l’on conçoit un circuit électronique et il est obligatoire d’inclure un système d’économie d’énergie pour obtenir la certification CE.
En conséquence les microcontrôleurs tels que l’Atmega328 incluent un ensemble complet de fonctions d’économie d’énergie. La section 10 du document de spécifications de l’Atmega328 concerne le sujet du “Power Management and Sleep Modes” (Gestion de l’énergie et modes de veille).
Il existe deux possibilités pour configurer la consommation d’énergie sur ce circuit intégré:
1) Activer ou désactiver des fonctions individuelles
2) Activer ou désactiver des groupes de fonctions en plaçant le micro-contrôleur dans un des modes de veilles prédéfinis
L’utilisateur peut maîtriser précisément l’activation des sous systèmes en programmant certains registres. Mais il peut aussi profiter des fonctions de haut niveau fournies par Arduino pour configurer le micro-contrôleur.
Power
La librairie power.h contient des dizaines de fonctions pour économiser l’énergie d’une carte Arduino an activant ou désactivant individuellement les sous systèmes du microcontrôleur. Par exemple l’utilisateur peut activer le convertisseur analogique numérique simplement en invoquant la fonction power_adc_enable() et il peut le désactiver en invoquant la fonction power_adc_disable().
Non seulement “économiser l’énergie: c’est bien”
mais désactiver les sous systèmes inutilisés permet en général de réduire le bruit globalement présent dans le circuit intégré.
Pour utiliser cette librairie il suffit d’inclure la directive #include <avr/power.h> dans l’entête du programme Arduino.
Sleep
La librairie sleep.h est très importante. Elle permet de placer le micro-contrôleur dans un état prédéfinit, dit “sleep mode”, c’est à dire une configuration pré-définie d’activation ou inactivation de chacun des sous systèmes. La fiche technique de l’Atmega8-328 présente ces modes de veilles dans la table 10-1.

Certains de ces modes n’économisent que peu d’énergie, alors que d’autres placent le micro-contrôleur pratiquement à l’arrêt. Ces consommations ont été mesurées:
Carte Uno à pleine consommation (avec les régulateurs de tension, le circuit intégré USB, les DELs… ): 49 mA
Atmega328 seul: 15,5 mA
Atmega328 seul et en sleep mode:
SLEEP_MODE_IDLE: 15 mA
SLEEP_MODE_ADC: 6,5 mA
SLEEP_MODE_PWR_SAVE: 1,62 mA
SLEEP_MODE_EXT_STANDBY: 1,62 mA
SLEEP_MODE_STANDBY : 0,84 mA
SLEEP_MODE_PWR_DOWN : 0,36 mA
L’utilisation des ces modes de veille n’est pas très évidente. Etant donné qu’ils désactivent certaines fonctions, il peut devenir impossible de réveiller le micro-contrôleur si la programmation est inadaptée. Dans tous les cas un RESET réveille le circuit.
Si le microcontrôleur est placé dans le mode de veille (sleep mode) SLEEP_MODE_PWR_DOWN il ne se réveillera que sur une interruption sur INT0 ou INT1 ou sur une autre broche. Dans ce cas la technique habituelle de programmation inclue la définition d’une interruption sur INT0 ou INT1. On peut aussi utiliser des interruptions sur les autres broches mais dans ce cas il faut modifier leur fonctionnement habituel en positionnant les registres PCIE0 et PCMSK0.
Une implémentation typique du mode de veille est proposée ci-dessous:
void wakeUpInterrupt() {
// Gestionnaire d’interruption
// Placer le code de gestion (court) ici
}void enterSleepMode() {// définition du mode de mise en veille
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
// attachement d’une interruption sur la broche 2 (INT0)
attachInterrupt(digitalPinToInterrupt(2), wakeUpInterrupt, LOW);
// mise à veille
sleep_mode();
// réveil ici
// évite de constamment déclencher des interruptions inutiles!
detachInterrupt(digitalPinToInterrupt(2));
}
wakeUpInterrupt(void) est un gestionnaire d’interruption qui sera invoqué automatiquement lorsque l’interruption est générée. Le code placé dans cette fonction doit être court car l’interruption n’est pas encore désactivée.
Le type de mode de veille est définit par set_sleep_mode(SLEEP_MODE_PWR_DOWN). Le microcontrôleur est finalement placé en sleep mode par l’appel à la fonction sleep_mode().
L’interruption est attachée par: attachInterrupt (digitalPinToInterrupt(2), wakeUpInterrupt, LOW);
· La broche physique sur laquelle l’interruption sera levée est positionnée par digitalPinToInterrupt(2)
· On spécifie le nom du gestionnaire d’interruption
· Le niveau du signal qui va provoquer l’interruption est spécifié. Les valeurs suivantes sont supportées: LOW, CHANGE, FALLING, RISING et HIGH sur la carte Arduino DUE
Après l’invocation de sleep_mode() la carte est effectivement en veille dans le mode qui a été choisit. Lorsqu’un signal atteint le niveau définit sur la broche 2, le gestionnaire d’interruption est invoqué, puis le programme reprend son exécution, normalement. On détache l’interruption.
Ceci est une implémentation pratique et concise qui est utilisée dans le programme du fréquencemètre compatible Arduino.
L’utilisation de la librairie nécessite uniquement d’inclure la directive #include <avr/sleep.h> dans l’en-tête du programme.
Un exposé complet expliquant comment économiser l’énergie d’une carte Arduino est visible ici: Power saving techniques for microprocessors.
Enregistrer
super tuto merssi