Low-Power-Interrupt-Generator

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:

Strom mit aktiviertem Watchdog

Wenn es deaktiviert ist, sind wir auf etwa 100 nA gesunken:

Strom mit deaktiviertem Watchdog

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:

Watchdog-Schaltung

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.


Die Fragen

  • 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?

Bei Ihrem Schema variiert die Zeit der fallenden Flanke wahrscheinlich stark, abhängig von der Temperatur des uC, Schmutz auf der Platine usw. Es gibt nicht einmal wirklich eine Garantie dafür, dass die fallende Flanke überhaupt auftritt, da dies der Fall sein könnte eine Bedingung sein, bei der die Leckage von VCC die Leckage zur Erde dominiert, wenn sich der uC-Pin im High-Z-Zustand befindet.
Um die genaue Genauigkeit mache ich mir keine Sorgen. Ich konnte immer mal wieder einen RTC Chip checken. Was den Punkt angeht, dass es keine fallende Flanke gibt, wäre es hilfreich, einen Pulldown-Widerstand zu haben? Ich habe es gerade mit 1 M versucht, und das hat das Zeitintervall drastisch reduziert (auf 50 ms). Es gibt eine andere verwandte Frage , bei der Olin Lathrop sagte, er habe einen Timer mit "ein paar Transistoren und hochwertigen Widerständen und Kondensatoren" hergestellt. Es gibt jedoch keine weiteren Details.
Die 970 ms, die Sie messen, implizieren eine Leckage, die etwa 4,3 Megaohm entspricht; Durch das Hinzufügen eines zusätzlichen Widerstands mit niedrigerem Wert wird die Abklingzeit mindestens halbiert. Aber es sollte auch den Zerfall konsistenter machen.

Antworten (2)

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.

Nun, jetzt fühle ich mich wie ein Dill. Zum einen hat meine Schaltung im Grunde genommen einen schwebenden Eingang gemessen, was eine dumme Idee ist. Außerdem hatte ich Code, um genau das zu tun, was Sie hier vorgeschlagen haben . Ich hatte vergessen, dass es eine ziemlich gute Leistung hat. Ich habe einen Stromverbrauch von 1,46 µA bei Betrieb mit 5-V-Stromversorgung und 1,1 µA bei Betrieb mit 3,3-V-Stromversorgung gemessen. Dennoch interessiert mich die Behauptung von Olin Lathrop, dass „ich damals, als eingebaute Watchdogs ein paar µA brauchten, einen externen gemacht habe, der nur ein paar 100 nA verbraucht hat.“

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.