ATtiny85 Stromverbrauch doppelt erwartet

9

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() {}
nsayer
quelle
1
Hast du den Komparator getötet?
Ignacio Vazquez-Abrams
1
Haben Sie sich einige der Tricks angesehen, die der Jeelabs-Typ gemacht hat? Siehe hier (lesen Sie unten): jeelabs.org/tag/lowpower
RJR
1
@RJR Ich habe einen Blick darauf geworfen, und leider funktionieren viele ihrer Tricks nicht, da ich SLEEP_MODE_IDLE nur verwenden kann, weil ich den Timer am Laufen halten muss. Diese Anwendung ist eine Uhr.
Nsayer
1
Wenn dies eine Uhr ist, kann ich vorschlagen, den internen Oszillator auszuschalten und einen Uhrenkristall am Timer 2 zu verwenden, um den Watchdog-Interrupt auszulösen? Sie können dann tiefen Schlaf verwenden. Ich denke, es gibt auch irgendwo einen Jeelabs-Blog-Beitrag darüber.
RJR
1
All das Googeln, das ich sehe, deutet darauf hin, dass sie ein externes RTC-Modul verwenden. Wenn Sie eine RTC haben, können Sie den Watchdog und den internen Oszillator verwenden, da der CPU-Takt nicht wichtig ist. In diesem Fall möchte ich jedoch die Genauigkeit des Kristalls. Außerdem ist dies ein ATTiny85 - es gibt keinen Timer 2, nur 0 und 1, und Timer 1 verbraucht eine Größenordnung mehr Strom als Timer 0. Ich weiß nicht, wie Sie einen Kristall ohne einen an einen ATTiny anschließen würden Alle zusätzlichen externen Komponenten außer der Systemuhr.
nsayer

Antworten:

6

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.

Geben Sie hier die Bildbeschreibung ein

Bruce Abbott
quelle
Okay. Ich werde beißen. Ich werde heute in den Laden gehen und einen 2-MHz-Kristall nehmen und den Chip für keine Taktteilung wieder verschmelzen und ihn überprüfen.
nsayer
Eine weitere Schwierigkeit ist die Notwendigkeit von 2 x Kristallfrequenzen. Ich ging in den Laden und fand einen 4.096 MHz, aber 1.024 und 2.048 sind schwer zu finden. Wenn Sie jedoch keine 2 ^ x-Uhr verwenden, ist es schwierig, einen Prescale- und OCR0A-Wert auszuwählen, der zu geraden Sekundenbruchteilen führt. Aber wenn 8,192 MHz geteilt durch 16 erhebliche Energie spart, würde ich mich sicherlich über 16,384 geteilt durch 32
freuen
2
Mit einem 4,096-MHz-Quarz und einem CPU-Takt-Vorskalierungswert von 8 werden jetzt etwa 450 µA verbraucht.
nsayer
ein paar Jahre zu spät, aber warum nicht eine RTC kaufen und deren PPS verwenden, den Prozessor hart schlafen lassen und ihn nur bei Unterbrechung aufwachen lassen.
HilarieAK
3

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?

Blup1980
quelle
Scheiße. Wenn pinMode(P_UNUSED, INPUT_PULLUP);nicht genug, dann WTF?
nsayer
Ja, aber manchmal reicht das nicht aus. Beispielsweise können Sie Pins haben, die standardmäßig ADC-Eingang oder Analogeingang sind, unabhängig von der Richtung, die Sie programmieren. Dort müssen Sie zunächst die Sekundärfunktion deaktivieren. Das habe ich mit "überprüfen" gemeint.
Blup1980
Dies ist ein ATTiny85. Es gibt 6 Pins, aber 3 davon sind RESET und die beiden XTAL-Pins. Zwei davon sind Ausgänge und einer ist P_UNUSED. Der gesamte ADC wurde explizit ausgeschaltet. Ich werde den INPUT_PULLUP-Trick an den anderen 3 Pins versuchen, aber ich vermute, dass er nichts ändern wird. Es gibt eine Errata für den Tiny45, die davon spricht, dass die xtal-Pins wegen des Stromverbrauchs nicht auf OUTPUT gesetzt werden.
nsayer
Das Hinzufügen pinMode(3, INPUT_PULLUP);und das Gleiche für 4 und 5 hat nichts bewirkt.
Nsayer
1

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 ADCSRAder 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.

nsayer
quelle