Ich versuche, einen ATTiny85 dazu zu bringen, eine Batterie zu entladen. Ich habe es von einem 16,384-MHz-Kristall getaktet, wobei die Sicherung durch 8 geteilt wurde. Vcc beträgt 3,3 Volt. Abbildung 22-7 im Datenblatt besagt, dass im Leerlauf ( set_sleep_mode(SLEEP_MODE_IDLE); sleep_mode();
) etwa 300 µA gezeichnet werden sollten. Tatsächlich sehe ich, dass es eher 850 µA zeichnet. Ich kann nicht herausfinden, warum der Stromverbrauch doppelt erwartet wird. Ich habe alles in PRR ausgeschaltet, außer timer0, das ich so konfiguriert habe, dass es alle 25 ms unterbrochen wird. Daher sollte es den größten Teil seiner Zeit im Leerlauf verbringen. Dies ist das Beste, was ich tun kann, da ich immer noch möchte, dass die Timer zählen.
Die Sicherungen sind 0x7f, 0xdf, 0xff.
Hier ist der Code, der für diesen Test ausgeführt wird:
#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() {}
Antworten:
Sie sagen, dass gemäß Abbildung 22-7 im Datenblatt nur 300 µA gezeichnet werden sollten, aber diese Grafik zeigt die Stromaufnahme für den Betrieb ohne Taktteilung . Ein Quarzoszillator, der mit 16 MHz läuft, muss mehr Strom ziehen als ein Quarzoszillator mit 2 MHz, und der dreistufige Teiler fügt etwas mehr hinzu. Die Frage ist - wie viel mehr?
Das Datenblatt schlägt auch vor, dass der Leerlaufstrom durch Teilen des Takts reduziert werden kann, aber es sagt auch nicht aus, wie viel er reduziert wird. Die Extrapolation der 3,3-V-Leitung legt nahe, dass sie normalerweise etwa 1,5 mA bei 16,4 MHz verbraucht und 850 µA eine signifikante Reduzierung darstellt - aber sollte sie geringer sein?
Wenn Sie auf den kommenden Boards keinen Kristall mit niedrigerer Frequenz verwenden können, können Sie möglicherweise nichts tun. Während Sie die Schaltung auf einem Steckbrett haben, können Sie zumindest einen 2-MHz-Kristall ausprobieren, um festzustellen, ob dies wirklich das Problem ist.
quelle
Ich hatte ein ähnliches Problem mit diesem Chip. Der Stromverbrauch war 30% höher als erwartet.
Das Problem war unbenutztes GPIO!
Sie wurden als Eingänge konfiguriert und schwebend gelassen. Das Fehlen eines klar definierten Eingabestatus hat dazu geführt, dass der GPIO-Treiber viel mehr verbraucht als angegeben.
Die Antwort war, die Klimmzüge zu aktivieren oder nicht verwendete Pins als Ausgänge zu konfigurieren.
Sind Sie sicher, dass die Stifte richtig eingestellt sind? In Ihrem Code scheint es so, aber haben Sie überprüft?
quelle
pinMode(P_UNUSED, INPUT_PULLUP);
nicht genug, dann WTF?pinMode(3, INPUT_PULLUP);
und das Gleiche für 4 und 5 hat nichts bewirkt.Ich möchte hinzufügen, dass ich für ein separates Projekt diese Frage gestellt habe und die Antwort auch diese Frage dramatisch beeinflusst hat. Durch Löschen wurde
ADCSRA
der Leerlaufverbrauch auf den Wert in Abbildung 22-6 gesenkt - etwa 100 µA bei einer geteilten Systemtaktrate von 500 kHz - und das ist die nachgeteilte Taktfrequenz, nicht die Kristallfrequenz.quelle