Wie bestimmt man eine vernünftige Taktfrequenz für eine MCU?

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?

Bitte teilen Sie uns genau mit, welchen Mikrocontroller Sie verwenden, und posten Sie einen Schaltplan. Was versuchst du zu erreichen, indem du die Uhr herunterstellst? Wenn es sich um einen geringeren Stromverbrauch handelt, gibt es andere - vielversprechendere - Möglichkeiten, dies zu tun.
Beginnen Sie damit, zu überlegen, welche unflexiblen Timing-Einschränkungen Sie möglicherweise übersehen und inwieweit die Verwendung von Pufferung und Interrupts sie flexibel machen könnte.
@Christoph Ja, ich versuche, den Stromverbrauch zu senken.
@Joshua Und was ist mit dem Typ und Schema des Mikrocontrollers? Je mehr Informationen Sie uns zur Verfügung stellen, desto besser können unsere Antworten sein.
@Christoph Es ist ein Cortex M0, ich wollte die Frage nicht zu spezifisch stellen.

Antworten (5)

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.

Die meisten Peripheriegeräte verlassen sich auf Clk, um Baudraten abzuleiten. Man kann den Clk nicht einfach reduzieren, ohne den UART neu zu konfigurieren, damit er mit dem gleichen Baud für den neuen Clk arbeitet

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.

  • Wenn externe ICs vorhanden sind, sehen Sie nach, ob sie einen Abschaltmodus bieten (ein Kandidat ist Ihr UART: Wenn Sie einen Pegelumsetzer haben, ist es möglicherweise möglich, ihn während des Ruhezustands zumindest teilweise auszuschalten).
  • Spannungsteiler, Pull-Ups oder Pull-Downs, nichts prüfen. Passive Komponenten werden oft ignoriert, weil "sie nichts tun", aber sie ziehen Strom.

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.