Elektroniczny zegar / budzik / kalendarz z wyświetlaczem NIXIE
Transkrypt
Elektroniczny zegar / budzik / kalendarz z wyświetlaczem NIXIE
Mikrokontrolery ARM Elektroniczny zegar / budzik / kalendarz z wyświetlaczem NIXIE. Opis projektu 27.06.2016 Tomasz Jaroszewski Opis funkcjonalny W ramach projektu wykonany został elektroniczny zegar z budzikiem i funkcją kalendarza. Zegar wyposażony jest w j neonowe lampy typu NIXIE, za pomocą których wyświetla czas lub datę. Prosty, składający się z 3 przycisków interfejs zapewnia możliwość przełączania trybów wyświetlacza i umożliwić programowanie zegara oraz kalendarza, a także obsługę budzika. Funkcję sterownika zegara pełni zestaw uruchomieniowy NUCLEO-STM32F411RE. Do wykonania zegara niezbędny był ponadto: • • • • zasilacz 5V do zasilania części cyfrowej, zasilacz 12V do zasilania przetwornicy 12/150V do zasilania anod lamp NIXIE, płytka wyświetlacza z lampami NIXIE i drajwerami 74141, płytka z przyciskami, przetwornicą napięcia, rejestrami przesuwnymi Wyświetlacz będzie się składał z sześciu lamp NIXIE (obecnie 5 cyfr), z dziesięcioma cyframi arabskimi każda oraz czterech neonówek (chwilowo diody LED). Planowane jest zaimplementowanie automatycznej regulacji jasności świecenia wyświetlacza w zależności od natężenia światła (nie ukończone). Użytkownik ma do dyspozycji 3 tryby wyświetlania: „ZEGAR” – neonówki „dwukropka” migają z częstotliwością 1 Hz. Neonówka po lewej stronie sygnalizuje uaktywnienie alarmu. Format wyświetlania czasu „gg:mm.ss”. „KALENDARZ” – świeci tylko dolna neonówka „dwukropka”, neonówka po lewej stronie sygnalizuje uaktywnienie alarmu. Format wyświetlania daty „DD:MM:RR”. „BUDZIK” – neonówki nie migają, neonówka po lewej stronie sygnalizuje uaktywnienie alarmu. Jeśli alarm jest aktywny, to o zaprogramowanej godzinie zegar zacznie emitować dźwięk (oczywiście w każdym trybie wyswietlania) zapisany na karcie SD lub przerywany sygnał dźwiękowy w przypadku braku karty lub pliku. Dźwięk będzie emitowany do momentu wciśnięcia przycisku, ale nie dłużej niż przez 5 minut. Dodatkowo w każdym z w/w trybów zegar można przełączyć w tryb PROGRAMOWANIA. W trybie PROGRAMOWANIA edytowana cyfra (lub cyfry) miga z częstotliwością 1 Hz. Zegar posiada trzy przyciski, tak jak radzieckie elektroniczne zegary typu электрoника 8. Ich funkcje są podobne jak w tychże zegarach (zegarki te nie posiadały trybu kalendarza). Przycisk 1 przełącza tryby: „ZEGAR” -> „KALENDARZ” -> „BUDZIK” -> „ZEGAR”… Przycisk 2 przełącza w tryb PROGRAMOWANIA: • • • czasu w trybie „ZEGAR”: sekundy (tylko zerowanie) -> jedności minut -> dziesiątki minut -> godzina (2 cyfry) -> wyjście z trybu ustawiania -> … daty w trybie „KALENDARZ”: jedności lat -> dziesiątki lat -> miesiąc ->jedności dni -> dziesiątki dni -> wyjście z trybu ustawiania -> … godziny alarmu w trybie „BUDZIK”: jak w trybie zegara, ale z pominięciem sekund Przycisk 3: • • • w trybie „BUDZIK” powoduje włączenie/wyłączenia alarmu (budzika). Włączenie (aktywność alarmu) sygnalizowane jest zapaleniem skrajnej lewej neonówki. w trybie PROGRAMOWANIA czasu/daty zwiększa edytowaną cyfrę o 1 (po osiągnięciu wartości maksymalnej następne naciśnięcie powoduje zmianę na wartość minimalną). Podczas edycji sekund naciśnięcie przycisku powoduje zerowanie sekund. w trybie „ZEGAR” oraz „KALENDARZ” naciśnięcie przycisku 3 nie ma wpływu na pracę zegara. Budowa zegara Jak wcześniej wspomniano, zegar składa się z następujących modułów: • • • • Zestaw uruchomieniowy NUKLEO z mikrokontrolerem STM32F411RE, zasilaczy, (74141) Wyświetlacza z dekoderami BCD na 110 Płytki z przyciskami, przetwornicą oraz rejestrami przesuwnymi, Zegar korzysta z następujących zasobów mikrokontrolera: • • • • • układ przerwań, RTC – odliczanie czasu i generowanie przerwań co 1s oraz przerwań alarmu (budzika), SPI 1 – sterowanie wyświetlaczem, kanał OC3 licznika 2 do sterowania przetwornicą zasilającą lampy NIXIE 3 linie: PB3, PB4 i PC13 + kanał OC1 licznika 2– obsługa klawiszy, • • • W planach: SPI +DMA – komunikacja z kartą SD licznik w trybie PWM do generowania dźwięku, 1 kanał ADC do pomiaru natężenia światła (gotowa funkcja konfiguracji ADC, wyzwalanie przetwornika przez licznik). Schemat blokowy zegara. Jak wcześniej wspomniałem klawisze podłączone są do linii PC13 (przycisk USER – klawisz 1) PB3 – klawisz 2 i PB4 – klawisz 3, skonfigurowanych jako wejścia. Skonfigurowane są jako źródła przerwań zewnętrznych EXTI. Wyjście kanału OC3 licznika 2 (wyjście PWM) do sterowania kluczem MOS przetwornicy napięcia podłączone jest do linii PB10. Linia PA6 (skonfigurowana jako wyjście) służy do zatrzaskiwania danych w buforach wyjściowych rejestrów 74HC595. Linie PA5 i PA7 skonfigurowane są jako wyjścia interfejsu SPI. Oprogramowanie Kod programu zawarty jest w kilku plikach. Część plików odpowiada za konfigurację układów peryferyjnych oraz zegarów mikrokontrolera (ich nazwy mówią same za siebie): o RTC_config o NVIC_config o GPIO_config o SPI_config o RCC_ config o ADC_ config o Timer_config.c Komentarze umieszczone w kodzie programu objaśniają szczegóły konfiguracji. Warto zwrócić uwagę na sposób konfiguracji czasu i daty. Po poprawnym skonfigurowaniu układu RTC i zaprogramowaniu czasu i daty zapisywana jest w rejestrze RTC_BKP_DR0 wartość 0X9527. Jeżeli mikrokontroler będzie miał podłączoną baterię podtrzymującą pracę generatora LSE oraz backup domain lub jeśli nie zostanie odłączone zasilanie ale wykonany zostanie reset mikrokontrolera to podczas inicjalizacji sprawdzona zostanie zawartość w/w rejestru i jeżeli będzie ona równa 0X9527 ustawienia czasu daty i budzika nie zostaną zmienione. Pozostałe pliki to: o main.c – zawiera funkcję main(), funkcje wyświetlające czas, datę i godzinę alarmu: disp_time(), disp_date(), disp_alarm(), a także funkcje odpowiadające za reakcję na naciśnięcie klawiszy switch1(), switch2() i switch3(). o STM32F4xx_it.c zawiera funkcje obsługi przerwań. Cała obsługa układów peryferyjnych (komunikacja z wyświetlaczem, RTC…) i zdarzeń zewnętrznych (naciśnięcie klawiszy, odliczanie czasu wciśnięcia klawiszy), odbywa się podczas obsługi przerwań. Tylko procedury konfigurujące rdzeń i układy peryferyjne mikrokontrolera są wykonywane w funkcji main() – kolejno: ‒ Konfiguracja zegarów, ‒ Konfiguracja GPIO, ‒ Konfiguracja licznika, ‒ (Konfiguracja przetwornika ADC), ‒ Konfiguracja RTC, ‒ Konfiguracja Układu przerwań. Po skonfigurowaniu wszystkich niezbędnych układów następuje inicjalizacja zmiennych globalnych a następnie rozpoczyna się „wykonywanie” nieskończonej, pustej pętli. Użyte w programie zmienne globalne: mode – tryb pracy: 0 - wyswietlanie czasu, 1 - wyświetlanie daty, 2 - wyświetlanie godziny alarmu prog_mode – tryb programowania (dokładny opis w pliku globals.h) led – odpowiada za miganie dwukropka w trybie zegara (1 – górna kropka świeci / 0 – nie świeci) off_digit – w trybie programowania odpowiada za miganie edytowanej cyfry... time_2_mode0 –odlicza czas [s] do automatycznego powrotu do trybu 0 - zegar z trybów 1 i 2 (powrót blokowany przy programowaniu) alarm – 0 - alarm wyłączony, 1 - alarm aktywny i budzik nie dzwoni, 2 - budzik dzwoni time – struktura RTC_TimeTypeDef do zapamiętania aktualnej godziny date – struktura RTC_DateTypeDef do zapamiętania aktualnej daty alarm_time – struktura RTC_AlarmTypeDef do zapamiętania aktualnej godziny alarmu RTC_TimeTypeDef temp_time – struktury jak wyżej, wykorzystywane podczas programowania. RTC_DateTypeDef temp_date RTC_AlarmTypeDef temp_alarm. Ze względu na dużą ilość komentarzy w kodzie programu omówię tylko ogólną koncepcję działania oprogramowania. Układ przerwań obsługuje zdarzenia zewnętrzne linii EXTI3 (klawisz 2), EXTI4 (klawisz 3), EXTI13 (klawisz 1) oraz EXTI17 (RTC – budzik oraz odliczanie sekund). Pierwsze 3 ustawiają tylko liczniki (odpowiednie zmienne globalne) służące do odliczania opóźnienia, po którym sprawdzany jest ponownie stan linii wejściowej. Gdy na skutek mechanicznych drgań styków poszczególne funkcje przerwania wywołane zostaną kilkukrotnie – poszczególne liczniki będą inicjowane za każdym razem wartością początkowa. W mikrokontrolerach STM32F4xx wyjście przerwań układu RTC połączone jest z linią EXTI17 a za obsługę przerwania odpowiedzialna jest funkcja RTC_Alarm_IRQHandler(). W funkcji tej sprawdzana jest co 1s wartość zmiennej mode i w zależności od jej wartości wywoływana jest opowiednia funkcja disp_xxx() odczytująca z RTC i wyświetlająca czas, datę lub godzinę alarmu. Funkcje te odpowiadają także za odpowiednie włączenie/wyłączenie LEDów/neonówek oraz miganie edytowanych cyfr w trybie programowania. W przerwanie od RTC (co 1s) dekrementowany jest licznik odpowiadający za automatyczny powrót z trybów „budzik” i „kalendarz” do trybu „zegar”. Kolejnym źródłem przerwania jest licznik TIM2 a dokładnie kanał 1 tego licznika pracujący w trybie zliczania czasu. Funkcja tego przerwania ogranicza się do odliczania czasu wciśnięcia klawisza (poprzez zliczanie ilości wystąpień tego przerwania przy wciśniętym klawiszu – dekrementacja zmiennych keyXcounter) Jeśli klawisz wciśnięty jest odpowiednio długo wywoływana jest odpowiednia funkcja switchX(), która wykonuje właściwy dla danego klawisza kod. W zależności od potrzeby realizowane jest lub blokowane „autopowtarzanie” np. podczas programowania czasu przytrzymanie klawisza 3 powoduje zmianę programowanej wartości co około 1s. Przerwanie od licznika ma najwyższy priorytet, pozostałe źródła przerwania mają najniższy możliwy priorytet i nie powodują wzajemnego „wydziedziczania”. Za odliczanie czasu odpowiedzialny jest wbudowany w mikrokontroler układ zegara czasu rzeczywistego (RTC) skonfigurowany do generowania przerwania co 1s. Czas i data odczytywane i zapisywane są z/do układu RTC w kodzie BCD, co ułatwia wysyłanie danych do wyświetlacza (nie ma potrzeby konwersji danych przed wysłaniem, ale konieczna jest korekta podczas programowania godzin i miesięcy przy przejściu 9 -> 10 i 19 -> 20). Do odliczanie czasu (godziny i daty) nie jest konieczne wykonywanie kodu programu. Podczas programowania daty konieczne jest również sprawdzenie zgodności daty (wpisanego dnia) z długością aktualnego miesiąca. Interfejs SPI wykorzystany został do wysyłania danych do wyświetlacza. W celu odświeżenia zawartości wyświetlacza konieczne jest wysłanie 4 bajtów (2 x 16 bitów) najmłodszy bajt steruje świeceniem diod LED i/lub neonówek, kolejne 3 zawierają wartości w kodzie BCD sterujące dekoderami 74141. Przeprowadzane były próby mające na celu wykonanie regulatora napięcia zasilającego lampy NIXIE z wykorzystaniem przetwornika ADC. Klucz MOS przetwornicy sterowany jest sygnałem PWM z kanału 3 licznika TIM2, natomiast charakterystyka napięcia wyjściowego prostej przetwornicy wykonanej na 1 kluczu MOS okazała się mocno nieliniowa i niemonotoniczna). Skutkowało to silnym nagrzewaniem tranzystora i nieprzewidywalnym zachowanie dla pewnych wartości częstotliwości i wypełnienia. W związku z tym konieczne było dobranie tych wartości doświadczalnie i ustawienie ich na stałe. Ten sam licznik wykorzystywany jest do obsługi klawiatury („autopowtarzanie”, filtrowanie drgań styków). Częstotliwość przepełniania licznika ma wpływ na prace klawiatury i zmiana częstotliwości przepełniania licznika pociąga za sobą konieczność zmiany wartości odpowiednich stałych. • • • Dodatkowe założenia, które zostały zrealizowane w oprogramowaniu: wygaszanie zera na pozycji dziesiątek godzin, odliczanie czasu w trybie programowania (zegar normalnie odlicza czas a na wyświetlaczu aktualizowane są cyfry – tak jak we wspomnianych wcześniej radzieckich budzikach elektronicznych), zegar automatycznie przechodzi z trybu „BUDZIK” i „KALENDARZ” do trybu „ZEGAR” po kilkunastu sekundach (co zostało wyżej opisane). Podsumowanie Projekt wykonany został w z wykorzystaniem płytki uniwersalnej oraz 5-cyfrowego wyświetlacza NIXIE pochodzącego ze starego miernika częstotliwości. Wymaga jeszcze dopracowania oprogramowania, wykonania nowej płytki drukowanej pozwalającej obsłużyć 6 cyfr wyświetlacza i umieszczenie pomiędzy cyframi zegara dwukropka oraz wykonania estetycznej obudowy. Poniższe zdjęcia przedstawiają aktualny stan: Zegar będący przedmiotem tego projektu po wykonaniu płytki drukowanej wyświetlacza oraz odpowiedniej obudowy będzie w pełni funkcjonalnym urządzeniem, mającym zastosowanie w codziennym ( a ze względu na rodzaj wyświetlacza i „conocnym” ☺ ) życiu. Znaczne zasoby mikrokontrolera, w szczególności możliwości komunikacji z innymi urządzeniami poprzez USB, bluetooth itp. ) pozwolą w przyszłości rozbudować zegar o dodatkowe funkcje, np. zdalne programowanie budzika lub synchronizacja czasu z GPS.