Comment les broches d'E / S inutilisées doivent-elles être configurées sur ATMega328P pour une consommation d'énergie la plus faible?

15

J'essaie de réduire autant que possible la puissance d'une carte Arduino que j'ai créée. Comment les broches d'entrée inutilisées doivent-elles être configurées? Il y a déjà quelques réponses ( ici , ici ) pour cela, mais je suis après quelque chose de spécifique à l'ATMega328P.

  1. Régler la broche sur l'entrée, conduire la broche haute pour engager le pull-up interne
  2. Régler la broche sur l'entrée, broche d'entraînement faible
  3. Définir la broche sur l'entrée, tirage externe vers le haut
  4. Définir la broche sur l'entrée, tirage externe vers le bas
  5. Définir la broche pour une sortie faible
  6. Définir la broche pour une sortie élevée
  7. Régler la broche pour une sortie basse, tirage externe vers le bas
geometrikal
la source

Réponses:

12

Après avoir fouillé la fiche technique , j'ai trouvé ceci:

14.2.6 Broches non connectées

Si certaines broches ne sont pas utilisées, il est recommandé de s'assurer que ces broches ont un niveau défini. Même si la plupart des entrées numériques sont désactivées dans les modes de sommeil profond comme décrit ci-dessus, les entrées flottantes doivent être évitées pour réduire la consommation de courant dans tous les autres modes où les entrées numériques sont activées (réinitialisation, mode actif et mode inactif).

La méthode la plus simple pour garantir un niveau défini d'une broche non utilisée est d'activer le pull-up interne. Dans ce cas, le pull-up sera désactivé lors de la réinitialisation. Si une faible consommation d'énergie pendant la réinitialisation est importante, il est recommandé d'utiliser un pull-up ou pull-down externe. La connexion directe de broches inutilisées à VCC ou GND n'est pas recommandée, car cela peut provoquer des courants excessifs si la broche est accidentellement configurée comme sortie.

mise à jour par rapport au commentaire / question:

Selon le tableau 14-1, la résistance de rappel n'est active que lorsque les conditions suivantes sont remplies:

  1. La broche est définie comme entrée (le bit DDxn est logique bas)
  2. PORTxn est réglé sur une logique élevée
  3. PUD est logique faible

La seule façon d'obtenir un courant important traversant la résistance de pull-up est si la broche subit un faible niveau avec le pull-up activé. Cela signifie que Atmel a mal gâché (peu probable) ou que la broche est configurée en entrée avec le pull-up activé et que la broche est en quelque sorte connectée à la terre.

La section 14.2.5traite des modes d'activation et de veille de l'entrée numérique. Pour résumer, l'entrée numérique est fixée à la masse à l'entrée du déclencheur Schmitt pour empêcher un niveau flottant en mode veille, sauf si la broche est configurée comme une interruption externe. Je ne peux pas dire si la sortie numérique est désactivée en mode veille. Il ne semble pas être désactivé selon la figure 14-2, mais je ne serais pas trop surpris si c'était le cas. Le mieux est d'utiliser une résistance de rappel interne ou externe.

helloworld922
la source
merci, pensez-vous que c'est mieux que de régler sur une sortie, en termes de puissance utilisée? Y a-t-il du courant dans le pull-up interne? L'appareil sera en mode veille éteint pendant la majorité du temps.
geometrikal
réponse mise à jour. Je ne pense pas que vous aurez trop de problèmes avec le fait que ce soit une sortie, mais le mieux est de suivre les conseils d'Atmel.
helloworld922
10
  1. Réglez la broche sur l'entrée, enfoncez la broche haute pour engager le pull-up interne : Je pense que cela devrait se lire: " rendre l'entrée haute en engageant le pull-up interne ". (J'utiliserais le mot "drive" uniquement si vous le faites activement, au moyen d'un FET à Vcc ou au sol.) Il est clair que vous voulez un niveau défini, et le pull-up s'en occupe. Assurez-vous que l'activation du pull-up est l'une des premières choses que vous faites après la réinitialisation. Cela vaut pour l'initialisation des E / S en général. Le seul courant sera le courant de fuite du NFET de la paire push-pull, et la fuite de grille du FET d'entrée. Moins de 1 µA: OK.
  2. Définissez la broche sur l'entrée, broche d'entraînement basse : ce n'est pas une bonne idée. Si le logiciel devient banane et commute la broche en sortie haute, vous court-circuitez la broche, endommageant le PFET de la paire complémentaire.
  3. Réglez la broche sur l'entrée, tirez vers le haut : c'est la même chose que 1), seulement plus cher. Mais a l'avantage que le pull-up sera toujours là; vous pouvez oublier d'activer le pull-up interne (qui est désactivé par défaut). Si les E / S passaient accidentellement en sortie basse, vous aurez un petit drain de courant.
  4. Réglez la broche sur l'entrée, tirage externe vers le bas : Encore une fois, le coût d'une résistance (oui, je sais qu'elles sont bon marché, mais bon marché + inutile = cher.) Le même courant qu'en 3) si la broche passait à haute active.
  5. Définir la broche sur sortie faible : a un courant de fuite plus élevé que lorsqu'il est configuré en entrée, mais toujours inférieur à 1 µA, donc rien à craindre. J'activerais toujours le pull-up interne. Il ne sera pas actif avec les E / S en sortie, mais s'il était accidentellement commuté pour entrer, la broche ne resterait pas flottante.
  6. Définir la broche pour une sortie élevée : identique à 5)
  7. Régler la broche sur une sortie basse, pull down externe : La résistance pull-down est un coût inutile: cela rendrait une sortie basse, qui est déjà basse. Mais par rapport à 5) a l'avantage que vous êtes sûr que la broche ne flottera pas si elle est involontairement commutée en entrée.

Je choisirais 1): entrée avec pull-up interne; aucune pièce externe requise. Dans un FMEA 5), cela peut mieux se passer, mais cela dépend de la hauteur à laquelle vous estimez le risque que vous oubliez d'activer le pull-up interne. Un examen par les pairs de la conception de logiciels devrait vous donner une assurance.

stevenvh
la source
1

Les broches ne font généralement pas une grande différence elles-mêmes. Vous verrez également que chaque broche a une fonction spécifique - désactivez la fonction de la broche

volatile uint8_t timer2sum; // see interrupt handler

void Initialize()
{
    // configure pin for output
    DDR_LED |= LED;

    // set Power Reduction Register
    PRR = (1<<PRTWI)     // turn off TWI
        | (1<<PRTIM0)    // turn off Timer/Counter0
        | (1<<PRTIM1)    // turn off Timer/Counter1 (leave Timer/Counter2 on)
        | (1<<PRSPI)     // turn off SPI
        | (1<<PRUSART0)  // turn off USART (will turn on again when reset)
        | (1<<PRADC);    // turn off ADC

    // select POWER SAVE mode for sleeping, which allows Timer/Counter2 to wake us up
    set_sleep_mode(SLEEP_MODE_PWR_SAVE);

    // configure Timer/Counter2 to wake us up as infrequently as possible
    TCCR2B |= (1<<CS22) | (1<<CS21) | (1<<CS20); // clock at 14400 Hz
    TIMSK2 |= (1<<TOIE2);                        // interrupt on overflow, 56.25 Hz
    timer2sum = 0;                               // see interrupt handler
    sei();                                       // enable interrupts
}

extrait de http://www.nerdkits.com/library/lowpowerexample/ qui utilise également les mêmes puces.

exussum
la source