Projektowanie urządzeń energooszczędnych

| Technika

Nie ma znaczenia czy projektowana jest elektroniczna szczoteczka do zębów, golarka, telefon komórkowy, palmtop, odtwarzacz MP3 czy pilot zdalnego sterowania, bo atrakcyjność urządzenia jest związana z czasem pracy bez konieczności wymiany baterii. Jest to obecnie jeden z najważniejszych trendów determinujących rozwój elektronicznych gadżetów. Każde z tych urządzeń może zawierać w sobie układ sterujący jego pracą, np. mikrokontroler. Do zadań projektanta należy wykorzystującego w pełni możliwości baterii.

Projektowanie urządzeń energooszczędnych

Obecnie dostępne rodziny mikrokontrolerów różnią się między sobą pobieranym prądem oraz oferowanymi trybami oszczędzania energii. Wybierając jeden z nich należy zwrócić uwagę nie tylko na wydajność, dostępne układy peryferyjne, rozmiar pamięci, ale także na wbudowane mechanizmy zwiększające czas pracy baterii. Konieczna jest strategia, która wykorzysta w pełni te mechanizmy, a przemyślane kroki pozwolą wprowadzić dodatkowe oszczędności. Niezależnie od wybranego układu, dobrze przygotowane oprogramowanie wydłuża czas pracy baterii.

Bezprzewodowy komputer rowerowy.

Rys. 1. Schemat blokowy komputera

Rozważania o redukcji zużycia energii zostaną oparte na przykładzie bezprzewodowego komputera (licznika) do roweru. Składać się on będzie z trzech modułów: panelu kontrolnego zamocowanego na kierownicy, umieszczonego na kole czujnika prędkości oraz wyświetlacza przytwierdzonego do kasku rowerzysty. Pomiar prędkości może być oparty o czujnik optyczny. Umieszczona na szprysze tarcza, przy każdym obrocie koła, odsłoni fotoelement. Większa prędkość poruszania się pojazdu spowoduje, że częściej będzie następowało odsłanianie czujnika i w efekcie wzrośnie częstotliwość. Zmierzone impulsy elektryczne zostaną przesłane do panelu kontrolnego drogą radiową. Tam prowadzone są wszelkie obliczenia – zamieniana jest częstotliwość na prędkość, odległość, czas pozostały do celu czy też liczbę zużytych kalorii. Wyświetlacz przyczepiony do kasku pokazuje wyniki przesłane do niego drogą radiową. Rysunek 1 przedstawia schemat blokowy komputera.

Tryby oszczędzania energii

Współcześni konsumenci oczekują małych i poręcznych urządzeń elektronicznych. Prowadzi to do umieszczania mikrokontrolerów w bardzo małych obudowach, np. LQFP. Zmniejszane są tranzystory, z których zbudowany jest układ scalony. Jest to wadą, gdyż nie można zasilać układu scalonego napięciem o wartości większej niż 3V. Konieczne staje się wbudowanie w jego strukturę modułu obniżającego napięcie - stabilizatora. Jest to przyczyną powstawania dodatkowych strat. Niemniej mikrokontroler może zużywać mniej prądu korzystając ze stabilizatora obniżającego napięcie z 3V do 1,8V, niż bezpośrednio zasilany ze źródła 5V. Tryby oszczędzania energii pozwalają utrzymać optymalny bilans energetyczny, rekompensują m. in. straty stabilizatora i pracę przy podwyższonej częstotliwości taktowania CPU. Współczesne układy wyposażone są w wiele elastycznych trybów redukcji mocy. Przykładowo układ MC9S08GB60 firmy Freescale oferuje cztery takie tryby:

Wait – ograniczenie zużycia energii polega na odłączeniu sygnału taktującego od CPU. Układy peryferyjne, takie jak przetwornik A/C, liczniki czy porty szeregowe, nadal są taktowane. Tryb ten jest przydatny, gdy CPU oczekuje, aż układy peryferyjne zakończą bieżące zadania. W przykładzie komputera rowerowego tryb wait jest wybierany podczas komunikacji z układem radiowym za pomocą SPI (Serial Peripheral Interface).

Stop3 – wbudowany w mikrokontroler regulator napięcia jest przełączany w stan oszczędny. Dostarczane jest nadal napięcie zapobiegające utracie danych z pamięci RAM i rejestrów I/O. Przerwania z kilku źródeł i sygnał Reset mogą wyprowadzić mikrokontroler z tego stanu i przywrócić do normalnej pracy. Tylko ten tryb umożliwia pracę modułowi LVI (Low Voltage Inhibit), który wykrywa spadek napięcia poniżej ustalonej granicy (np. w wyniku rozładowania baterii zasilającej urządzenie).

Stop2 – jest znacznie mniej funkcjonalny niż Stop3, ale zużywa też mniej energii. Regulator napięcia jest zupełnie wyłączony, podtrzymywana jest jedynie zawartość pamięci RAM. Konfiguracja rejestrów I/O ulega skasowaniu i konieczna jest ich ponowna konfiguracja. Opuszczenie trybu Stop2 jest trudniejsze, bo dostępna jest mniejsza liczba przerwań. Do dyspozycji użytkownika pozostaje jednak funkcja RTI (Real-Time Interrupt – generowane jest okresowe przerwanie wyprowadzające układ z uśpienia). Przekładając to na przykład – możliwe jest wejście do stanu Stop2 (oszczędniejszy od Stop3) i oczekiwanie w nim do chwili, gdy konieczne będzie odebranie danych z czujnika prędkości. Czas przebywania w Stop2 zostanie odmierzony przez licznik układu RTI.

Stop1 – jest to najbardziej oszczędny z trybów, ale uniemożliwia jakąkolwiek pracę mikrokontrolera. Odłączone jest zasilanie od pamięci RAM, rejestrów I/O i wszystkich układów peryferyjnych. Istnieją tylko dwie drogi wyjścia: podanie sygnału reset lub zewnętrznego przerwania. Jest on stosowany w sytuacji, gdy mikrokontroler może być wyłączony, bo nie wykonuje żadnej pracy. Reaguje jednak na zewnętrzne pobudzenia, np. naciśnięcie przycisku.

Tryb stop1 jest najlepszym wyborem, gdy urządzenie jest wyłączone. Powoduje to wprowadzenie mikrokontrolera w najbardziej energooszczędny stan, porównywalny z całkowitym odłączeniem zasilania. Warto zauważyć dodatkową korzyść – nie trzeba stosować przełączników mechanicznych. Włączenie urządzenia jest możliwe przez naciśniecie przycisku podłączonego do zewnętrznego przerwania. Jest ono w stanie wyprowadzić mikrokontroler z trybu stop1. Ten sam klawisz może być następnie wykorzystany do innych celów, zależnie od stanu pracy komputera. Jest to rozwiązanie cechujące się prostotą wykonania i oszczędnością energii.

Tabela. Pobór prądu w wybranych trybach i rdzeniach mikrokontrolerów
RdzeńUkładIcc w trybie aktywnym [mA]Icc w trybie power down [μA]Uwagi
AVRATmega480,50,3Napięcie rdzenia 3,3V
HCS08MC9S08GB601,10,025Napięcie rdzenia 3V
ARMLPC210377Wyłączone układy peryferyjne (tryb aktywny), napięcie rdzenia 1,8V
PICPIC16F6300,190,0012Wyłączone układy peryferyjne (tryb PD). Prąd maksymalny dla tego trybu to 1μA
MSPMSP430F1120,30,8Napięcie rdzenia 3V

Zarządzanie sygnałem zegarowym

Rys. 2. Zmiana częstotliwości, zależnie od wykonywanego zadania i towarzyszący temu pobór energii

Wielu projektantów sądzi, że obniżanie częstotliwości zegara prowadzi bezwzględnie do oszczędności energii. Nie zawsze jest to prawdą i zależy od zadań wykonywanych przez CPU. Czasami zwiększanie częstotliwości taktowania może obniżyć pobór prądu. Układy posiadające tryb oszczędzania energii będą najczęściej w nim przebywać. Czasami konieczne jest wykonanie określonego kodu (fragmentu programu) przed przejściem w stan oszczędzania. Okazuje się, że wykonanie tego zadania przy największej możliwej częstotliwości i powrót do trybu uśpienia zużyje mniej energii, niż dłuższa praca, ale przy mniejszej częstotliwości. Powracając do przykładu bezprzewodowego komputera, można założyć, że pomiar prędkości jest aktualizowany raz na sekundę i wymaga 16000 cykli maszynowych na przetworzenie otrzymanych danych. Po zastosowaniu rezonatora kwarcowego 32kHz i ustawieniu preskalera na dwa, CPU będzie taktowane częstotliwością 16kHz. Wykonanie założonej pracy zajmie całą sekundę. Podniesienie częstotliwości pracy do 8MHz sprawi, że zdanie zostanie wykonane w 2ms, a pozostały czas (998ms) mikrokontroler będzie znajdował się w trybie uśpienia. Nie w każdym przypadku praca z największą, dopuszczalną częstotliwością będzie optymalna. W analizowanym przykładzie komunikacja radiowa nie będzie wymagać 8MHz, szczególnie gdy wymiana danych jest wolna. W związku z tym opłacalne jest ustawienie najniższej, możliwej częstotliwości do czasu ukończenia przesyłania informacji. Największe oszczędności energii przynosi elastyczne przełączanie sygnału taktującego, zależnie od wykonywanego w danej chwili zadania. Konieczny jest wybór mikrokontrolera, który pozwala na taką zmianę w dowolnym momencie. W przypadku układu MC9S08GB60 jest to możliwe. Dodatkowo mikrokontroler ten może być taktowany zewnętrznym rezonatorem kwarcowym, pracującym z wysoką lub niską częstotliwością, albo wbudowanym, wewnętrznym oscylatorem. Bez względu na wybrane źródło sygnału zegarowego, do dyspozycji jest wbudowany układ FLL. Pozwala on mnożyć lub dzielić częstotliwość taktowania CPU. Elastyczna zmiana sygnału zegarowego przynosi oszczędności prądu zasilania. Na rysunku 2 pokazano zmianę częstotliwości, zależnie od wykonywanego zadania i towarzyszący temu pobór energii.

Rozwiązania sprzętowe

Rys. 3. Przykładowy układ pomiarowy komputera rowerowego

Przemyślane rozwiązania, wdrożone na etapie projektowania części sprzętowej, przyczynią się do dodatkowych oszczędności. Najbardziej intuicyjne jest wyłączanie zasilania nieużywanych, zewnętrznych podzespołów (np. układów pomiarowych). Z pomocą przychodzą porty I/O. Często wydajność prądowa takiego portu jest większa niż prąd zasilający dany podzespół. Podanie stanu wysokiego spowoduje dołączenie napięcie zasilającego do zewnętrznego układu i rozpocznie on normalną pracę. Po wykonaniu konkretnego zadania nastąpi przejście portu w stan niski, co odłączy zasilanie i układ przestanie być zasilany. Przykładowy układ pomiarowy pokazano na rysunku 3. Podanie stanu wysokiego na porty PTC6 oraz PTC7 sprawi, że dioda IRED będzie świecić, a fototranzystor zostanie spolaryzowany. Możliwe jest teraz prowadzenie pomiarów. Obracająca się tarcza ze szczeliną okresowo odsłania fototranzystor powodując powstanie na jego wyjściu zbocza opadającego. Im większa prędkość – tym szybciej zdarzają się odsłonięcia i częstotliwość jest większa. Po zakończeniu pomiaru wyniki przesyłane są do układu sterującego. Czujnik może być wyłączony (porty PTC6, PT7 przechodzą w stan niski) do czasu przeprowadzenia następnego pomiaru. Należy określić moment, w którym światło przechodzi przez szczelinę. Realizuje to prosta pętla (tzw. polling), jednakże mikrokontroler znajduje się cały w trybie aktywnym i spora część energii jest marnowana na oczekiwanie. Można do tego problemu podejść w inny sposób. Spojrzenie na rysunek 3 pozwala zauważyć, iż nieoświetlony czujnik daje na wyjściu sygnał wysoki, natomiast oświetlony – niski. Pojawieniu się szczeliny pomiędzy diodą LED i fototranzystorem poprzedza zmiana wyjścia czujnika - ze stanu wysokiego na niski. Pojawiające się zbocze opadające można wykorzystać do wygenerowania przerwania i do momentu jego wystąpienia, mikrokontroler będzie znajdował się w trybie obniżonego poboru mocy. Uprzednio włączany jest licznik, a po wystąpieniu przerwania – zatrzymywany. Odczyt jego zawartości pozwala określić czas, w jakim obróciło się koło. Wyłączenie czujnika prędkości ma jeszcze jedną zaletę - nie są generowane niepotrzebne przerwania.

Obecnie zasilenie elementów takich jak diody LED czy fototranzystory jest możliwe bezpośrednio z portu I/O. Zdarza się jednak, że urządzenie potrzebuje znacznie więcej prądu. Taki przypadek wymaga zastosowania elementu przełączającego, np. bufora. Niekiedy wystarczające będzie połączenie kilku portów równolegle, aby zwiększyć całkowitą wydajność prądową.

Pozostawianie nieużywanych portów bez należytego skonfigurowania (jako tzw. pływające wejście) prowadzi do zwiększonego zużycia energii. Pobierany prąd jest zależy od losowych czynników, np. temperatury otoczenia. Należałoby włączyć wewnętrzne rezystory podciągające, a porty dwukierunkowe ustawić jako wyjściowe.

Rozwiązania programowe

Z programowego punktu widzenia istnieje kilka, mniej oczywistych sposobów na redukcję pobieranej mocy. Jak zaznaczono wcześniej, najlepszym sposobem jest przebywanie w stanie „uśpienia” tak długo, jak to możliwe. Nie można wprowadzić mikrokontrolera w stan obniżonego poboru energii, gdy ma on jakieś instrukcje do wykonania. Najważniejszym zadaniem jest zatem skrócenie rozmiaru kodu, który musi zostać przetworzony. Pierwszą rzeczą, o której należy pamiętać, to korzystanie ze zmiennych o jak najmniejszej liczbie bitów. Pisząc program w C łatwo zapomnieć, że popularna zmienna typu int jest w rzeczywistości zmienną 16-bitową, nawet dla rdzeni 8-bitowych. Z tego względu, w urządzeniach 8-bitowych, należy zawsze używać zmiennych typu char. Zmienne o większej liczbie bitów powinny być używane jedynie w wyjątkowych sytuacjach. Czasami możliwe jest rozdzielenie słowa 16-bitowego czy 32-bitowego na słowa 8-bitowe, prowadzenie na nich obliczeń i połączenie razem dopiero na końcu. Dodatkowe oszczędności prądu przynosi unikanie krótkich pętli programowych oraz wywołań podprogramów. Każda z tych operacji potrzebuje dodatkowych cykli maszynowych. Należy określić, czy pętla została w całości wykonana, a wywołanie podprogramu wymaga zachowania na stosie adresu powrotu, jego późniejszego odtworzenia i przesunięcia o jeden. W przypadku krótkich funkcji i nadmiaru pamięci programu warto skorzystać ze specjalnego mechanizmu typu inline (C/C++). Polega on na bezpośrednim skopiowaniu funkcji do miejsca gdzie jest wywoływana i oszczędzany jest czas potrzebny na obsługę wywołania podprogramu. Podobnie sprawa wygląda z pętlami. Wiedząc, że wykona się ona zawsze cztery razy, można cztery razy wstawić ten sam kod. Wyeliminuje to konieczność obsługi pętli, a praca mikrokontrolera skróci się o następne cykle maszynowe.

Należy unikać definiowania stałych pośrednich, tzn. takich, które muszą później zostać przeliczone. Oszczędza to czas procesora i pozwala na dłuższe przebywać w stanie energooszczędnym. W omawianym przykładzie komputera rowerowego zastosowano tor radiowy, który korzysta z dwóch prędkości. Jedna z nich jest wykorzystywana przy odczycie pomiarów prędkości z czujnika, a druga do wysyłania informacji do wyświetlacza umieszczonego w kasku. Kuszące wydaje się wpisanie w zmiennych tych właśnie prędkości. Konieczne jednak będzie zaimplementowanie funkcji, która przeliczy je na odpowiedni dzielnik (preskaler) wymagany przez interfejs komunikacyjny. Zwiększa to czytelność programu, jednakże zużywa dodatkowe cykle maszynowe, co oznacza dłuższy czas pracy w trybie aktywnym.

Kolejną sztuczką programową są tzw. tablice LUT (Look-Up Table). Zamiast przeliczać jedną wartość na drugą, można zastosować metodę porównawczą. Polega ona na sporządzeniu tablicy zawierającej wyliczone wcześniej wartości dla określonego przedziału parametrów. Trzymając się przykładu, można zauważyć, iż częstotliwość odbierana z czujnika jest konwertowana na prędkość roweru. Zamiast przeliczania można sporządzić tablicę, w której będą już obliczone prędkości dla różnych częstotliwości. Wystarczy wtedy, mając częstotliwość, odczytać prędkość z odpowiedniej komórki. Oszczędza to czas, jaki byłby potrzebny na obliczenia. W przypadku niezbędnych kalkulacji należy zawsze poszukiwać możliwości ich wcześniejszego zakończenia. Najlepszym przykładem jest tu mnożenie przez zero bądź jeden.

Jakub Borzdyński

Zobacz również