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.

Podobne dokumenty