So erreichen Sie mit ATTINY85 einen geringen Stromverbrauch

Ich erstelle ein Projekt, das einen ATTINY85 verwendet. Die meiste Zeit sollte der Stromkreis ausgeschaltet sein und so wenig Strom wie möglich verbrauchen. Laut Datenblatt verbraucht der Mikrocontroller im Power-Down-Modus 0,1 μA bei 1,8 V. Ich versorge die Schaltung mit zwei AAA-Batterien in Reihe, was ungefähr 3 V ergibt, also erwarte ich einen höheren Stromverbrauch, aber immer noch in der gleichen Größenordnung, aber bisher bekomme ich 300 μA im Power-Down-Modus.

Ich habe alles aus meinem Code entfernt, mit Ausnahme des Energieverwaltungscodes, um zu versuchen, das Problem zu isolieren:

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

void setup()
{
  cli();  // Disable interrupts

  // Reduce the clock frequency to conserve power
  clock_prescale_set(clock_div_128);

  // Disable all modules
  power_all_disable();
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);

  // Configure all ports as output
  // (does not seem to make any difference)
  DDRB = 0b0011111;
  PORTB = 0;
}    

void loop()
{
  sleep_enable();
  sleep_bod_disable();
  sleep_cpu();
}

Wie aus dem Code hervorgeht, verwende ich die Arduino-Bibliothek zum Programmieren, weil sie schneller einzurichten war, aber ich glaube nicht, dass dies einen Unterschied machen würde. Liege ich falsch?

Die Sicherungen sind E:FF, H:DF, L:62, also verwende ich den internen 8-MHz-Oszillator, geteilt durch 8. Ich verwende außerdem den Taktvorskalierer, um ihn durch 128 zu teilen, da er anscheinend den Stromverbrauch reduzieren sollte.

Meine Schaltung ist wie folgt:

Schaltplan

Dieses Diagramm zeigt es nicht, aber die Widerstände sind mit den Anoden von vier LEDs verbunden, deren Kathoden mit Masse verbunden sind (so dass die LEDs einschalten, wenn die Pins hoch sind).

Ich messe den Strom mit einem Multimeter, dessen niedrigste Skaleneinstellung 200 μA beträgt, daher glaube ich, dass ich diesen Strom mit angemessener Genauigkeit messen können sollte.

Was fehlt mir hier? Warum ist mein Stromverbrauch höher als erwartet?

Wohin gehen die an die 4 Widerstände angeschlossenen Ausgangsports im Power-Down-Modus, dh Sie haben sie vielleicht als schwache Pull-Ups eingestellt? Ist Ihr unbenutzter Eingang als Ausgang eingestellt? Warum haben Sie einen Druckknopf direkt über der Versorgung? Irgendwelche Entkopplungskondensatoren, die Sie vergessen haben, auf der Schaltung anzuzeigen?
Haben Sie die Diagramme und Tabellen im Datenblatt sorgfältig gelesen? Der EINZIGE Weg, um etwas in der Nähe zu erreichen 1 μ A wenn Sie ALLE Oszillatoren abschalten, einschließlich des RC-Oszillators und des Watchdogs. Siehe Seite 178, Abbildung 22-11. Wenn Sie den Watchdog aktivieren, aber den Hauptoszillator ausgeschaltet lassen, steigt dies auf ein Vielfaches von an 1 μ A . All dies setzt auch voraus, dass nichts an die MCU angeschlossen ist, was diese Zahlen ändern könnte. Der RC allein, wenn 128 kHz, wird kauen 60 μ A oder so.
Wenn Sie einen extrem niedrigen Strom wünschen, können Sie unter sein 1 μ A während ein Stimmgabeloszillator am Laufen bleibt 32 kHz mit dem MSP430. (Die absolute Garantie über alle Temperaturen ist jedoch höher.) Es verfügt über einen speziellen Quarzoszillator-Wechselrichter, der für Stimmgabelkristalle ausgelegt ist, die selbst nur weit unter sein müssen 1 μ W um richtig zu funktionieren. MSP430, Hinzufügen von DCO bei 1 MHz (für zwei gleichzeitig laufende Oszillatoren) ist 22 μ A typisch. Da können Atmel-Geräte nicht herankommen.
@andy aka, ich habe versucht, die internen Pullups zu deaktivieren, aber das hat keinen messbaren Unterschied gemacht. Der unbenutzte Pin wird als Ausgang gesetzt. In Bezug auf die Schaltfläche ist dies ein Fehler im Diagramm. Es verbindet stattdessen Reset mit Masse. Es gibt vorerst keine Entkopplungskondensatoren.
@jonk, ich habe das Datenblatt gelesen und alles deaktiviert, was deaktiviert werden könnte. Wenn das Mikro im Power-Down-Modus ist, sollten alle Oszillatoren gestoppt werden, denke ich. Ich muss nicht wirklich auf 1 uA heruntergehen, aber ich möchte mit diesem Design so viel Batterie wie möglich sparen.
was ist mit adc_disable()
Deaktiviert power_all_disable() nicht auch den Adc?
@AntoineAubry Der Power-Down-Modus unterstützt einen gleichzeitig arbeitenden Watchdog. Es berücksichtigt jedoch nicht den Strom, den Sie sehen. Es ist nicht so hoch, selbst wenn der Watchdog aktiviert ist. Deaktivierst du speziell den Watchdog? Und können Sie stattdessen keine Bibliotheksroutine verwenden, sondern die SM-Bits direkt selbst schreiben? (Es könnte hilfreich sein, nicht davon auszugehen, dass die Dinge richtig gemacht werden, und sie stattdessen selbst zu tun, nur um sicherzugehen.) Ich habe Ihre Konfiguration nicht überprüft, aber der Brown-Out selbst kann auch Strom aufsaugen. Ist es deaktiviert?
@AntoineAubry Sie haben den Watchdog eingeschaltet und den BOD aufgrund Ihrer Sicherung H-Einstellung ausgeschaltet. Sie haben den RC Osc auf 8 MHz eingestellt, für langsam ansteigende Leistung konfiguriert und CKOUT aufgrund Ihrer Sicherung L-Einstellung aktiviert. Warum aktivieren Sie CKOUT? Können Sie angesichts des Stromverbrauchs hier eine Uhr sehen, wenn Sie heruntergefahren sind? (Das sollten Sie nicht, aber ich denke, es muss möglicherweise getestet werden, um festzustellen, ob Sie wirklich heruntergefahren sind. Im Moment ist alles in Frage.)
@jonk Ich habe CKOUT absichtlich nicht aktiviert. Das war der Standardwert der Fuses. Ich werde es dann prüfen und hier so bald wie möglich berichten.
@jonk Ich habe die Sicherungen mit diesem Tool überprüft und sehe, dass die Taktausgabe deaktiviert ist, die Brown-Out-Erkennung deaktiviert ist und der Watchdog ebenfalls ausgeschaltet ist. An den Sicherungen muss man meiner Meinung nach nichts ändern. Sind Sie einverstanden?
@AntoineAubry Nun, ich habe die Zahlen verwendet, die ich in Ihrer Frage gesehen habe, und sie im Datenblatt nachgeschlagen. Es ist möglich, dass ich einen Fehler gemacht habe. Aber ich versuchte es nicht. Wenn diese Zahlen korrekt bleiben, ist entweder das Dokument falsch, ich habe einen Fehler beim Lesen gemacht, Sie haben falsch geschrieben, oder Ihr Tool meldet falsch. Wahrscheinlich nur ich. Aber das sind die Optionen, die ich sehe.
Ich habe die Sicherungen anhand des Datenblatts überprüft, und das stimmt mit den Informationen des Tools überein. Beachten Sie jedoch, dass Sicherungen aktiviert werden, wenn sie gleich Null sind. Das könnte das Missverständnis erklären.
@AntoineAubry Dann bin ich mir fast sicher, dass es mein eigenes Problem war. Ich habe nicht alle erforderlichen Abschnitte gelesen. Mein Fehler. Ich gehe davon aus, dass "Programmieren einer Sicherung" bedeutet, sie auf "0" zu setzen, da "1" der gelöschte (unprogrammierte) Zustand wäre.
@AntoineAubry Sie haben aktuelle Messwerte, die die Spezifikationen ernsthaft übersteigen. Ich habe diese Situation noch nie erlebt, es sei denn: (1) die MCU war beschädigt; oder (2) meine Annahmen über etwas waren falsch; oder (3) es gab einen Siliziumfehler und/oder die Dokumentation war falsch und der Hersteller musste eine Korrektur an seiner Dokumentation vornehmen. Ich glaube nicht, dass dies (3) ist. Und ich habe Ihre Sicherungseinstellungen überprüft. Sie verwenden Bibliotheksroutinen (denen ich bei einem solchen Problem fast nie vertraue und die ich stattdessen durch Inline-Assemblierung ersetze). Sie ist also beschädigt oder Ihnen fehlt etwas anderes als die Sicherungen.
@AntoineAubry Ich würde empfehlen, dass Sie die MCU von externen Schaltungseinflüssen isolieren und Ihr Programm isoliert mit dem Programm testen. (Umgehen Sie, was umgangen werden muss, damit dies funktioniert.) (Und/oder verwenden Sie, wenn möglich, eine kommerzielle Demo-BRD.) Testen Sie den Strom mit einer neuen MCU. Dadurch werden alle äußeren Einflüsse eliminiert. Wenn das Problem weiterhin besteht, liegt es an der Software/Ihrem Verständnis.
Ich weiß nichts über die Schlafmodi, aber dieser Schalter SW1 zum Zurücksetzen sieht so aus, als würde er Ihre Stromversorgung kurzschließen, wenn er gedrückt wird. Ein Ende von SW1 sollte mit Pin 1 des Attiny (dh dem anderen Ende dieses Widerstands) und das andere mit GND verbunden werden.

Antworten (2)

Was fehlte, war, dass der ADC vor dem Ausschalten deaktiviert werden muss:

ADCSRA &= ~ bit(ADEN); // disable the ADC
power_all_disable();

Dadurch wurde der Stromverbrauch auf ~16 μA reduziert. Da die Schaltung andere Komponenten enthält, erwarte ich nicht, die im Datenblatt angegebenen 1 μA zu erreichen.

Dies ist ein perfekter Fall, um Ihre eigene Frage zu beantworten !! Freut mich zu hören, dass Sie es aufgespürt haben. Das ist meiner Erfahrung nach fast immer so.

Um die niedrigen Leistungszahlen von Microchip zu erreichen, müssen Sie alle Pins als Eingänge konfigurieren und die Spannung jedes Pins auf Masse oder VCC legen (wobei sie nicht zwischen VCC und GND schweben dürfen). Fügen Sie Pulldowns oder Pullups an den Pins hinzu und fügen Sie sogar Pulldowns parallel zu Ihren LEDs hinzu.

Ich werde das versuchen und hier berichten.
Ich habe versucht, Pulldowns hinzuzufügen, aber das hat keinen messbaren Unterschied gemacht.
Ich verwende nicht genau diesen Teil, aber ich muss alle Ports als Eingänge konfigurieren, bevor Sie schlafen gehen, und sie dann neu konfigurieren, wenn Sie aufwachen. Stellen Sie außerdem sicher, dass die Brownout-Erkennung deaktiviert ist.