ATtiny85 double consommation attendue

9

J'essaie d'obtenir un ATTiny85 pour fonctionner avec une batterie. Je l'ai cadencé à partir d'un cristal 16,384 MHz, avec le jeu de fusibles diviser par 8. Vcc est de 3,3 volts. La figure 22-7 de la fiche technique indique qu'au ralenti ( set_sleep_mode(SLEEP_MODE_IDLE); sleep_mode();), il devrait tirer environ 300 µA. En fait, je le vois plus comme 850 µA. Je ne peux pas comprendre pourquoi la consommation d'énergie est double. J'ai tout désactivé dans PRR à l'exception de timer0, que j'ai configuré pour interrompre toutes les 25 ms. Il devrait donc passer la grande majorité de son temps à l'état inactif, ce que je peux faire de mieux étant donné que je veux toujours que les chronomètres comptent.

Les fusibles sont 0x7f, 0xdf, 0xff.

Voici le code qu'il exécute pour ce test:

#include <Arduino.h>
#include <EEPROM.h>
#include <avr/sleep.h>
#include <avr/power.h>

#define P0 0
#define P1 1
#define P_UNUSED 2

ISR(TIMER0_COMPA_vect) {
  // do nothing - just wake up
}

void setup() {
  power_adc_disable();
  power_usi_disable();
  power_timer1_disable();
  //PRR = _BV(PRADC) | _BV(PRTIM1) | _BV(PRUSI); // everything off but timer 0.
  TCCR0A = _BV(WGM01); // mode 2 - CTC
  TCCR0B = _BV(CS02) | _BV(CS00); // prescale = 1024
  // xtal freq = 16.384 MHz.
  // CPU freq = 16.384 MHz / 8 = 2.048 MHz
  // count freq = 2.048 MHz / 1024 = 2000 Hz
  OCR0A = 50; // 25 msec per irq
  TIMSK = _BV(OCIE0A); // OCR0A interrupt only.

  set_sleep_mode(SLEEP_MODE_IDLE);

  pinMode(P_UNUSED, INPUT_PULLUP);
  pinMode(P0, OUTPUT);
  pinMode(P1, OUTPUT);
  digitalWrite(P0, LOW);
  digitalWrite(P1, LOW);

  while(1) { sleep_mode(); }
}
void loop() {}
nsayer
la source
1
Avez-vous tué le comparateur?
Ignacio Vazquez-Abrams
1
Avez-vous regardé quelques-unes des astuces du gars des jeelabs? Voir ici (commencer à lire en bas): jeelabs.org/tag/lowpower
RJR
1
@RJR J'ai jeté un coup d'œil, et malheureusement, beaucoup de leurs astuces ne fonctionneront pas parce que je ne peux utiliser SLEEP_MODE_IDLE que parce que je dois garder le chronomètre en marche. Cette application est une horloge.
nsayer
1
S'il s'agit d'une horloge, puis-je suggérer d'exécuter l'oscillateur interne et d'utiliser un cristal de montre sur la minuterie 2 pour déclencher l'interruption du chien de garde? Vous pouvez ensuite utiliser un sommeil profond. Je pense qu'il y a un article de blog de jeelabs à ce sujet quelque part aussi.
RJR
1
Tout le googling que je vois suggère qu'ils utilisent un module RTC externe. Si vous avez un RTC, alors, oui, vous pouvez utiliser le chien de garde et l'oscillateur interne car l'horloge du processeur n'est pas importante. Dans ce cas, cependant, je veux la précision du cristal. Et aussi, c'est un ATTiny85 - il n'y a pas de temporisateur 2, juste 0 et 1, et le temporisateur 1 consomme un ordre de grandeur plus de puissance que le temporisateur 0. Je ne sais pas comment on accrocherait un cristal à un ATTiny sans tout composant externe supplémentaire autre que l'horloge système.
nsayer

Réponses:

6

Vous dites que selon la figure 22-7 dans la fiche technique, il ne devrait tirer que 300µA, mais ce graphique montre le tirage actuel pour un fonctionnement sans division d'horloge. Un oscillateur à cristal fonctionnant à 16 MHz est appelé à tirer plus de courant qu'un oscillateur à 2 MHz, et le diviseur à 3 étages en ajoutera un peu plus. La question est - combien plus?

La fiche technique suggère également que le courant de repos peut être réduit en divisant l'horloge, mais encore une fois, il ne dit pas combien il sera réduit. L'extrapolation de la ligne 3,3 V suggère qu'elle consomme normalement environ 1,5 mA à 16,4 MHz, et 850 µA est une réduction significative - mais devrait-elle être inférieure?

Si vous ne pouvez pas utiliser un cristal de fréquence inférieure sur les cartes que vous venez, il se peut que vous ne puissiez rien faire. Cependant, pendant que vous avez le circuit sur une planche à pain, vous pouvez au moins essayer un cristal à 2 MHz, pour voir si c'est vraiment le problème.

entrez la description de l'image ici

Bruce Abbott
la source
D'accord. Je vais mordre. Je vais au magasin aujourd'hui et je prends un cristal de 2 MHz et je re-fusionne la puce sans division d'horloge et je vérifie.
nsayer
Une autre difficulté est le besoin de 2 ^ x fréquences cristallines. Je suis allé au magasin et en ai trouvé un à 4,096 MHz, mais les 1.024 et 2.048 sont difficiles à trouver. Mais ne pas utiliser une horloge 2 ^ x rend difficile le choix d'une valeur de pré-échelle et OCR0A qui entraîne des fractions égales d'une seconde d'interruption. Mais si 8,192 MHz divisé par 16 économise une puissance significative, je serais certainement heureux que plus de 16,384 soient divisés par 32.
nsayer
2
Avec un cristal de 4,096 MHz en place et une valeur de pré-échelle d'horloge CPU de 8, il consomme maintenant environ 450 µA.
nsayer
quelques années de retard, mais pourquoi ne pas acheter un RTC et utiliser son PPS, mettre le processeur en veille et ne le réveiller qu'en cas d'interruption.
HilarieAK
3

J'ai eu un problème similaire avec cette puce. La consommation d'énergie était de 30% supérieure à ce qui était prévu.

Le problème était GPIO inutilisé!

Ils ont été configurés comme entrées et laissés flottants. L'absence d'un état d'entrée clairement défini a fait que le pilote GPIO consomme beaucoup plus que ce qui est spécifié.

La réponse a été d'activer les tractions ou de configurer les broches inutilisées comme sorties.

Êtes-vous sûr que les broches sont correctement positionnées? Dans votre code, il semble que oui, mais avez-vous vérifié?

Blup1980
la source
Eh bien, merde. Si cela pinMode(P_UNUSED, INPUT_PULLUP);ne suffit pas, alors WTF?
nsayer
Oui, mais parfois ce n'est pas suffisant. Par exemple, vous pouvez avoir des broches qui sont une entrée ADC ou une entrée analogique par défaut, quelle que soit la direction que vous programmez. Là, vous devez d'abord désactiver la fonction secondaire. C'est ce que je voulais dire par "vérifier".
Blup1980
Il s'agit d'un ATTiny85. Il y a 6 broches, mais 3 d'entre elles sont RESET et les deux broches xtal. Deux d'entre elles sont des sorties et une est P_UNUSED. L'ADC entier a été explicitement mis hors tension. J'essaierai l'astuce INPUT_PULLUP sur les 3 autres broches, mais je soupçonne que cela ne changera rien. Il y a un errata pour le Tiny45 qui parle de ne pas régler les broches xtal sur OUTPUT en raison de la consommation d'énergie.
nsayer
L'ajout pinMode(3, INPUT_PULLUP);et la même chose pour 4 et 5 n'ont rien fait.
nsayer
1

Je voudrais ajouter que pour un projet distinct, j'ai posé cette question , et la réponse a également eu un impact considérable sur cette question. l'effacement a ADCSRAramené la consommation inactive à ce que la figure 22-6 dit qu'elle devrait prendre - environ 100 µA à une fréquence d'horloge système divisée de 500 kHz - et c'est la fréquence d'horloge post-divisée, pas la fréquence du cristal.

nsayer
la source