Embedded aplikace vyžadují nyní vysokou energetickou účinnost. Všechny moderní mikrokontroléry dnes zahrnují různé funkce pro zajištění úspor energie, které jsou uváděny v jejich technických specifikacích. Cílem tohoto článku je poukázat na to, jak lze v praxi optimalizovat aplikační software s cílem snížení spotřeby. Ukázáno to je na příkladech různých mikrokontrolérů použitých ve stejné aplikaci.
Nízká spotřeba je klíčovým faktorem při prodeji mikrokontrolérů. Katalogové listy jsou plné dat týkajících se několika napájecích režimů a odpovídajících hodnot v μA nebo nA. Ale který mikrokontrolér je pro určitou aplikaci nejlepší a co musí programátor udělat, aby účinně využil režimy nízkého příkonu? Jak má být daná aplikace optimalizována? Na příkladech typických vzorových aplikací jsou ukázána některá zajímavá fakta týkající se úspory energie, která nemohla být odvozena z katalogových listů, ale pouze skutečným měřením.
Existuje několik principiálních závislostí spotřeby energie, které zde budou dále probrány. Závislost spotřeby energie na výkonu je dobře známá. Vyšší výkon znamená vyšší frekvenci a větší spotřebu proudu. Vyšší výkon také vede ke kratším dobám realizace příkazů. Pokud je celková spotřeba důležitá, potom je otázkou, jestli je lepší kratší doba realizace příkazů s vyšším odběrem, nebo naopak. Zde jsou ale obvykle důležitější jiné aspekty.
Vyšší frekvence pochází normálně od PLL, který je také spotřebič energie. Zvýšení frekvence vede normálně k vyššímu proudu, ale pokud je zvýšena pomocí PLL, klesne jeho proud o nezanedbatelnou hodnotu. Z toho vyplývá, že vyšší frekvence vede k menší spotřebě proudu. Nižší frekvence mohou být také odvozeny bez PLL s pomocí interního oscilátoru. I tady platí, že velká část spotřeby proudu může být ušetřena, pokud je frekvence dostatečně vysoká pro daný výkon. Nižší frekvence normálně umožňují použití nižšího napájecího napětí, které se zase odrazí v nižším odběru proudu. Protože výkon je výsledkem napětí a proudu, úspora energie je zhruba dána druhou mocninou rozdílu napětí zdroje.
Pokud může mikrokontrolér „spát“ ve chvíli, kdy není aktivní, potom je důležitý provoz v režimu nízkého příkonu. Celková spotřeba je potom součtem spotřeby v aktivní a neaktivní době. Spotřeba proudu během aktivní doby byla již zmíněna, je to integrál z napětí násobeného proudem přes celou dobu. Spotřeba neaktivní doby závisí na spotřebě proudu během režimu se sníženou spotřebou, kterých bývá dostupných několik. O tom, který z nich má být použit, rozhoduje aplikace. Je nezbytné, aby časovač probudil mikrokontrolér? Potom musí být aktivní, což znamená, že také hodiny a část přerušení nebo buzení musí být aktivní. Je potřeba, aby periférie (např. komunikační) byly připraveny k získání dat? Musí být obsah registru a RAM paměti platný i po probuzení? Jestliže ano, potom CPU a registry musí být napájeny a pravděpodobně prozváněny hodinami, což má velký dopad na spotřebu energie. Některé mikrokontroléry mají sekce napájené baterií včetně RTC a RAM buněk a ty systém probouzí. To umožňuje uložit stav před uspáním, ale nezaručuje to bezpečné uložení dat, pokud tato data nejsou chráněna proti ztrátě nebo napadení.
Všechny tyto otázky mohou být řešeny analýzou spotřeby mikrokontrolérů. Nejlépe analýzou jedné (nebo několika) oblasti napájení, přičemž napětí a proud musí být měřeny současně a rychlostí, která zahrne rychlé změny v mikrokontroléru. Aby bylo možné určit vliv softwaru na spotřebu energie, je potřeba najít návaznost na události v softwaru. Toho lze docílit přepínáním IO vývodů, událostmi zaslanými přes sériový kanál (UART nebo SerialWire Viewer pro Cortex-M) nebo synchronizací se sledovacím zařízením (např. ETM Trace for Cortex-M). Měření proudu je kritické, když jeho rozsah pro nízkoenergetické mikrokontroléry začíná na zlomku μA a jde až do několika set mA. Takový rozsah nemůže být měřen klešťovým ampérmetrem, ale přes rezistor. Pokles napětí na takovém rezistoru by neměl být větší než 100 mV, aby nedošlo ke špatnému fungování mikrokontroléru. V našem případě bylo měření provedeno pohodlně systémem PowerScale a s ACMProbes.
Tři mikrokontroléry Cortex-M byly naprogramovány na stejnou měřicí úlohu, přičemž software byl optimalizován s ohledem na spotřebu proudu. Mikrokontroléry byly od firem Energy Micro (EFM32), NXP ( LPC1200) a STMicroelectronics (STM32L). Úlohou bylo měřit data s ADC v daném rozlišení a časovém intervalu. Data musela být vypočítána (průměr, součet) a uložena v nevolatilní paměti. Potom se měl mikrokontrolér uložit ke spánku a později po uplynutí určité doby se sám probudit.
Nejdříve jsme chtěli zjistit, který režim spánku je nejlepší, přičemž požadavkem bylo, aby se mikrokontrolér mohl sám probudit. Zde jsou některé rozdíly mezi použitými součástkami a jejich nastavením.
Pro EFM32 jsme použili režim spánku EM2, při kterém se ještě mikrokontrolér probudí pomocí RTC. Vysokofrekvenční oscilátor byl vypnutý, zatímco nízkofrekvenční byl aktivní, protože udržoval v chodu periférie jako RTC. Obsah RAM paměti a registru byl platný i po probuzení, takže nebylo potřeba nové inicializace, což ušetřilo čas.
Pro STM32L představoval nejnižší režim spánku režim standby, RTC bylo i nadále aktivní a mohlo mikrokontrolér probudit. Obsah RAM paměti a registru byl po probuzení neplatný, takže aplikace se musela znovu inicializovat, což způsobilo časovou ztrátu.
Dosti podobná situace byla s mikrokontrolérem LPC1200. Nejhlubším režimem byl režim hlubokého spánku, přičemž RTC mohl mikrokontrolér probudit. Také tady bylo nutné provést reset inicializace.
Pokud není správné uchování dat příliš důležité, mohou být uložena v RAM paměti EFM32 nebo v záložních registrech s vyrovnávací pamětí pro STM a LPC. My jsme se rozhodli je mít v nevolatilní paměti, což je EEPROM pro STM32 a interní FLASH pro EFM32 a STM.
Měření s PowerScale ukázalo, že vymazání FLASH nebo EEPROM je energeticky náročnější než vlastní zápis do paměti. Největší spotřeba byla při použití FLASH paměti a vymazání a přeprogramování stejných míst paměti pro uložení proměnných. Lepší bylo použití EEPROM paměti z STM32. Nejlepší výsledek dávalo použití EEPROM simulace pro FLASH. Pro EFM32 mikrokontrolér byl použit simulační software dodávaný firmou Energy Micro.
V takovém případě muselo být vymazání FLASH paměti provedeno pouze v každém 42. cyklu. Obr. 1 ukazuje rozdíl mezi cykly pro zápis a mazání. V této aplikaci měl správný způsob uložení dat největší dopad na spotřebu energie.
Velmi důležitá byla optimalizace použití ADC, který byl zapnutý pouze ve chvíli, když byl používán. ADC určuje minimální frekvenci. Vyžadovaná přesnost byla 10 bit, ale STM32 má ADC s rozlišením 12 bitů. Měření ukázalo, že snížení rozlišení nepřineslo nižší spotřebu (obr. 2), takže jsme nechali rozlišení nastaveno na 12 bitů. K ušetření energie nebyly pro konverzi použity volby ADC, ale přerušení. Velmi překvapující bylo zjištění vlivu optimalizace překladače, jak je vidět na obr. 3, kdy nízká optimalizace přináší nejlepší výsledky s ohledem na spotřebu.
Výběr vhodného mikrokontroléru nemůže být proveden bez nastudování údajů v katalogovém listu. Je závislý na mnoha požadavcích a detailech aplikace. V popsaném případě měl největší dopad na spotřebu způsob uložení dat. Poté, co je mikrokontrolér vybrán, musí být optimalizace zaměřená na nízkou spotřebu provedena experimentálně a s nástroji, které jsou schopny měřit napětí a proudy ve vztahu k práci aplikace.