Oszczędzanie energii w teorii i w praktyce (2)

Oszczędzanie energii w teorii i w praktyce (2)

W poprzedniej części opracowania skupiliśmy się na obliczaniu zapotrzebowania na energię i omówiliśmy najprostsze w użyciu źródła energii: baterie oraz akumulatory. Tym razem przyjrzymy się bliżej jednemu z kluczowych komponentów, który z łatwością pozwala zaoszczędzić na poborze mocy – mowa oczywiście o mikrokontrolerze.

W większości projektów najważniejszym komponentem jest mikrokontroler – i to jego można postrzegać jako głównego „prądożercę”. Na szczęście doskonale wiedzą o tym też producenci półprzewodników, dlatego od lat walczą o klienta, oferując coraz większą wydajność, coraz sprytniejsze peryferia czy też coraz mniejsze zapotrzebowanie na energię. Łatwo się w tym gąszczu ofert pogubić, a do tego noty katalogowe i strony produktów zawsze prezentują parametry danego komponentu zmierzone w najbardziej optymistycznych warunkach. Warto ponadto zastanowić się, czy lepiej byłoby wykonywać program z wolniejszym, aczkolwiek oszczędniejszym zegarem, czy jednak zwiększyć częstotliwość kosztem poboru prądu, aby szybciej skończyć zadanie i uśpić układ na dłużej. Na potrzeby porównania przyjmiemy kilka prostych założeń:

  • program jest wykonywany raz na sekundę, a jego wykonanie zajmuje 2000 cykli programu;
  • raz na sekundę wykonywany jest pomiar za pomocą ADC, w czasie którego mikrokontroler pozostaje uśpiony;
  • do cyklicznego rozpoczynania egzekucji programu stosowany jest timer watchdog.

W ramach porównania wyliczony będzie średni pobór prądu przy napięciu zasilania 3 V lub 3,3 V (zależnie od tego, które dane są dostępne w notach) i dla różnych częstotliwości zegarowych dostępnych bez użycia zewnętrznego rezonatora. Ponieważ najwięcej doświadczenia mam z mikrokontrolerami firmy Microchip, właśnie one zostały wybrane do tych rozważań. Pobieżny przegląd not katalogowych procesorów różnych innych rodzin oraz producentów wskazuje na to, że nie ma między nimi dramatycznych różnic i w każdej rodzinie układów można znaleźć kilka dobrych alternatyw.

Microchip PIC, dsPIC/PIC24 i PIC32

Microchip od lat rozwija własną technologię XLP, nazywaną też nanoWatt. Sam spotkałem się z nią po raz pierwszy ponad dekadę temu, gdy zacząłem uczyć się programowania na układzie PIC18F45K50. Od tamtej pory zaobserwowałem spory postęp. Na przedstawiciela ośmiobitowych PICów wybrany został PIC18F27Q10, jeden z nowszych produktów z tej kategorii w ofercie Microchipa. Mikrokontroler ten oferuje bogaty zestaw rozbudowanych peryferiów, zapewniając przy tym dużą energooszczędność – nieużywane peryferia są wyłączone i nie pobierają prądu. W ramach oszczędności energii układ oferuje też rozbudowany system zegarowy oraz możliwość częściowego lub całkowitego uśpienia CPU. Producent chwali się również bardzo niskim poborem prądu: 900 nA przy 1,8 V w stanie uśpienia z aktywnym watchdogiem.

Posługując się notą katalogową, możemy policzyć średni pobór prądu przy dwóch ustawieniach zegara: LFINTOSC 31 kHz i HFINTOSC 4 MHz. Wartości poboru prądu dla obu częstotliwości trzeba odczytać z wykresów, co obarczone jest pewnym błędem. Dla LFINTOSC można przyjąć pobór 2,7 μA przy 3 V, a dla HFINTOSC będzie to już 500 μA przy 4 MHz. ADC w trakcie konwersji – gdy rdzeń pozostaje nieaktywny – pobiera 330 μA, a CPU w stanie uśpienia potrzebuje tylko 1,5 μA, wliczając w to zasilanie watchdoga. Poza poborem prądu musimy też znać czas wykonywania kodu i czas trwania konwersji ADC.

Przetwornik analogowo-cyfrowy potrzebuje 11TAD + 3TCY. TAD to czas jednego cyklu konwersji, w tym wypadku będzie to okres wewnętrznego oscylatora ADC, wynoszący typowo 2,2 μs. TCY jest natomiast czasem trwania jednej instrukcji, w przypadku LFINTOSC wynosi on 129 μs, a przy 4 MHz sięga 1 μs. Te liczby wynikają z faktu, że jedna instrukcja wykonuje się przez cztery cykle zegarowe. Musimy też doliczyć czas startu oscylatora HFINTOSC: 100 μs. Tabela 1 zawiera wyliczone czasy i pobór prądu na poszczególnych etapach pracy układu oraz uśrednione wartości natężenia prądu. Przy obliczaniu prądu uwzględniono też fakt, że zużycie go przez różne komponenty sumuje się, gdyż LFINTOSC nigdy się nie zatrzymuje (taktuje bowiem blok watchdog) i oba są używane przez ADC zależnie od ustawionej częstotliwości pracy. Średni pobór został wyliczony metodą pokazaną w poprzedniej części artykułu.

Jak widać, z wolniejszym zegarem można zaoszczędzić 28,7% energii tylko na średnim poborze prądu. To całkiem sporo, choć same wartości liczbowe wydają się znikome.

Spójrzmy teraz na układy 16-bitowe serii PIC24/dsPIC. Tutaj sytuacja nieco bardziej się komplikuje ze względu na fakt, w jak wielu spośród tych układów zdarzają się różne błędy w krzemie, czasami wpływające też na pobór prądu. Na przedstawiciela układów 16-bitowych wybrany został PIC24FJ128GC010.

Układy z tej rodziny łączą w sobie rozbudowane peryferia analogowe z wieloma możliwościami oszczędzania energii. Dodatkowo Michrochip dodał sprzętową obsługę wyświetlaczy LCD, interfejs USB i dość szybkie CPU (16 MIPS) z hardware’ową realizacją mnożenia i dzielenia w jednym cyklu. Z naszego punktu widzenia użyteczną funkcją może być bateryjne podtrzymywanie pamięci oraz modułu RTCC. Tabela 2, ukazuje średni pobór prądu w przypadku naszego przykładowego programu korzystającego zegarów 31 kHz i 2 MHz przy napięciu zasilania 3,3 V.

W opisanym przykładzie to szybszy zegar prowadzi, a różnica wynosi 19,4%. Co ważne, im dłuższy program – przy tych samych zegarach – tym bardziej zaobserwowana przewaga będzie wzrastać.

W przypadku PIC32 mamy o tyle ciekawą sytuację, że przez lata Microchip używał architektury MIPS32 – ale po akwizycji firmy Atmel przez wspomnianego producenta do jego oferty dołączyły mikrokontrolery serii SAM, a potem PIC32 z rdzeniami ARM Cortex-M23 o niższym poborze prądu. Na reprezentanta układów 32-bitowych został jednak wybrany mikrokontroler z rdzeniem MIPS32 microAptiv, PIC32MM0256GPM036. Nie jest to ani najbardziej rozbudowany mikrokontroler z całej rodziny MIPS32, ani też najszybszy – za to na pewno energooszczędny. Tabela 3 pokazuje wyniki pomiaru prądu przy napięciu zasilania 3,3 V.

Tym razem różnica okazuje się dramatyczna – użycie szybszego zegara zmniejsza średni pobór prądu 3,9 razy! Nadal jednak pobór prądu pozostaje znaczny, zwłaszcza gdy porównamy go z układami 8- i 16-bitowymi. PIC32MM0256GPM036 w naszym przykładzie pobiera 4 razy więcej energii niż PIC18F27Q10. Czytelnik może zatem zadać sobie pytanie, na co komu więcej bitów, skoro ośmiobitowiec wygrywa pod względem oszczędności energii? Odpowiedź jest prosta: wszystko zależy od założeń projektowych i programistycznych.

Więcej mocy!

W naszym przykładzie program był prosty i rzadko wykonywany. Sytuacja zmienia się wtedy, gdy wymaga on na przykład zaawansowanych obliczeń matematycznych. Programowe mnożenie i dzielenie dwóch zmiennych to relatywnie powolny proces, jeśli mikrokontroler nie zapewnia mu wsparcia sprzętowego. Nawet operacja dodawania lub odejmowania może zająć sporo cykli, gdy wykonujemy ją na liczbach 32- lub 64-bitowych, a ALU jest ośmiobitowe. W przypadku prostych programów nie stanowi to dużego problemu, jeśli jednak kod wymaga wielu różnych operacji na dużych liczbach, na przykład do przetwarzania danych o zmianach położenia i prędkości, to osiem bitów nie wystarczy.

Ale nie tylko do obliczeń przyda się szybszy i wydajniejszy układ. Niech program będzie 5 razy dłuższy – wówczas ośmiobitowy mikrokontroler z zegarem LFINOSC nie nadąży z wykonywaniem kodu. Mikrokontroler 16-bitowy z zegarem LPRC spędzi 64% czasu na wykonywaniu programu, natomiast układ MIPS32 będzie potrzebował tylko 32% czasu, dzięki zoptymalizowanej egzekucji instrukcji. W przypadku mikrokontrolera 8-bitowego nie ma wyboru – trzeba użyć szybszego zegara. Dla 16-bitowego PIC24FJ128GC010 to też będzie lepszy wybór – i to nawet oszczędniejszy niż dla PIC18F27Q10, gdyż ten drugi potrzebuje aż 22,2% więcej energii na jego wykonanie w tej samej jednostce czasu.

W naszym przykładzie wykonywaliśmy jeden pomiar ADC – a jeśli musimy wykonać ich dziesiątki, setki czy tysiące na sekundę? Albo użyć równolegle wielu różnych peryferiów? Wtedy przydać się może układ DMA – niewystępujący zbyt często w ośmiobitowcach, za to powszechnie dostępny w układach 16- i 32-bitowych. Załóżmy na przykład, iż potrzebny jest układ zasilany bateryjnie, który wykryje dźwięk lub sygnał elektryczny o określonych częstotliwościach poniżej 1 kHz. W takiej sytuacji można skonfigurować moduł ADC i moduł DMA, by moduł ADC zbierał 2048 próbek na sekundę, a moduł DMA zapisywał je w kolejnych komórkach bloku pamięci liczącego 4 kB. Po zapełnieniu jednej lub drugiej połowy bloku moduł DMA budzi CPU odpowiednim przerwaniem, a program wykonuje transformatę Fouriera na zbiorze 2048 próbek oraz identyfikuje obecność poszukiwanych częstotliwości (jeśli ich brak, wraca do stanu uśpienia), podczas gdy moduły ADC i DMA pracują dalej. Oczywiście można to zadanie zrealizować za pomocą kilku aktywnych filtrów pasmowych, ale koszt takiego rozwiązania może być zbyt wysoki. W naszym przykładzie układ ośmiobitowy, nawet z DMA, może się nie sprawdzić ze względu na liczbę potrzebnych obliczeń. Optymalnym rozwiązaniem może okazać się użycie układu z wbudowanymi funkcjami DSP. Zapewne część Czytelników zapyta, na co komu taki układ? Przykładowa odpowiedź może być dość prosta: do odróżniania pszczół od komarów. Pszczoły bzyczą z częstotliwością 250...300 Hz, trzmiele z częstotliwością 200...250 Hz, a komary w paśmie od 700 Hz do ponad 1 kHz. Inne potencjalnie zastosowanie to prosty układ mierzący aktywność mózgu, tj. wykrywający, czy użytkownik jest w stanie relaksu, czy wzmożonej aktywności. Wymyślenie kolejnych zastosowań zostawiam Czytelnikowi jako ćwiczenie wyobraźni.

Dobrym przykładem układów wymagających zarówno dużej mocy obliczeniowej, jak i oszczędnego wykonywania programu, są opaski sportowe mierzące aktywność fizyczną. Mikrokontroler musi zbierać i przetwarzać dane z wielu czujników, kompresować je oraz przechowywać w pamięci do czasu następnej synchronizacji, wyświetlać czas, licznik kroków, często też mierzyć tętno czy poziom natlenienia krwi oraz realizować dodatkowe funkcje. Jednocześnie opaska taka może mieć nieduże ogniwo litowe, które powinno wystarczać na minimum jedną dobę pracy – albo baterię, zdolną wytrzymać od kilku miesięcy do nawet roku. By uzmysłowić Czytelnikowi skalę opisywanego problemu, posłużę się przykładem opaski sportowej Amazfit Bip S: przy normalnym użytkowaniu wytrzymuje ona na jednym ładowaniu przynajmniej dwa dni, co sprawdziłem praktycznie. Opaska ta ma ogniwo litowo-polimerowe o pojemności 200 mAh. Oznacza to, że średni pobór prądu na sekundę wynosi ~1,16 μA (zatem mniej, niż wykazywały ujęte we wcześniejszych przykładach mikrokontrolery – przy realizacji znacznie większej liczby zadań, włącznie z obsługą podświetlanego wyświetlacza i optycznym pomiarem tętna co minutę).

Osiągnięto tę oszczędność przez utrzymywanie stanu uśpienia wszystkich komponentów wewnątrz opaski przez większość czasu. Jeśli pomiar tętna następowałby co 5 minut, ten monitor aktywności działałby nawet 15 dni na jednym ładowaniu, gdyż to właśnie czujnik tętna pobiera najwięcej energii: na oświetlenie skóry i naczyń krwionośnych w niej się znajdujących. Nawet tu istnieje pewna oszczędność uzyskana przez producenta samego czujnika: diody LED pracują impulsowo ze zmienną intensywnością, dostosowaną do aktualnych warunków pomiaru. Pomiar położenia i ruchu opaski też nie jest ciągły – wystarczy wykonać go 2...3 razy na sekundę. Należy przy tym pamiętać, że większość sensorów MEMS ma własne procesory realizujące funkcję integracji oraz analizy pomiarów. Wysoka specjalizacja tych układów pozwoliła producentom ograniczyć pobór prądu i zintegrować takie funkcje, jak automatyczne wykrywanie zmiany położenia czy zliczanie kroków w samym sensorze. W ten sposób główny mikrokontroler opaski może pozostawać nieaktywny przez zdecydowaną większość czasu.

Tryby oszczędzania energii mikrokontrolera na przykładzie układów Microchip PIC, PIC24/dsPIC i PIC32

Podstawową techniką oszczędzania energii jest wielokrotnie już wspomniane usypianie mikrokontrolera. Ale usypianie usypianiu nierówne. Bardziej zaawansowane układy oferują bardziej różnorodne opcje dezaktywacji MCU. Przyjrzyjmy się trybom dostępnym w produktach Microchipa z technologią XLP.

Rysunek 1 pokazuje tabelę z noty aplikacyjnej AN1267, w której zestawiono pobory prądu kilku 8- i 16-bitowych mikrokontrolerów Microchip. Warto zwrócić uwagę na to, że prąd w trybie uśpienia i prąd zasilania timera watchdog są podane oddzielnie, wyszczególniono też analogiczny parametr modułu RTCC, a dodatkowo uwzględniono prąd upływu pinów poszczególnych mikrokontrolerów.

Rysunek 1. Tabela zestawiająca pobory prądu przez wybrane mikrokontrolery 8- i 16-bitowe Microchip PIC, pochodząca z noty aplikacyjnej AN1267

Tryb głębokiego snu (Deep Sleep) potrafi ograniczyć pobór prądu do poziomu poniżej 100 nA. Układ może być wybudzony przez ograniczoną liczbę zdarzeń: alarm z modułu RTCC, zewnętrzne przerwanie, reset układu spowodowany przez zasilanie lub pin MCRL i wreszcie wybudzenie przez DSWDT (Deep Sleep Watchdog Timer). Ponieważ niemal wszystko pozostaje wyłączone, wybudzenie z głębokiego snu okazuje się – z praktycznego punktu widzenia – kompletnym resetem układu. Wszystkie rejestry SFR oraz licznik programu ulegają zerowaniu. Timer1/SOSC, piny I/O oraz RTCC są zachowane, by móc kontynuować pracę układu, zaś stosowne flagi sygnalizujące przyczynę resetu i stan głębokiego uśpienia są ustawione. Program jest wykonywany od początku i to w gestii programisty pozostaje sprawdzić, co było przyczyną resetu, a także czy układ znajdował się wcześniej w stanie głębokiego uśpienia.

Programista może też zachować kluczowe dane albo w dedykowanych rejestrach ogólnego przeznaczenia, albo w pamięci EEPROM układu (jeśli ta jest dostępna). Okazuje się to konieczne, gdyż – poza kilkoma rejestrami – wszystko, w tym również pamięć RAM układu, ulega zerowaniu. W układach, w których nie ma bloku EEPROM, można albo użyć pamięci zewnętrznej, albo krytyczne informacje zachowywać jako stałe pod określonym adresem pamięci programu – wszystkie mikrokontrolery Microchipa z wbudowanym Flashem mogą być programowane przez firmware.

Tryb snu (Sleep) dostępny jest w praktycznie wszystkich mikrokontrolerach Michrochip PIC. Podobne tryby mają też procesory z innych rodzin, a nawet innych firm. W tym trybie CPU pozostaje wyłączone, główny zegar zazwyczaj też, a pracują tylko te peryferia, które włączy program. Zachowana zostaje zawartość pamięci RAM, stan rejestrów i licznik programu. Po wybudzeniu mikrokontroler może kontynuować pracę od miejsca uśpienia. Ponieważ różne peryferia (jak choćby ADC czy moduły komunikacji szeregowej) mogą wybudzić układ, wspomniany tryb uśpienia używany jest najczęściej, gdy program musi czekać na jakąś informację, zanim podejmie działanie. Niektóre mikrokontrolery mają też zaawansowany moduł ADC, który może wykonywać dodatkowe operacje, w tym uśrednianie lub akumulację kolejnych wyników, a także generować przerwanie, gdy wynik konwersji ADC znajdzie się powyżej lub poniżej określonej wartości ustawionej przez program. Dzięki temu nie trzeba wybudzać mikrokontrolera w celu porównania każdego wyniku. Pokrewny tryb dostępny w niektórych mikrokontrolerach stanowi uśpienie niskonapięciowe/podtrzymujące (Low Voltage/Retention Sleep). Różni się on od standardowego trybu uśpienia użyciem dodatkowego regulatora napięcia, w celu obniżenia napięcia zasilania wewnętrznych rejestrów, RAM-u i logiki CPU dp 1,2 V. Dzięki temu maleje też pobór prądu. Wybudzenie z opisanego trybu trwa dłużej niż ze zwykłego uśpienia. Trzecim, pokrewnym trybem jest tryb snu z szybkim wybudzaniem (Sleep with Fast Wake-up). Normalnie wybudzanie ze stanu snu trwa typowo 20 mikrosekund, podczas gdy tryb szybkiego wybudzenia zwiększa nieco pobór prądu, ale pozwala na szybszy powrót do wykonywania programu.

Dwa kolejne tryby pracy nie są de facto trybami uśpienia, ale też pozwalają na oszczędzenie energii. Tryb bezczynności (Idle) odłącza zegar od CPU, wstrzymując wykonywanie programu, ale dostarcza go dalej do peryferiów. Powrót do wykonywania programu następuje po zgłoszeniu przerwania. W trybie drzemki (Doze) – dostępnym w układach PIC24 i dsPIC33 – zegar CPU jest dzielony przez wartość wskazaną przez program, dzięki czemu kod wykonuje się z niższą częstotliwością niż w przypadku sygnału taktowania peryferiów. Tryb bezczynności ogranicza pobór prądu do 25% natężenia mierzonego w normalnym trybie pracy i może zastąpić pętlę, w której program czeka na zmianę statusu jakiegoś modułu peryferyjnego. Z kolei tryb drzemki redukuje pobór prądu do 35...75% normalnego natężenia prądu (zależnie od ustawienia dzielnika) i pozwala na wykonywanie programu „w tle”, gdy peryferia nadal pracują z pełną prędkością. Za przykład ostatniego z opisanych mechanizmów niech posłuży użycie maksymalnej częstotliwości ADC (by zebrać próbki do przetworzenia) – w międzyczasie może być obsługiwany interfejs użytkownika.

Część mikrokontrolerów ma wbudowane dodatkowe wejście (i powiązany z nim tryb pracy) oznaczane jako Vbat. Zewnętrzne źródło napięcia – jak bateria, akumulator lub superkondensator – podłączone zostaje do pinu Vbat. W razie zaniku głównego zasilania to źródło podtrzyma: pracę zegara RTCC, dwa rejestry ogólne, używane w trybie głębokiego snu, a także blok pamięci RAM, zawierający klucze kryptograficzne i moduł zabezpieczający przed atakiem na silnik kryptograficzny, jeśli ten jest dostępny w mikrokontrolerze. Programista może wybrać, co będzie podtrzymywane przez domenę Vbat. Microchip zaleca, by krytyczne dane zachowywać w rejestrach DSGPRx dość często, jeśli istnieje ryzyko nagłego zaniku zasilania. W przypadku użycia akumulatora lub superkondensatora należy zatroszczyć się o zewnętrzny obwód ładowania tegoż, gdy główne napięcie zasilania jest obecne.

Inne funkcje oszczędzania energii

Poza użyciem trybów uśpienia można też ograniczyć natężenie prądu pobieranego przez mikrokontroler na inne sposoby – przede wszystkim wyłączając nieużywane peryferia za pomocą rejestrów PMD (Peripheral Module Disable), jeśli są dostępne. Dezaktywowane bloki nie będą zużywać energii. Rejestry SFR związane z modułem znajdującym się w tym stanie zostaną również wyłączone, przez co zniknie możliwość ich odczytania i zapisania. Oznacza to, że każdorazowe włączenie wybranego modułu będzie wymagało jego ponownej konfiguracji. Rozwiązanie takie ma sens, jeśli dany moduł używany będzie tylko sporadycznie.

Warto zatroszczyć się również o odpowiednią konfigurację nieużywanych pinów mikrokontrolera. Piny skonfigurowane jako wejścia logiczne co do zasady nie powinny „wisieć w powietrzu”. Zaleca się podłączenie ich do zasilania lub masy przez rezystory 10 kΩ. Lepszym rozwiązaniem okaże się skonfigurowanie tych pinów jako wyjść ze stanem „0” – wtedy można je zostawić niepodłączone. Alternatywną opcję stanowi przełączenie wybranych pinów jako wejść analogowych, co całkowicie odłącza część cyfrową obsługi portów i pinów.

Praktycznie wszystkie mikrokontrolery mają możliwość zmiany prędkości pracy zegara. Częstym błędem początkujących programistów i projektantów okazuje się użycie maksymalnej prędkości wewnętrznego oscylatora albo nieuzasadnione użycie zewnętrznego rezonatora kwarcowego, co wydatnie podnosi pobór prądu. Domyślną częstotliwością wewnętrznego oscylatora ośmiobitowych PICów jest 500 kHz, czyli 125 kIPS. Jeśli program nie wymaga szybkiego działania albo wykonuje niewiele instrukcji między stanami uśpienia, warto zredukować taktowanie do najniższej dostępnej wartości. Jeśli jednak program jest bardziej złożony, to prędkość taktowania można stosownie zwiększyć. Dynamiczna zmiana taktowania, zależnie od rodzaju wykonywanych zadań, może pozwolić na znaczną redukcję średniego poboru prądu, bez ograniczania funkcjonalności całego urządzenia. Pamiętać należy, że peryferia taktowane są tym samym zegarem co CPU, a więc przy zmianie prędkości zegara trzeba dostosować również ustawienia tych modułów, by ich prędkość nie uległa zmianie. Ma to szczególne znaczenie w odniesieniu do modułów komunikacyjnych SPI/I²C, EU(S)ART oraz CCP (Capture/Compare/PWM).

Ważny aspekt oszczędzania energii stanowi odpowiednia optymalizacja kodu źródłowego, którą częściowo wykona za nas kompilator. Warto jednak samemu rozważyć, czy da się kod uprościć lub podzielić na mniejsze bloki wykonywane tylko wtedy, gdy funkcjonalność projektu tego wymaga. Im mniej programu mikrokontroler wykonuje między kolejnymi uśpieniami, tym bardziej urządzenie będzie energooszczędne. Jedną z ciekawszych sugestii od firmy Microchip jest to, by najpierw konfigurować wszystkie potrzebne peryferia, a dopiero potem włączać je razem – dzięki czemu unika się ich bezczynnego oczekiwania i marnowania prądu, w czasie gdy inne są dopiero konfigurowane. Ustawienie każdego rejestru zajmuje w końcu dwie instrukcje maszynowe (wczytanie wartości do rejestru W i transfer wartości z rejestru W do stosownego rejestru SFR). Jeśli jakiś moduł peryferyjny jest potrzebny tylko po spełnieniu określonego warunku (np. wartość ADC przekroczyła zadany próg), w związku z czym przez zdecydowaną większość czasu nie będzie potrzebny, można jego konfigurację i użycie połączyć w jedną funkcję, a po użyciu wyłączyć go za pomocą PMD (co powinno wyzerować też stosowne rejestry SFR).

Ostatni trik wart wspomnienia to sposób oszczędzania energii, gdy w projekcie użyto zewnętrznego modułu lub układu peryferyjnego. Mowa tu np. o dokładniejszym przetworniku ADC, wzmacniaczu operacyjnym współpracującym z czujnikiem albo zewnętrznej pamięci szeregowej. Wiele układów ma wejście sterujące, ale nie stanowi to reguły, co więcej – nie likwiduje problemu obwodów zewnętrznych. Prostym rozwiązaniem jest natomiast użycie wolnego pinu mikrokontrolera jako źródła zasilania dla tych komponentów. Należy oczywiście wziąć poprawkę na wydajność prądową samego pinu (zależnie od producenta i rodziny mikrokontrolerów wynosi ona zwykle 15...25 mA) oraz ograniczyć użycie kondensatorów odsprzęgających. Każdy kondensator 100 nF będzie miał ładunek 300 nC przy 3 V. W momencie odłączenia zasilania od układu wspomniany ładunek można traktować jako stratę. W układach bateryjnych i tak warto ograniczyć zastosowanie kondensatorów, zwłaszcza ceramicznych – ze względu na ich znaczny prąd upływu. Należy też wziąć poprawkę na czas potrzebny, by tak sterowany obwód zewnętrzny był gotowy do wykonania swojego zadania – zależnie od rodzaju układu bądź obwodu będzie to od kilku do kilkuset mikrosekund. Jeśli tak kontrolowanym układem jest pamięć EEPROM lub Flash, należy uwzględnić czas potrzebny na zakończenie czynności zapisu – układy sygnalizują ten fakt zmianą stosownego bitu w swoich rejestrach statusu lub/i przez generowanie sygnału przerwania.

Podsumowanie

Mikrokontrolery oferują wiele możliwości zaoszczędzenia energii – i wszystkie one znajdują się zazwyczaj pod kontrolą programisty. Istotnym aspektem pozostaje wybór odpowiedniego komponentu do projektu, ale oferty układowe okazują się naprawdę bogate i każdy producent ma w tym względzie coś w zanadrzu. Choć w artykule skupiłem się na układach Microchip PIC, to nie musimy ograniczać się do tych rodzin mikrokontrolerów – z punktu widzenia współczesnego programisty rodzaj użytego układu często nie ma znaczenia, ponieważ kod i tak jest pisany w języku wysokopoziomowym. W następnej części cyklu przyjrzymy się różnym czujnikom oraz układom peryferyjnym – i tam poszukamy dalszych oszczędności energii.

Paweł Kowalczyk, EP

Artykuł ukazał się w
Elektronika Praktyczna
czerwiec 2024

Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik październik 2024

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio wrzesień - październik 2024

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka, Podzespoły, Aplikacje wrzesień 2024

Automatyka, Podzespoły, Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna październik 2024

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich październik 2024

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów