Mikrocontroller Stromsparen contra Performance

Die Entwicklung eines stromsparenden Systems funktioniert in vieler Hinsicht nach dem Motto: Weniger ist mehr. Andererseits sollten Entwickler auch darauf achten, dass Systemoptimierungen die Leistungsfähigkeit nicht beeinträchtigen - das soll am Beispiel einer Fernbedienung deutlich werden.

Da bei immer mehr Embedded Systemen ein geringer Stromverbrauch gefordert ist, müssen Entwickler die richtige Balance zwischen Rechenleistung und Energieverbrauch finden. Dies kann zu Kompromissen bei der Leistungsfähigkeit und Zuverlässigkeit des Produkts führen. In drei Bereichen können diese Kompromisse die Performance beeinflussen: analoge Sensorik, Kommunikation und algorithmische Verarbeitung.

So kann ein Design mit analog-kapazitiven Sensoreingängen beispielsweise nicht robust genug gegen Störungen oder Feuchtigkeit sein, wenn die Erfassungsdauer des Sensors aus Gründen der Stromeinsparung zu stark begrenzt wird. Bei einer seriellen Kommunikationsschnittstelle könnte der Entwickler umständlich das Protokoll anpassen müssen, um »Totzeit«-Kommunikationsfehler auszugleichen, wenn sich der Mikrocontroller (MCU) im Deep-Sleep-Modus befindet.

Und einige Algorithmen können weniger funktionsreich ausfallen, da die Einschränkungen bei der Stromaufnahme eine kürzere Berechnungsdauer im Aktivmodus vorschreiben. Entwickler können diese Kompromisse mindern oder sogar vermeiden, wenn sie sich für eine 32-Bit-MCU entscheiden, die sich für hochleistungsfähige und stromsparende Anwendungen eignet.

Rechenleistung und Zuverlässigkeit bleiben erhalten; der Stromverbrauch lässt sich durch spezielle Firmware-Optimierungen senken, welche die MCU-Funktionen nutzen. Als Beispiel für ein Embedded System, das von einer Optimierung des Stromverbrauchs profitiert, dient hier eine Fernbedienung mit folgenden Funktionen: serielle Schnittstelle mit Infrarot-Transceiver (IR), Anwenderschnittstelle mit vier kapazitiven Sensortasten und Überlegungen hinsichtlich der Zukunftssicherheit des Designs. MCUs in stromsparenden Anwendungen folgen grundlegenden Prinzipien (Bild 1):

  • Wenn immer möglich, die MCU in dem Betriebsmodus mit dem niedrigsten Stromverbrauch (Deep Sleep) halten.
  • Bei der Ausführung einer Aufgabe sollte die Firmware möglichst den stromsparendsten Betriebsmodus wählen.
  • Prozessabhängige Aufgaben wie digitale Filteralgorithmen sollten die schnellste Taktfrequenz verwenden, um alle anderen De-signanforderungen zu erfüllen.
  • Zeitabhängige Aufgaben wie das Empfangen eines Datenbytes über eine serielle Schnittstelle mit einer festgelegten Baud-Rate sollten mit der langsamsten Taktfrequenz des Designs erfolgen.

Stromverbrauchsbudget erstellen

Der Entwickler sollte die Firmware des Systems in Funktionsblöcke zerlegen und festlegen, welche Komponenten prozessabhängig oder zeitabhängig sind. Auch ist die Abschätzung hilfreich, wie viel Zeit die Ausführung jeder Firmware-Komponente benötigt und bei welcher Takt-frequenz jede Komponente betrieben wird. Auf der Basis dieser Schätzwerte kann der Entwickler den durchschnittlichen Stromverbrauch ermitteln. Eine solche vorläufige Energiebilanz hilft Entwicklern bei einigen wichtigen Punkten:

  • Sie erlaubt ein besseres Verständnis, welche Art von Batterie
  • für das jeweilige Design geeignet ist. Damit sind Hardware-
  • Überlegungen möglich, die ein Überarbeiten während der Entwicklungsphase ersparen.
  • Eine genauere Abschätzung des Stromverbrauchs führt zu durchdachteren Entscheidungen, welche MCU sich für das Design am besten eignet.

Unser Beispiel mit der Fernbedienung besteht aus folgenden Funktionsblöcken (Bild 2):

  • serielle IR-Schnittstelle - eine zeitabhängige Aufgabe, da die serielle Schnittstelle mit einer festgelegten Baud-Rate betrieben wird;
  • IR-Befehlsparser - ein prozessabhängiger Interpreter-Algorithmus;
  • kapazitiver Sensor zur Berührungserkennung an den Sensorelektroden - eine zeitabhängige Aufgabe, da der kapazitive Sensorblock eine feste Zeit zur Abtastung benötigt;
  • Algorithmen für einen robusteren Betrieb zur Filterung des kapazitiven Sensorausgangs und zur Vermeidung falscher Berührungserkennung - eine prozessabhängige Aufgabe, die MCU-Zyklen und Ressourcen zur Durchführung benötigt.

Bei der Wahl eines 32-Bit-Mikrocontrollers für ein Embedded System müssen sich Entwickler sehr intensiv mit den Produktspezifikationen beschäftigen. Die meisten MCU-Anbieter bieten eine Produktauswahlhilfe und Tabellen mit grundlegenden Funktionen, Code- und RAM-Größen sowie der Anschlussbelegung (Pinout) der Bausteine. Diese Angaben bieten eine erste Hilfestellung, um MCUs auszusortieren, die nicht die grundlegenden Designanforderungen erfüllen.

Beim Vergleich von Funktionen verschiedener MCU-Anbieter ist jedoch Vorsicht geboten: Die Spezifikationen eines Herstellers können anders definiert sein als bei einem anderen Hersteller. Benötigt ein Design zum Beispiel einen sehr leistungsfähigen A/D-Wandler (ADC), muss gewährleistet sein, dass diese Komponente die erforderliche Leistungsfähigkeit über der Temperatur und Spannung beibehält, die auch dem Betriebsbereich des Produkts entsprechen.

Einige integrierte ADCs können ihre Spezifikationen nicht über den gesamten Betriebsbereich des Chips erzielen. Darum ist vor allem in stromsparenden Anwendungen eine sorgfältige Überprüfung der Spezifikationen erforderlich. Bei einigen MCUs müssen die Entwickler bei einem Betrieb mit niedriger Spannung (wie in batteriebetriebenen Anwendungen üblich) Kompromisse hinsichtlich der Leistungsfähigkeit eingehen.

Neben der Überprüfung entsprechend leistungsfähiger analoger Peripherie auf Kompromisse muss auch sichergestellt sein, dass der Mikrocontroller mit dem Systemtakt betrieben werden kann, den das Endprodukt erfordert. Ein Baustein, der bei Batteriebetrieb nur mit 75% der erwarteten Oszillatorfrequenz arbeiten kann, hat erheblichen Einfluss auf den durchschnittlichen Stromverbrauch in Systemen mit prozessabhängigen Firmware-Komponenten.

Eine MCU, welche die erforderliche Performance bieten soll, ohne die Stromsparanforderungen zu beeinträchtigen, ist die »SiM3Cxx« aus der »Precision32«-Serie von Silicon Laboratories. Der Chip basiert auf einem »ARM Cortex-M3«-Rechenkern und enthält einen Power-Management-Block für hohe Performance bei niedriger Stromaufnahme, einen Kapazität-zu-Digital-Wandler mit 16 Bit Auflösung, serielle Schnittstellen sowie einen Code-/RAM-Befehlssatz, der genug Leistungsspielraum für Erweiterungen und eine Wiederverwendung in zukünftigen Geräte-generationen bieten soll.

Kapazitive Sensorik und Echtzeituhr

Der kapazitive Sensorblock des SiM3Cxx kann eine 16-Bit-Wandlung in weniger als 50 µs a

Da unser Beispiel bei der Taktfrequenz die Genauigkeit eines Quarzes nicht benötigt, kann der Takt des Mikrocontrollers im selbstoszillierenden Modus laufen, der keinen externen Quarzoszillator benötigt. So kann das System den Strom sparen, der sonst zur Anregung und zum Oszillieren eines externen Quarzes erforderlich wäre. Um seinen stromsparendsten Betriebsmodus zu erreichen, verwendet der Prozessorcore des Bausteins den »Power Mode 9« (PM9).

Die Echtzeituhr lässt sich so konfigurieren, dass ein Aufwachen erzwungen wird, sobald der Alarm der Uhr auslöst. Zu Beginn dieses Wake-up-Prozesses muss die Software die MCU zurücksetzen. Dies kann zu einer unnötig langen Ausführungszeit führen, wenn die Firmware sämtliche Hardwareperipherie und Variablen erneut initialisiert. Um Verarbeitungszeit und Strom zu sparen, sollte die Firmware daher die Wake-up-Quelle sofort nach dem Reset überprüfen, um festzustellen, warum der Baustein rückgestellt wurde.

Während einer Wandlung

Auf diese Weise kann die Firmware innerhalb der Initialisierungsroutinen je nach Reset-Quelle unterschiedlich verzweigen und damit Zeit sparen. Falls der Reset durch Einschalten ausgelöst wurde (zum Beispiel nach einem Batteriewechsel), ist eine vollständige Initialisierung erforderlich, um einen definierten Start-up-Systemzustand zu erreichen. Wenn jedoch ein Alarm der Echtzeituhr einen Reset ausgelöst hat, muss die Firmware nur den kapazitiven Sensorblock initialisieren, um die geplanten Umwandlungen auszuführen. Führt die Verarbeitung zu dem Ergebnis, dass der Anwender keine der Tasten betätigt hat, kann der Baustein schnell in den stromsparenden PM9-Zustand übergehen und so eine überflüssige Codeausführung vermeiden.

Bild 3 zeigt das Flussdiagramm für einen PM9-Reset. Da die kapazitive Wandlung zeitabhängig ist, sollte die Firmware versuchen, während der Wandlung in einen Stromsparmodus zu wechseln, um den Energieverbrauch möglichst gering zu halten. Der SiM3Cxx kann die Wandlung durchführen, während sich die CPU im PM3-Zustand (Power Mode 3) befindet. Sobald die Wandlung abgeschlossen ist, beendet der Baustein diesen Zustand automatisch, und die CPU nimmt ihre normale Arbeit wieder auf.

Algorithmen, welche die Robustheit erhöhen und auf die neu gesammelten Daten angewendet werden müssen, sollten mit dem schnellstmöglichen Systemtakt laufen. Damit wird diese prozessabhängige Aufgabe so schnell wie möglich ausgeführt. Der SiM3Cxx lässt sich auch aus dem PM9-Modus aktivieren, wenn ein Übergang an einem digitalen Anschluss erkannt wird - zum Beispiel sobald der IR-Transceiver damit beginnt, Datenbytes über eine serielle Schnittstelle zu übertragen.

Die Port-Match-Funktion kann einen Interrupt-Pin überwachen, der durch die IR-Komponente angesteuert wird. Auch die Überwachung einer der Daten- oder Taktleitungen auf der Schnittstelle ist möglich. Zu beachten ist, dass die serielle Schnittstelle der MCU nicht aktiviert und konfiguriert ist, um Daten sofort nach einem PM9-Wake-up zu empfangen, da der Baustein einen Reset-Zyklus durchlaufen muss. Diese Verzögerung lässt sich durch die oben erwähnte Verzweigungsfunktion während der Initialisierung jedoch verringern.

Serielle Schnittstelle

Die zeit- und prozessabhängigen Teile der IR-Übertragung sollten ähnlich gehandhabt werden wie die Aufgaben im kapazitiven Sensorblock. Wenn möglich sollte das System in einen Stromsparzustand übergehen. Wenn Algorithmen ausgeführt werden müssen, sollte das System die schnellstmögliche Taktfrequenz verwenden.
Low-Power-MCU-Firmware kann aber noch mehr als nur Strom sparen: Der SiM3Cxx kann Code aus dem RAM anstatt aus dem Code-Raum ausführen und im »Power Mode 1« (PM1) verbleiben. Dies spart Strom, da in diesem Modus für die Befehlsausführung keine Flash-Speicherzugriffe erforderlich sind.

Vereint die Firmware diese Funktion mit RAM-Erhalt (dabei behält der RAM-Speicher seinen Zustand über den Reset-Zyklus bei), können sowohl die kapazitive Sensorik als auch die IR-Schnittstelle einen optimal niedrigen Stromverbrauch während der Ausführung erzielen. In unserem Beispiel mit der Fernbedienung können zu wenige oder unregelmäßige Abtastungen der kapazitiven Sensorblöcke zu fehlender Betätigungserkennung und höherer Störanfälligkeit führen.

Wird andererseits die IR-Schnittstelle nicht mit angemessener Geschwindigkeit bedient, können IR-Befehle ignoriert oder falsch interpretiert werden. Die richtige Balance zwischen Performance und Energieverbrauch ist eine Herausforderung. Diese lässt sich durch sorgfältige Planung und Designprinzipien überwinden, die alle Anforderungen erfüllen und einen vernünftigen Stromverbrauch aufweisen.

Über den Autor:

Parker Dorris ist Senior Applications Engineer bei Silicon Laboratories.