Ograniczanie zużycia energii w systemach mikroprocesorowych

| Technika

Postępujący wzrost popularności technologii IoT wiąże się z koniecznością opracowania oraz rozmieszczenia w środowisku ogromnej liczby autonomicznych modułów zdolnych do kontroli niemal każdego aspektu naszego życia. Tego typu urządzenia będą w coraz większym stopniu determinować sposób, w jaki komunikujemy się z otoczeniem i wpływamy na środowisko zewnętrzne, znacznie ułatwiając przy tym nasze codzienne funkcjonowanie. Jednym z ważniejszych czynników wpływających na efektywność tych układów jest energooszczędność, przekładająca się na czas pracy przy zasilaniu bateryjnym.

Ograniczanie zużycia energii w systemach mikroprocesorowych

Autonomiczne moduły IoT muszą charakteryzować się bardzo długim czasem pracy oraz zdolnością autonomicznego funkcjonowania bez konieczności wykonywania jakichkolwiek dodatkowych czynności obsługowych (cechy te określa się często jako "always on" oraz "deploy and forget", czyli "zawsze włączone" oraz "rozmieść i zapomnij"). Wymaga się od nich ciągłego monitorowania stanu otoczenia oraz błyskawicznej reakcji na wszelkie jego zmiany. W dodatku układy te są zazwyczaj zasilane bateryjnie, przez co mają bardzo ograniczony budżet energetyczny.

Konieczność bardzo długiej pracy przy zasilaniu baterią o niewielkiej pojemności powoduje, że moduły IoT muszą działać w sposób maksymalnie energooszczędny. Jeśli tylko istnieje taka możliwość, należy starać się wykorzystać zdolność do pobierania energii ze źródeł zewnętrznych, czyli energy harvesting. Dodatkowo, projektanci tego typu urządzeń muszą przykładać szczególną wagę do doboru komponentów, kierując się przy tym kryterium minimalizacji zapotrzebowania systemu na energię elektryczną.

Praca w trybie "almost always off"

Z punktu widzenia użytkownika autonomiczny moduł IoT powinien być zawsze włączony oraz gotowy do działania (always on). Te oczekiwania stoją jednak w sprzeczności z wymogami bardzo wysokiej energooszczędności. W rzeczywistości urządzenie musi jedynie stworzyć użytkownikowi wrażenie nieustannego działania, jednocześnie znajdując się przez większość czasu w stanie możliwie najbardziej obniżonego poboru energii. Taki tryb pracy określa się jako "almost always off", czyli "prawie zawsze wyłączony".

Stopień i sposób ograniczenia zużycia energii zależy przede wszystkim od rodzaju zadań wykonywanych przez urządzenie. Każdy autonomiczny moduł IoT jest systemem mikroprocesorowym, który składa się z wielu układów półprzewodnikowych realizujących odmienne funkcje. Główne elementy tego typu systemu to zazwyczaj czujniki, pozwalające gromadzić informacje o otoczeniu (np. temperaturę lub wilgotność) oraz umożliwiające interakcję z użytkownikiem (np. poprzez interfejs dotykowy), interfejsy komunikacyjne (najczęściej bezprzewodowe), urządzenia wyjściowe (np. wyświetlacz lub głośnik) oraz mikroprocesor sterujący.

W przypadku każdego modułu IoT konieczne jest precyzyjne określenie sposobu jego działania oraz zdefiniowanie krytycznych wymagań, określających zachowanie poszczególnych elementów systemu. Przykładowo, ekran dotykowy musi błyskawicznie odpowiadać na dotyk użytkownika, zaś komunikacja radiowa musi odbywać się z zachowaniem precyzyjnie określonych w specyfikacji protokołu wymogów czasowych.

Podobnie jest w przypadku czujników - układ do pomiaru tętna musi zarejestrować wszystkie kolejne uderzenia serca. Głównym zadaniem każdego urządzenia jest ciągłe zapewnienie użytkownikowi (oraz innym modułom komunikującym się z urządzeniem) określonej funkcjonalności przez możliwie jak najdłuższy okres. Minimalizując zużycie energii, należy zawsze mieć na uwadze ograniczenia wynikające z konieczności zachowania wysokiej funkcjonalności układu.

Ograniczanie zużycia energii poprzez duty-cycling

Rys. 1. Profil energetyczny urządzenia pozwala oszacować pobór prądu zasilania w funkcji czasu

Rzeczywistą wartość zużycia energii przez elementy wchodzące w skład systemu mikroprocesorowego kształtują w głównej mierze dwa czynniki - ilość energii zużywanej przez te układy w stanie aktywnym oraz częstotliwość ich włączania, która zależy przede wszystkim od przeznaczenia urządzenia. Przykładowo, minimalna częstotliwość próbkowania dla układu mierzącego tętno musi wynosić przynajmniej 50 Hz, zaś urządzenie sterujące klimatyzacją może dokonywać odczytu wartości temperatury w pomieszczeniu nie częściej niż raz na sekundę. W przypadku czujników częstość ich włączania (częstotliwości pomiaru) zależy przede wszystkim od dynamiki zmian mierzonej wartości - temperatura w pomieszczeniu zmienia się zdecydowanie wolniej niż ludzki puls.

Znaczące ograniczenie zużycia energii przez wchodzące w skład systemu układy można również osiągnąć poprzez odpowiednie zarządzanie cyklem pracy poszczególnych elementów urządzenia, tzw. duty-cycling. Każdy układ powinien być aktywny jedynie wtedy, gdy jest potrzebny do prawidłowej pracy całego systemu.

Tego typu podejście można przedstawić na przykładzie zegarka smartwatch. Urządzenie to składa się z wielu różnych sensorów, z których większość może pozostawać wyłączona, dopóki nie zostanie wykryta aktywność fizyczna użytkownika. Do detekcji tej aktywności konieczne jest wykorzystanie akcelerometru, który jednak może być próbkowany z niewielką częstotliwością (np. raz na sekundę). Po wykryciu odpowiedniego zdarzenia procesor uruchamia pozostałe czujniki, umożliwiając np. pomiar tętna lub precyzyjną ocenę poziomu aktywności, zaś po ustaniu aktywności ponownie wyłącza niepotrzebne sensory i przechodzi w stan czuwania.

Tabela 1. Profil energetyczny urządzenia pozwala oszacować pobór prądu zasilania w czasie

Precyzyjne zdefiniowanie czasu pracy poszczególnych elementów systemu pozwala podzielić pracę urządzenia na etapy charakteryzujące się różnym poziomem poboru prądu zasilania. Przykład takiego podziału dla czujnika komunikującego się z siecią bezprzewodową przedstawiono w tabeli 1. Określenie zależności czasowych pomiędzy poszczególnymi etapami umożliwia wykreślenie profilu energetycznego urządzenia, co pokazano na rysunku 1.

Taki wykres ułatwia szacowanie całkowitego zużycia energii, wskazuje również najbardziej energochłonne zadania realizowane przez system. Jeśli przyjmiemy, że w przedstawionym przykładzie pobór prądu zasilania w trybie uśpienia wyniesie 2 µA, a czas jednego pełnego cyklu pracy to 1 s, średni pobór prądu zasilania przez urządzenie wyniesie:

(0,5·0,1 + 3·2 + 2·1 + 15 + 1) mA/1000 s + 2 µA = 26,5 µA.

Jeśli urządzenie będzie aktywować się rzadziej, np. raz na 20 sekund, jego parametry energetyczne znacznie się poprawią:

(0,5·0,1 + 3·2 + 2·1 + 15 + 1) mA/20000 s + 2 µA = 3,22 µA.

Zarządzanie pracą mikroprocesora

Rys. 2. Mikrokontroler sterujący (MCU) jest centralnym elementem systemu, zarządzającym pracą wszystkich innych układów

Ograniczenie do niezbędnego minimum czasu aktywności poszczególnych elementów pozwala znacząco zmniejszyć zużycie energii przez system. W skład każdego modułu IoT wchodzi jednak jeden układ, który praktycznie nigdy nie może zostać całkowicie wyłączony - jest to mikrokontroler sterujący pracą urządzenia. Jak pokazano na rysunku 2, element ten stanowi centralną część systemu, odpowiedzialną za zarządzanie stanem wszystkich innych układów.

Mikroprocesor ma zazwyczaj kilka trybów pracy, które charakteryzują się różnym poziomem pobieranej mocy zasilania. Choć niemożliwe jest całkowite wyłączenie tego układu, umiejętne korzystanie z energooszczędnych trybów pracy pozwala znacznie ograniczyć czerpany z baterii prąd.

Różnica między prądem zasilania pobieranym przez mikroprocesor w trybach wysokiej wydajności i głębokiego uśpienia może wynosić kilka rzędów wielkości - od dziesiątek miliamperów do pojedynczych mikroamperów. Programując mikrokontroler, warto zatem dążyć do tego, by maksymalnie wydłużyć czas przebywania tego układu w stanie głębokiego uśpienia.

Rys. 3. Jeśli praca mikroprocesora nie zostanie zoptymalizowana pod względem zużycia energii, będzie on przez cały czas przebywał w trybie wysokiej wydajności, co znacząco zmniejszy czas działania całego urządzenia przy zasilaniu bateryjnym

Pozostając przy przykładzie zegarka smartwatch, można przyjąć, że przeciętna pojemność baterii w tego typu urządzeniu to ok. 200 mAh. Jeśli praca mikrokontrolera nie zostanie poddana żadnej optymalizacji ze względu na pobór energii zasilania, prąd zasilania pobierany przez ten układ będzie zbliżony do przebiegu przedstawionego na rysunku 3 - jego średnia wartość wyniesie ok. 10 mA. Bateria umieszczona w urządzeniu wystarczy zatem na zasilanie samego tylko procesora przez nie więcej niż 20 godzin. Po uwzględnieniu energii pobieranej przez inne elementy systemu okazałoby się, że czas pracy tego modułu będzie jeszcze krótszy.

Znaczącą poprawę energooszczędności przyniesie podział pracy mikroprocesora na dwa tryby - tryb aktywności, w którym rdzeń procesora jest włączony i wykonuje konieczne obliczenia oraz tryb głębokiego uśpienia, polegający na wyłączeniu taktowania rdzenia oraz większości układów peryferyjnych. Dostępne na rynku mikroprocesory w stanie uśpienia potrafią pobierać prąd o wartości poniżej jednego mikroampera.

Rys. 4. Przełączanie pomiędzy trybami pracy procesora pozwala w prosty sposób poprawić energooszczędność całego systemu. Czas pracy w trybie uśpienia jest ograniczany przez zakres czynności, które mogą być wykonywane przez mikroprocesor znajdujący się w tym stanie

Jeśli uda się tak zaplanować działanie procesora, by okres wysokiej aktywności zajmował ok. 1% czasu pracy urządzenia, średnia wartość prądu zasilania pobieranego przez ten układ wyniesie ok. 100 µA, tak jak pokazano na rysunku 4. Pozwoli to wydłużyć maksymalny czas pracy urządzenia z 20 godzin do 8 dni.

Chcąc poprawić energooszczędność mikroprocesora, powinno się dążyć do tego, by maksymalnie wydłużyć czas pozostawania w stanie uśpienia kosztem pracy w trybie wysokiej wydajności. Wybudzanie mikroprocesora, które z punktu widzenia energooszczędności jest zdarzeniem niekorzystnym, będzie musiało następować za każdym razem, gdy układ zostanie zmuszony do wykonania czynności, której nie jest w stanie obsłużyć w trybie obniżonego poboru energii.

Wielu producentów posiada w swojej ofercie mikroprocesory low-power projektowane z myślą o aplikacjach energooszczędnych - układy te charakteryzują się możliwością wykonywania wielu różnych czynności w trybie obniżonego poboru energii (np. poprzez włączanie taktowania wybranych układów peryferyjnych), co w wielu przypadkach może pozwolić uniknąć konieczności całkowitego wybudzania procesora.

Rys. 5. Pozostawanie procesora przez przeważającą większość czasu swojej pracy w trybie głębokiego uśpienia jest najkorzystniejszym rozwiązaniem z punktu widzenia żywotności systemu zasilanego bateryjnie

Wykorzystanie funkcji oferowanych przez mikrokontrolery ultra-low-power może znacząco wydłużyć okres przebywania w stanie uśpienia, prawie całkowicie eliminując potrzebę pełnego wybudzania układu. Przykład tego typu sytuacji przedstawiono na rysunku 5.

Ograniczenie średniej wartości prądu zasilania pobieranego przez mikrokontroler do poziomu ok. 1 µA powoduje wydłużenie maksymalnego czasu pracy urządzenia do ok. 20 lat.

W praktyce czas ten będzie jednak znacznie krótszy ze względu na konieczność zasilania innych elementów wchodzących w skład systemu.

Szacowanie całkowitej mocy zasilania wykorzystywanej przez procesor

Rys. 6. W celu oszacowania całkowitej mocy pobieranej przez mikroprocesor należy uwzględnić trzy czynniki - moc pobieraną podczas uśpienia, moc pobieraną w trybie wysokiej wydajności oraz moc traconą na wybudzanie z trybu uśpienia

Należy mieć świadomość, że do oszacowania całkowitej mocy zasilania pobieranej przez mikroprocesor nie wystarczy znajomość wartości mocy pobieranych w trybie uśpienia oraz aktywności. Jak pokazano na rysunku 6, każdy procesor potrzebuje pewnego czasu na wybudzenie, czyli przejście ze stanu uśpienia do trybu wysokiej wydajności. Z procesem tym wiążą się dwa parametry: czas wybudzania oraz potrzebna do tego średnia moc zasilania.

Podczas wybudzania rdzeń procesora nie jest jeszcze w stanie wykonywać żadnych użytecznych czynności, moc zasilania wykorzystywana podczas tego procesu może być zatem traktowana jako moc tracona. Długi czas wybudzania może powodować opóźnienia w działaniu procesora, gdyż pogarsza zdolność układu do szybkiego reagowania na zdarzenia będące powodem przebudzenia.

ULPBench - porównanie wydajności energetycznej różnych mikrokontrolerów

Rys. 7. Test ULPBench ułatwia porównanie energooszczędności różnych procesorów

W katalogach różnych producentów znaleźć można coraz więcej mikrokontrolerów przystosowanych do pracy w trybach ultra-low-power, czyli przy znacznie obniżonym poborze energii zasilania. Kluczowym zagadnieniem przy optymalizacji pracy procesora ze względu na energooszczędność jest jednak przede wszystkim sposób wykorzystania oferowanych przez mikrokontroler trybów pracy.

Nawet jeśli w specyfikacji układu podana jest bardzo niska wartość prądu zasilania pobieranego w trybie głębokiego uśpienia, element taki może okazać się niezbyt przydatny w przypadku aplikacji wymagającej częstego i długiego przebywania w trybie wysokiej aktywności.

Nie opracowano jeszcze uniwersalnego narzędzia, które pozwoliłoby w prosty sposób porównać wydajność energetyczną poszczególnych mikrokontrolerów w określonej aplikacji. Zwykłe porównanie parametrów i charakterystyk zawartych w dokumentacji technicznej okazuje się zazwyczaj mało pomocne, gdyż nie uwzględnia wielu czynników związanych ze specyfiką pracy konkretnego urządzenia.

Potrzebę stworzenia mechanizmu pozwalającego na obiektywną ocenę rzeczywistej energooszczędności poszczególnych mikrokontrolerów dostrzegły niektóre z niezależnych organizacji zajmujących się tematyką testowania procesorów, m.in. EEMBC (Embedded Microprocessor Benchmark Consortium). Opracowywany przez tę grupę test ULPBench obecnie (na etapie Phase 1) koncentruje się przede wszystkim na ocenie mocy pobieranej przez układ w trybie wysokiej wydajności oraz w stanie uśpienia, w którym aktywny jest jedynie układ zegara czasu rzeczywistego (RTC - Real-Time Clock). W rzeczywistych zastosowaniach procesor może korzystać w trybie uśpienia ze znacznie większej liczby układów peryferyjnych - planuje się uwzględnić taką możliwość na kolejnym etapie rozwoju (Phase 2) testu ULPBench.

Możliwości mikroprocesorów ultra-low-power

Tabela 2. Przykład różnych trybów oszczędzania energii wymienionych w nocie dokumentacyjnej jednego z mikroprocesorów wraz z podawanym przez producenta poborem prądu zasilania (dane dla układu SAM4L)

Znaczna część mikrokontrolerów wykorzystywanych w modułach IoT oparta jest na architekturze ARM Cortex-M występującej w różnych wersjach - od Cortex-M0+, przeznaczonej przede wszystkim do prostych zastosowań, aż do Cortex M-4, która doskonale radzi sobie w przypadku skomplikowanych aplikacji, wymagających szybkich obliczeń (również zmiennoprzecinkowych) oraz korzystania z algorytmów cyfrowego przetwarzania sygnałów.

Architektura dostarczana przez ARM stanowi jednak dla producentów procesorów jedynie punkt startowy, określający pewne istotne kwestie związane z funkcjonowaniem układu. Poziom energooszczędności układu jest jednak w głównej mierze zależny od dodatkowych rozwiązań przyjętych przez producenta, takich jak np. technologia wykonania układu czy możliwość korzystania w stanie uśpienia z układów peryferyjnych. Mikroprocesory określane jako low-power (a nawet ultra-low-power) mają zazwyczaj wiele dodatkowych funkcjonalności ułatwiających optymalne zarządzanie zużyciem energii przez układ.

Wspomniana organizacja EEMBC zwraca uwagę (co znajduje zresztą odzwierciedlenie w założeniach kolejnej wersji testu ULPBench), że jednym z warunków ograniczenia zużycia energii przez procesor jest odpowiednie wykorzystanie jego układów peryferyjnych. W przypadku znacznej większości urządzeń istnieją procesy i czynności, które muszą być obsługiwane przez cały czas, zazwyczaj z określoną regularnością.

Przykładowo, dla interfejsu dotykowego może być to konieczność błyskawicznej reakcji na zbliżenie palca do powierzchni ekranu, zaś dla termostatu konieczność cyklicznego pomiaru temperatury. By osiągnąć jak najmniejszy pobór energii zasilania przez urządzenie, niezbędne jest ograniczenie energii konsumowanej zarówno przez czujniki (poprzez wspomniany duty-cycling, czyli włączanie ich zasilana tylko wtedy, gdy są rzeczywiście niezbędne), jak i przez sam mikroprocesor.

Najłatwiejszym sposobem ograniczenia zużycia energii przez procesor jest pozostawienie go w stanie głębokiego uśpienia - wymagane czynności wykonywane są przez wybrane układy peryferyjne, zaś sam rdzeń i pozostałe podsystemy pozostają wyłączone.

Stan uśpienia typowego procesora może obejmować wyłączenie rdzenia, pamięci, sygnałów zegarowych oraz układów peryferyjnych. Wyłączenie większej liczby elementów ogranicza zużycie energii, powoduje jednak wydłużenie czasu potrzebnego na przebudzenie układu. Wyłączenie samego rdzenia procesora wystarczy, by zmniejszyć pobór prądu zasilania do wartości mniejszych od 1 mA, pozwala również na bardzo szybkie przejście do stanu aktywności.

Zachowane zostają funkcjonalności związane z układami peryferyjnymi, jeśli tylko są one w stanie funkcjonować samodzielnie. Do podtrzymania działania tych układów przydaje się mechanizm DMA, który umożliwia zapis i odczyt określonych wcześniej adresów pamięci.

Dalsze ograniczenie zużycia energii przez procesor może przynieść wyłączenie taktowania niepotrzebnych peryferii. Procesory ultra-low-power potrafią pobierać w stanie głębokiego uśpienia prąd zasilania o wartości mniejszej niż 1 µA. Konfiguracja trybu uśpienia procesora powinna stanowić kompromis pomiędzy energooszczędnością a koniecznością realizacji określonych zadań.

Przy wyborze procesora warto zwrócić uwagę na to, czy dany model umożliwia realizację odpowiednich typów funkcjonalności w trybie głębokiego uśpienia. Brak takiej możliwości spowoduje konieczność częstszego przebudzania i dłuższego przebywania w trybie aktywności, co negatywnie odbije się na energooszczędności całego urządzenia.

Układ Brown-Out Detection

Niektóre funkcje mikrokontrolera, mimo że nie wpływają bezpośrednio na realizację wymaganych przez aplikację rodzajów funkcjonalności, powinny być zawsze włączone. Szczególnie wartym uwagi przypadkiem tego typu jest układ nadzorujący poziom napięcia zasilania (BOD, czyli Brown-Out Detection). Jeśli układ BOD wykryje, że napięcie zasilania jest niższe od określonego poziomu, wykonuje reset procesora.

Właściwe działanie tego układu jest warunkiem koniecznym do zachowania pewności poprawnej pracy mikroprocesora, oprócz tego pozwala na jego bezpieczne wyłączenie w przypadku zaniku zasilania. Brak reakcji na spadek napięcia zasilania mógłby prowadzić do niewłaściwego i nieprzewidywalnego zachowania mikrokontrolera.

W przypadku korzystania z zasilania bateryjnego wystąpienie takich problemów jest bardzo prawdopodobne, podobna sytuacja może przytrafić się również urządzeniom zasilanym sieciowo. Prawidłowo funkcjonujący układ BOD pozwala mieć pewność, że działanie mikrokontrolera będzie zawsze przewidywalne i dobrze określone, również w przypadku problemów ze stabilnością źródła zasilania.

Ważne jest, by podczas szacowania całkowitego zużycia energii przez mikroprocesor brać pod uwagę zużycie energii przez BOD. Producenci podając pobór prądu zasilania w różnych trybach pracy, nie zawsze uwzględniają działanie tego układu.

Energooszczędność a proces technologiczny

Producent mikrokontrolerów może, jak już wspomniano, wdrożyć różne zabiegi pozwalające poprawić energooszczędność układu. Przykładowo, rozbudowana pamięć podręczna procesora pozwala ograniczyć konieczność dostępu do pamięci Flash, co powoduje oszczędność nie tylko czasu, ale i energii, zaś wbudowany przetwornik DC-DC umożliwia skuteczniejsze wykorzystanie źródeł o wyższym napięciu zasilania, jak np. baterie LiPo.

Ważnym czynnikiem wpływającym na właściwości energetyczne procesora jest proces technologiczny, w którym układ został wykonany. Im mniejszy rozmiar charakterystyczny tego procesu, tym mniej energii zużywa proces w stanie aktywności, lecz jednocześnie w związku ze wzrostem wartości prądów upływu rośnie zużycie energii w trybie uśpienia. Układ wykonany w technologii 40 nm będzie potrzebował podczas aktywnej pracy prądu zasilania o znacznie niższej wartości niż układ w technologii 90 nm. Jednocześnie będzie jednak cechował się wyższym poborem prądu zasilania w stanie uśpienia.

Podsumowanie

W okresie gwałtownego rozwoju technologii IoT energooszczędność jest jednym z głównych wymagań stawianych projektantom tego typu urządzeń. Mózgiem i centralnym elementem każdego autonomicznego modułu IoT jest mikrokontroler sterujący jego pracą. Ograniczenie zużycia energii przez ten układ jest kluczem do osiągnięcia wysokiej wydajności energetycznej całego urządzenia. Efekt ten można osiągnąć poprzez umiejętne wykorzystanie różnych trybów pracy dostępnych we współczesnych mikroprocesorach - od stanu głębokiego uśpienia, poprzez pośrednie stany ograniczonego zużycia energii, aż do trybu wysokiej wydajności.

Spore problemy mogą pojawić się już na etapie wyboru najodpowiedniejszego modelu mikroprocesora. Samo porównanie parametrów umieszczonych w dokumentacji układów może okazać się niewystarczające do podjęcia prawidłowej decyzji. Pomocne może okazać się skorzystanie z wyników niezależnych testów, takich jak ULPBench.

Opracowany przez EEMBC benchmark jest jeszcze na etapie rozwoju, lecz docelowo zakłada się, że będzie w stanie dokonać kompleksowej oceny energooszczędności całego układu. Do czasu opracowania kolejnej wersji tego testu najpewniejszym, choć również najbardziej kłopotliwym sposobem oceny zużycia energii przez procesor, wciąż pozostaje samodzielne przeprowadzanie rzeczywistych pomiarów.

Damian Tomaszewski