Derzeit läuft mein Datenlogger mit 12 MHz und schläft 90 % der Zeit. Wenn es aktiv ist, wird es meistens durch E / A wie SD-Karte oder UART blockiert.
Ich vermute, das System würde immer noch bei 6 MHz funktionieren, aber woher wissen Sie, was vernünftig ist? Ich kann die Uhr verringern, bis seltsame Fehler auftreten, aber das scheint zu verschwommen zu sein. Ich kann alle Bauanleitungen zählen und den Wert berechnen, aber das ist zu genau (und viel zu viel Arbeit).
Gibt es also einige Faustregeln, um eine vernünftige Schätzung vorzunehmen?
Wenn Ihr Code nicht funktioniert, wenn sich die Taktrate verringert, klingt es so, als würden Sie alle Interruptquellen am Leben erhalten (verschachtelte Interrupts), wenn Sie eine Interruptroutine bedienen. Wenn alle Interrupts ständig aktiviert sind, springen Sie aus einem Code heraus und in einen Interrupt höherer Ordnung, wenn einer auftritt, und kehren erst zu einem Interrupt niedrigerer Ordnung zurück, wenn der Interrupt höchster Ordnung beendet ist.
Dies kann zu großen Timing-Problemen führen, wenn die Interrupt-Prioritäten nicht richtig verwaltet werden, insbesondere bei Kommunikationsports wie UART und SD-KARTE. Wenn man davon ausgeht, dass die GPIOs mit der Außenseite Ihrer Box verbunden sind, werden die GPIO-Interrupts in einem Datenlogger "nach Belieben" passieren und können nicht vorhergesagt werden, daher ist es vorteilhaft, diese Routinen sehr kurz zu halten.
Dies kann dazu führen, dass für diese externen Pins eine maximale GPIO-Toggle-Rate eingestellt wird, damit Ihr Code gültig bleibt (maximal 100 Hz an jedem externen Eingangspin und maximal 2 KHz über alle Eingänge zum Beispiel).
Wenn Sie den Strom reduzieren möchten, laufen Sie im aktiven Modus mit einer höheren Taktrate, indem Sie den Code so ändern, dass alle Routinen ereignisgesteuert sind und für den Rest der Zeit in einen Schlaf- oder Wartemodus wechseln, um den Versorgungsstrom zu reduzieren. Einige Mikrocontroller haben Wartemodi mit extrem niedrigem Strom von 75 % des aktiven Modus (CPU aus, Peripheriegeräte an), aber die meisten reduzieren den Strom nur um ~ 20-30 % vom aktiven Modus.
Ein oder zwei Mikroanbieter können die Peripheriegeräte sogar im Tiefschlafmodus mit schnellem Aufwachen am Laufen halten, aber die meisten Mikros schalten normalerweise alle Peripheriegeräte im Tiefschlafmodus aus und erlauben nur dem GPIO, WDT, POR, BOR oder einer RTC das Aufwachen ein Mikro hoch.
Vorausgesetzt, Sie müssen keine Zeit damit verbringen, in Ihrer CPU zu warten, hängt der Gesamtlade- (Energieverbrauch) des CPU-Kerns von der Gesamtzahl der auszuführenden Befehle ab und nicht von der Taktrate, mit der sie ausgeführt werden hingerichtet. Die Menge an Energie, die ein CPU-Kern verbraucht, der 10 % der Zeit bei 24 MHz aktiv ist, ist oft ungefähr vergleichbar mit der eines CPU-Kerns, der 20 % der Zeit bei 12 MHz aktiv ist.
Wenn der Chip über eine programmierbare interne VDD verfügt und nur bei höheren Geschwindigkeiten mit höheren VDD-Einstellungen arbeiten kann, erhöht die Verwendung dieser höheren Einstellungen wahrscheinlich den Ladeverbrauch pro Anweisung, unabhängig von der Geschwindigkeit, mit der die CPU diese Anweisungen tatsächlich ausführt . Daher hat das Hochfahren der CPU über einen Schwellenwert hinaus, der eine höhere VDD erfordert, eine viel bessere Wirkung auf den Ladungsverbrauch als das Hochfahren bis zu einem Punkt knapp unterhalb eines solchen Schwellenwerts.
Meine Empfehlung wäre, ungefähr herauszufinden, welche Geschwindigkeit Sie benötigen, daraus herauszufinden, welche VDD- und andere Einstellungen benötigt werden, und den CPU-Takt angesichts dieser Einschränkungen so schnell wie möglich einzustellen. Wenn Sie das getan haben, konzentrieren Sie sich darauf, die CPU so oft wie möglich im Leerlauf zu halten.
Die Antwort von Supercat ist ziemlich genau das, was ich vorgeschlagen hätte, aber überprüfen Sie auch Ihren Stromkreis auf andere Verbraucher, die Strom ziehen, wenn sie es nicht brauchen.
Vorausgesetzt, Sie haben externe Komponenten, ziehen diese wahrscheinlich mehr Strom als Ihr Mikrocontroller, noch bevor Sie Spannung, Frequenz und aktive Zeit optimiert haben. Wenn dies nur ein Prototyp ist, prüfen Sie, ob Sie ihn für einen optimierten Stromverbrauch umgestalten können.
Bei einem Arbeitszyklus von 10:90 bei 12 MHz sollten etwa 1,2 MHz einen Arbeitszyklus von 100 % ohne Spielraum für Fehler ergeben. Wählen Sie einen Sicherheitsfaktor innerhalb Ihres Komfortniveaus und multiplizieren Sie ihn mit 1,2 MHz.
Wenn 10:90 eine Schätzung ist, könnten Sie ein Ausgangsbit erhöhen, wenn die MCU aufwacht, und es wieder senken, kurz bevor sie schläft. Sie können dann die Laufzeit mit einem Oszilloskop oder einem DVM ermitteln, das Frequenz und Arbeitszyklus messen kann. Nehmen Sie die obige Einstellung vor und messen Sie erneut. Wiederholen Sie dies, bis es Ihrem Arbeitszyklus, Stromverbrauch oder einem anderen Ziel entspricht.
Meine bevorzugte Strategie beim Umgang mit dieser Art von Anwendung besteht darin, den Code ereignisgesteuert (oder asynchron) zu machen und sich nicht zu viele Gedanken über die Taktfrequenz zu machen. Wenn Sie das System mit Interrupts betreiben (z. B. über Timer oder Peripheriegeräte), können Sie möglicherweise den Leistungspegel der MCUs als Standardaktion auf eine Art Ruhezustand senken und nur bei Interrupts etwas anderes tun. Einige der Atmel-MCUs verfügen über Schlafstufen, die bestimmte Interrupts für das Aufwachen aktivieren/deaktivieren. Die MCUs der ARM Cortex M-Serie verfügen außerdem über erweiterte Interrupt-Fähigkeiten, die gut zu Energieeinsparungen passen.
Wenn die Ereigniswarteschlange leer ist, führen Sie die Standardaktion aus: Wechseln Sie für einige Zeit in den Energiesparmodus. Auf diese Weise ist die Taktfrequenz nicht wichtig, da Sie nur dann eingeschaltet sind und Strom verbrauchen, wenn Sie etwas zu tun haben.
Christoph
Chris Stratton
Maestro
Christoph
Maestro