Mein Ziel ist es, etwa jede Sekunde einen Interrupt auf einem Atmega328P-Prozessor zu erzeugen, wobei der durchschnittliche Stromverbrauch wesentlich geringer ist als der eingebaute Watchdog-Timer.
Aus dem Datenblatt ist ersichtlich, dass bei aktiviertem Watchdog-Timer die Stromaufnahme bei 5 V und 25 °C etwa 6,5 µA beträgt:
Wenn es deaktiviert ist, sind wir auf etwa 100 nA gesunken:
Etwas dazwischen, sagen wir 1 µA, könnte dazu führen, dass eine Batterie wesentlich länger läuft, aber es dem Prozessor dennoch ermöglichen, aufzuwachen und nach Dingen wie der aktuellen Lichtstärke, Temperatur und dergleichen zu suchen.
Ich habe damit experimentiert:
Die Idee ist, dass der Kondensator schnell (50 µs) durch den Widerstand aufgeladen wird, der den Strom auf etwa 22 mA begrenzt (im Moment unter der Annahme eines 5-V-Betriebs). Der Ausgang wird dann hochohmig, und wir warten auf einen fallenden Interrupt, um den Prozessor aufzuwecken und ihn zu verarbeiten.
Testcode:
const byte capacitor = 2;
const byte LED = 13;
volatile byte fired = true;
void myISR ()
{
digitalWrite (LED, HIGH);
fired = true;
}
void setup()
{
pinMode (LED, OUTPUT);
attachInterrupt (0, myISR, FALLING);
}
void loop()
{
if (fired)
{
delay (1000);
digitalWrite (LED, LOW);
digitalWrite (capacitor, HIGH);
pinMode (capacitor, OUTPUT);
delayMicroseconds (50);
EIFR = bit (INTF0); // clear flag for interrupt 0
pinMode (capacitor, INPUT); // high impedance
digitalWrite (capacitor, LOW);
fired = false;
} // end of if fired
}
Dieser Code enthält nicht den Schlafcode, er ist für die Frage nicht wirklich relevant.
Tests zeigen, dass dies eine Verzögerung von etwa 970 ms ergibt, wenn ich mit dem Laden des Kondensators beginne, bis der Interrupt ausgelöst wird, was ungefähr dem entspricht, was ich will.
Ist dies der beste Weg (oder zumindest ein vernünftiger Weg), ein zeitgesteuertes Wecksignal mit minimalem Stromverbrauch zu erzeugen?
Als durchschnittlichen Verbrauch errechnete ich:
22 mA / (1 / 50 µs) = 1.1 µA
Sieht das richtig aus? Oder ist es sogar noch weniger, da der Kondensator beim Laden weniger Strom aufnehmen würde? Etwa die Hälfte?
Wie Sie angemerkt haben, ist dieses Schema nicht nur von der Versorgungsspannung abhängig, sondern auch von der genauen Geometrie der Eingangstransistoren auf atomarer Ebene, insbesondere von ihrer Leckage und ihrem Spannungsschwellenwert.
Wenn Sie eine noch geringere Leistung als beim WDT wünschen, sollten Sie die Verwendung eines Uhrenquarzes und des asynchronen Timers in Betracht ziehen. Das Datenblatt gibt den typischen Stromverbrauch für diese Methode mit 0,8 µA bei 1,8 V und 0,9 µA bei 3 V an, was eine Extrapolation von 1,1 µA bei 5 V sehr vernünftig macht.
Erwägen Sie die Verwendung eines separaten Prozessors, z. B. des PIC12LF1571 . Sein Stromverbrauch beträgt:
Typical sleep current is 30 nA @ 25 °C (maximum 270 nA @ 85 °C)
Typical WDT takes an additional 550 nA @ 25 °C (maximum 750 nA @ 85 °C)
Total: typical 850 nA @ 25 °C, and maximum 1.02 µA @ 85 °C.
Der WDT kann alles von 1 ms bis zu 256 (1 s ist eine der Auswahlmöglichkeiten) timen. Alles, was Sie hinzufügen müssen, ist eine Entkopplungskappe. Es ist ein 3,3-V-Teil.
Der Chip kostet rund 75 Cent und ist entweder in 8-Pin-DIP- , SOIC- oder MSOP-Gehäusen erhältlich.
Das Photon
Nick Gammon
Das Photon