Największym problemem, który został napotkany podczas realizacji tego projektu, było znalezienie niewielkiego, taniego wyświetlacza, który pobierałby znikomy prąd. Oczywistym wyborem są tu wyświetlacze LCD, jednak te najbardziej popularne są w zasadzie modułami z wbudowanym sterownikiem. To znacząco upraszcza komunikację, ale powoduje też znaczący wzrost poboru prądu, więc taki wyświetlacz raczej nie nadaje się do zasilania z baterii – pobór prądu rzędu kilku miliamperów szybko rozładuje nawet największe ogniwa. Z tego powodu konieczne było wykonanie własnego układu sterującego wszystkimi elektrodami wyświetlacza.
Wszystkie rejestry połączono w łańcuch, jak pokazano na rysunku 2. Mikrokontroler wpisuje 32-bitowy ciąg na linię DATA w takt przebiegu wysyłanego na linii SHCP. Po wpisaniu całości, zboczem narastającym na linii STCP, aktualizuje wyjścia rejestrów. Dzięki temu do sterowania całym wyświetlaczem angażowane są tylko 3 wyprowadzenia mikrokontrolera.
Budowa zegara
Schemat ideowy zegara pokazano na rysunku 4. W sterowniku wyświetlacza LCD, złożonym z układów US3…US6, wszystkie wejścia SCL (poziom niski czyści zawartość rejestru) zostały podciągnięte do dodatniego bieguna zasilania. Z kolei wejścia OE (poziom niski uaktywnia wyjścia) zostały połączone z masą. W ten sposób, wprowadzając tranzystor T1 w stan zatkania, można wyłączyć zasilanie rejestrów. Należy jednocześnie ustawić linie DATA, STCP i SHCP, aby prąd nie przedostawał się przez diody wygaszające. Zasilanie rejestrów jest załączane tylko na czas odświeżenia ich zawartości, przez pozostały czas pozostaje wyłączone. Kondensatory C5 i C6 redukują tętnienia na liniach zasilających rejestry podczas wpisywania do nich nowej wartości.
Wyjście, które jest załączane i wyłączane przez zegar, znajduje się na zaciskach złącza J2. W stanie załączenia zwiera je tranzystor T2. Jest to tranzystor MOSFET typu N, więc napięcie przyłożone do tych zacisków musi mieć odpowiednią polaryzację: wyższy potencjał jest przyłożony do drenu (HI), a niższy do źródła (LO). Użyty w tym miejscu tranzystor unipolarny nie pobiera z baterii żadnego prądu, ponieważ prąd płynący przez jego bramkę jest pomijalnie mały. Tranzystory typu IRLML2502 dobrze nadają się do aplikacji z tak niskim napięciem zasilającym. Potwierdza to nota katalogowa, według której napięcie progowe wynosi od 0,6 V do 1,2 V (przy ID=250 mA). Z kolei, przy UGS=3 V, prąd drenu może sięgać nawet 3 A ze spadkiem napięcia dren-źródło nieprzekraczającym 100 mV.
Za odmierzanie czasu jest odpowiedzialny układ US2 typu M41T00. W swojej strukturze ma kompletny zegar czasu rzeczywistego (RTC) z generatorem dla rezonatora kwarcowego 32768 Hz. Z mikrokontrolerem komunikuje się za pomocą interfejsu I2C.
Wejście VBAT, które służy do podtrzymania odliczania, na stałe dołączono do baterii. Z kolei wejście VCC, z którego jest zasilana część odpowiedzialna za komunikację szeregową, jest sterowane wprost z wyprowadzenia mikrokontrolera. Do tego samego wyprowadzenia dołączono rezystory podciągające magistrali I2C. Gotowość do zaktualizowania informacji o czasie jest potrzebna rzadko, dlatego przez większość czasu potencjał wejścia VCC jest bliski zeru. Dopiero wtedy, kiedy zachodzi konieczność nawiązania łączności z układem M41T00, wyprowadzenie VCC zostaje podciągnięte do wysokiego poziomu logicznego, co jest tożsame z podaniem nań zasilania. Kondensatory C1 i C2 zmniejszają impedancję widzianą przez wejścia zasilania.
W całym układzie zastosowano kondensatory ceramiczne ze względu na małe wymiary oraz – co ważniejsze – znacznie mniejszy prąd upływu w porównaniu z kondensatorami elektrolitycznymi.
Układ zegara został zmontowany na dwustronnej płytce drukowanej o wymiarach 38 mm×54 mm, której schemat montażowy pokazano na rysunku 5. Na płytce są elementy powierzchniowe i przewlekane, więc proponuję następującą kolejność montażu: wszystkie podzespoły SMD, rezonator kwarcowy Q1, drabinka RN1, złącze goldpin J1, złącze ARK2 J2, przyciski S1…S3, wyświetlacz LCD1. Należy pamiętać, że wszystkie elementy, poza wyświetlaczem, znajdują się po spodniej stronie płytki drukowanej. Podczas wkładania wyprowadzeń wyświetlacza w otworki należy zachować ostrożność, ponieważ silniejsze wygięcie którejkolwiek z nich może połamać kruche szkło wyświetlacza. Widok płytki obsadzonej częściami prezentuje fotografia 6. Na samym końcu można doprowadzić zasilanie do pól lutowniczych +BAT i –BAT. Powinno ono wynosić ok. 3 V i może pochodzić, na przykład, z dwóch połączonych szeregowo baterii AAA. Warto zauważyć przy tym, że nawet niewielka bateria typu CR2032 pozwoli na pracę tego układu przez długi czas.
- Low Fuse: 0xE2.
- High Fuse: 0xDF.
Extended Fuse: 0xFF.
Na rysunku 7 pokazano zrzut ekranu z programu BitBurner. Względem konfiguracji domyślnej (fabrycznej), zmianie uległ jedynie bit CKDIV8 – rdzeń jest taktowany przebiegiem o częstotliwości 8 MHz. Mogłoby się wydawać, że podwyższenie częstotliwości taktowania przełoży się na zwiększenie pobieranej mocy, lecz w rzeczywistości, jeśli oprogramowanie mikrokontrolera zostanie odpowiednio przemyślane i napisane, jest inaczej.
Eksploatacja
Po włączeniu zasilania na wyświetlaczu zostaną wyświetlone 4 zera, ponieważ zegar działa w trybie 24-godzinnym. Kropka pośrodku powinna regularnie migać – oznacza to poprawną komunikację z układem RTC. Po wciśnięciu przycisku S2 zegar przechodzi w tryb nastaw aktualnego czasu, o czym informuje, pokazując przez chwilę litery cL (od „clock”) – fotografia 8. Wciskając przycisk S1, zwiększymy aktualną liczbę minut, a przyciskiem S3 liczbę godzin. Ponownie wciskając S2, możemy zmienić czas załączenia wyjścia (fotografia 9). Przyciski S1 i S3 działają w taki sam sposób, jak poprzednio. Po ponownym wciśnięciu S2 zegar przechodzi do podmenu zmiany czasu wyłączenia wyjścia – komunikat pokazano na fotografii 10. Przez załączenie wyjścia jest rozumiane jego zwarcie do masy.
Pobór prądu ze źródła o napięciu 3 V wynosi ok. 25 mA. Zakładając pojemność baterii CR2032 na poziomie 220 mAh, powinna ona wystarczyć na rok pracy zegara. Na dwóch bateriach AAA (pojemność ok. 900 mAh) może on działać nawet przez 4 lata!
Jeżeli napięcie spadnie do 2 V, zegar nadal działa i pobiera wtedy prąd ok. 15 mA. Mogą jednak pojawić się problemy z prawidłowym otwarciem tranzystora T2 sterującego wyjściem. Z kolei zwiększanie napięcia powyżej 3 V jest niewskazane ze względu na wyświetlacz, który jest przystosowany do tego właśnie napięcia. Maksymalne napięcie, jakie można przyłożyć do zacisków złącza J2, wynosi 20 V, ponieważ tyle wynosi maksymalne napięcie dren-źródło tranzystora IRLML2502. Musi być to napięcie stałe, aby dioda zawarta w tranzystorze MOSFET była spolaryzowana zaporowo. Można przyjąć, że maksymalny prąd przewodzony przez ten tranzystor wynosi do 2 A. To z powodzeniem wystarczy do załączenia przekaźnika, małego silnika lub innego odbiornika. W przypadku obciążeń indukcyjnych odpowiednią diodę zabezpieczającą należy umieścić na zaciskach tego obciążenia.
![]() |
![]() |
![]() |
Dla ciekawskich
W bardzo łatwy sposób osiągnięto odpowiednie odwracanie poziomów logicznych względem nóżki COM – wystarczy zanegować całą 32-bitową zmienną, bit po bicie. Segment wyłączony pozostanie w tym stanie, ponieważ wyprowadzenia COM i wyłączonego segmentu nadal będą miały ten sam poziom logiczny. Ta sama reguła dotyczy segmentów załączonych (zaczernionych). Podczas jednego wywołania zawartość tej zmiennej jest aktualizowana (według tego, co ma się znaleźć na wyświetlaczu), a podczas drugiego tylko negowana.
Odpowiednie interwały czasowe, niezbędne do sterowania wyświetlaczem z określoną częstotliwością, są realizowane poprzez cykliczne usypianie i budzenie mikrokontrolera. Za budzenie jest odpowiedzialny układ watchdog, który generuje przerwania co ok. 32 ms. Ma on własny generator zegara o częstotliwości 128 kHz, więc działa niezależnie od rdzenia. Po obudzeniu, mikrokontroler wykonuje zadane czynności, po czym ponownie przechodzi w stan uśpienia.
Paradoksalnie, wyższa częstotliwość zegara głównego przyczyniła się do zmniejszenia średniego natężenia pobieranego prądu z 35 mA przy 1 MHz do 25 mA przy 8 MHz (dla napięcia 3 V), czyli o blisko 30%. Powodem jest krótszy czas załączenia zasilania dla rejestrów 74HC595 – sprzyja temu szybsze wpisywanie do nich nowej zawartości. Fragment kodu, odpowiedzialny za usypianie, budzenie oraz konfigurację, pokazano na listingu 1.
Michał Kurzela, EP
Listing 1. Kod odpowiedzialny za ograniczenie pobieranej mocy
ISR(WDT_vect){ } //pusta obsługa przerwania, aby nie pozostało nieobsłużone
int main(void)
{
sei(); //uruchomienie systemu przerwań
WDTCSR = (1<<WDIE) | (1<<WDP0); //uruchomienie przerwań od watchdoga + timeout 32ms
while(1){
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
PORTA &= 0b11110111; //wyłączenie tranzystora w ‚595
PORTA |= 0b00000111; //ustawienie linii danych ‚595 na 1, aby przez diody clampujące nie płynął prąd
sleep_enable();
sleep_cpu();
sleep_disable();
WDTCSR = 0; //wyłączenie watchdoga
PORTA |= 0b00001000; //załączenie zasilania w ‚595
PORTA &= 0b11111000; //wyzerowanie linii sterujących
}
}