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() {}
Réponses:
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.
la source
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é?
la source
pinMode(P_UNUSED, INPUT_PULLUP);
ne suffit pas, alors WTF?pinMode(3, INPUT_PULLUP);
et la même chose pour 4 et 5 n'ont rien fait.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
ADCSRA
ramené 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.la source