- Mikrokontroler ATmega8
- Zasilanie 12 VDC/0,5 A
- Wyświetlanie zegara w postaci cyfrowej, analogowej lub naprzemiennie
- Płytka wskazówki osadzona na wirniku wentylatora komputerowego
- Przeniesienie zasilania i sygnałów z klawiszy z użyciem transformatora
Zegar składa się z dwóch odseparowanych galwanicznie modułów. Pierwszy z nich jest układem nazywanym dalej „zasilaczem” i jest nieruchomą częścią zegara. Jego zadaniem jest zasilenie części wirującej oraz umożliwienie ustawiania czasu, regulacja prędkości obrotowej, i synchronizacja wirnika. Drugi moduł jest częścią wirującą zamocowaną na wirniku, nazywaną dalej „wskazówką”. Jest ona odpowiedzialna za wyświetlanie czasu.
Zasilacz
Analizę schematu zegara zacznijmy od zasilacza (rysunek 1). Jego podstawowymi elementami są generator i wzmacniacz zasilający uzwojenie pierwotne transformatora powietrznego (zdecydowałem się zastosować transformator bezrdzeniowy ze względu na dużą awaryjność rozwiązania ze szczotkami oraz mniejszy hałas). W roli generatora zastosowano popularny, tani kontroler PWM – UC3845. Częstotliwość pracy wynoszącą około 140 kHz wyznaczają elementy C7 i P1, natomiast współczynnik wypełnienia jest bliski 50%.
Wyjście układu IC2 typu push-pull idealnie nadaje się do bezpośredniego sterowania bramką tranzystora MOSFET. Rezystor R3 ogranicza maksymalny prąd przeładowania bramki. Jako stopień mocy zasilający cewkę zastosowano wzmacniacz pracujący w klasie E.
Naley w tym miejscu omówić krótko zasadę działania wspomnianego wzmacniacza. Załóżmy sytuacje początkową, w której tranzystor T3 jest załączony, w uzwojeniu pierwotnym transformatora narasta natężenie prądu, a napięcie na kondensator C6 jest równe zeru.
Wyłączamy tranzystor T3. Prąd płynący przez uzwojenie pierwotne musi płynąc nadal (taką sytuację wymusza pole magnetyczne wokół cewki), lecz teraz ładuje on kondensator C6. W chwili kiedy prąd uzwojenia pierwotnego spadnie do zera, napięcie na kondensatorze C6 osiągnie wartość maksymalną (dużo wyższą od napięcia zasilania) i prąd w uzwojeniu pierwotnym zacznie płynąć w przeciwna stronę, rozładowując tym samym kondensator C6. Bardzo ważne jest powtórne załączenie T3 w momencie, w którym napięcie na C6 spadnie do zera. Niespełnienie tego warunku znacznie zwiększy straty mocy w tranzystorze T3, a w skrajnym przypadku spowoduje jego uszkodzenie.
Na schemacie modułu zasilającego można również znaleźć źródło prądowe, którego obciążeniem jest silnik zegara, zbudowane na tranzystorach T1-T2 (tworzą one typowy układ Darlingtona). Przybliżoną wartość prądu źródła można wyznaczyć ze wzoru IO=(UB–2×UBE)/R2 i należy dobrać ja eksperymentalnie (zależnie do posiadanego egzemplarza wentylatora) tak, aby odświeżanie obrazu było dostatecznie szybkie, a drgania spowodowane niewyważeniem wirnika miały rozsądną amplitudę. Proponowana wartość rezystora R2 to około 51 Ω.
Przyciski S1 i S2 służą do ustawienia czasu wyświetlanej przez zegar. Ustawianie odbywa się poprzez modulację amplitudową zasilania części wirującej zegara. Za kluczowanie generatora zasilacza wirnika (IC2) jest odpowiedzialny tranzystor T4 sterowany z multiwibratora monostabilnego IC3. Wciśnięcie przycisku S1 lub S2 powoduje podłączenie do wejścia wyzwalającego układu IC3 przebiegu prostokątnego pochodzącego z multiwibratora astabilnego IC4C, R4, C10 (IC4D, R8, C13), podawanego za pośrednictwem R6 (lub R9) i C9.
W efekcie na wyjściu układu IC3 pojawia się przebieg prostokątny o czasie trwania poziomu wysokiego około 1 ms (czas trwania impulsu ustalają elementy P2, C12) i częstotliwości zależnej od tego, który przycisk został przyciśnięty. Jeśli częstotliwość ustawiania (wolne lub szybkie) nam nie odpowiada, można ją zmieniać w dosyć szerokich granicach korygując wartości rezystorów R4, R8 (odpowiednio tryb wolny i szybki). Jako kondensatory C10 i C13 najlepiej zastosować kondensatory tantalowe. Zapewni to długoczasową stabilność częstotliwości multiwibratorów.
Na schemacie można znaleźć jeszcze stabilizator IC1 służący do zasilania układów IC3 i IC4. Dodatkowo generuje on napięcie referencyjne wykorzystywane przez źródło prądowe.
Do zasilania zegara najlepiej użyć zasilacza wtyczkowego o stabilizowanym napięciu 12 V i wydajności prądowej co najmniej 0,5 A. Nie polecam zasilania zegara napięciem wyższym niż wspomniane 12 V, ze względu na szybko zwiększające się straty w rdzeniu stojana i stabilizatorze napięcia umieszczonym na wirniku.
Wskazówka
Płytkę wirujcą zaprojektowano jako niewielką płytkę dwustronną, obrysem przypominającą wskazówkę. Zamontowano na niej układ właściwego zegara (rysunek 2), którego zasadniczymi elementami są mikrokontroler IC1 i układ RTC – IC2. W roli zegara czasu rzeczywistego zastosowałem PCF8563 (mniej popularna wersja układu PC8583, bez wewnętrznego RAM-u, za to w mniejszej obudowie). Ze względu na możliwość prawidłowej pracy już od napięcia 1,1 V, możliwe było zastosowanie do podtrzymania rejestrów RTC małej baterii zegarkowej o napięciu znamionowym 1,5 V. Układ z diodami D3, D4 decyduje, z którego źródła w danej chwili jest zasilany RTC. Należy zaznaczyć, że dioda D4 powinna być diodą o jak najniższym spadku napięcia (germanowa lub Shottky’ego). W miejsce diody D3 stosujemy typową diodę LL4148.
Za zasilanie wskazówki podczas pracy odpowiedzialne są elementy D5-D10, C2, C3, C5. Diody D5, D6, D9, D10 tworzą typowy prostownik dwupołówkowy, odseparowany za pomocą diody D7 od filtru zasilacza, w skład którego wchodzą kondensatory C2, C3, C5. Dioda D8 pracuje w roli parametrycznego stabilizatora napięcia. Ponieważ ustawianie zegara odbywa się poprzez modulacje amplitudową sygnału zasilania zegara, zanim sygnał ten zostanie odfiltrowany trzeba z niego wydobyć impulsy odpowiedzialne za ustawienie zegara.
W tym celu dodano układ demodulatora złożony z elementów R13, C1, R14, D1.
Jest to prosty filtr dolnoprzepustowy o tak dobranej stałej czasowej, aby na jego wyjściu otrzymać zdemodulowany sygnał ustawiania zegara (ujemne impulsy o czasie trwania około 1 ms). Dioda D1 ogranicza wartość uzyskanego po demodulacji napięcia do akceptowalnej przez mikrokontroler. Zbocze sygnału ustawiania zegara doprowadzonego do wejścia INT0 powoduje wywołanie przerwania zewnętrznego. Po tym zdarzeniu mikrokontroler z użyciem Timera0 mierzy czas trwania poziomu niskiego na doprowadzeniu INT0 i stwierdza czy odebrany impuls pochodził od układu ustawiania godziny, czy też był przypadkowym zanikiem zasilania. Jeżeli impuls mieścił się w zdefiniowanych w programie ramach czasowych, czas pokazywany przez zegar jest zwiększana o jedną minutę, a sekundy przyjmują wartość zero. Drugie przerwanie zewnętrzne (INT1) obsługuje zegar RTC i zgłaszane jest w momencie odliczenia przez układ IC2 każdej kolejnej sekundy.
Wyświetlacz jest zbudowany z linijki diod LED, które rozmieszczone są w taki sposób, aby można było wyświetlać zarówno czas w trybie analogowym (zegar wskazówkowy), jak i cyfrowym (czas za pomocą cyfr). Szeregowe oporniki ograniczają prąd szczytowy każdej z diod. Mała wartość ich rezystancji jest spowodowana bardzo krótkim czasem świecenia diod.
Należy jeszcze wspomnieć o układzie synchronizacji wskazówki zegara, w skład którego wchodzą fotodioda D2 oraz dioda nadawcza podczerwieni umieszczona na płytce zasilacza (IRED1). Każdy obrót wskazówki zegara powoduje krótkotrwałe oświetlenie diody odbiorczej wirnika i pojawienie się zbocza opadającego na wejściu ICP mikrokontrolera, co z kolei powoduje przechwycenie wartości rejestrów Timera1 mierzącego czas obrotu. Uzyskany w ten sposób czas służy do wyznaczenia podziałki zegara.
Konstrukcja mechaniczna
Część nieruchomą zegara widmowego wykonano ze stojana wentylatora komputerowego, do którego jest przymocowana płytka zasilacza zegara. Częścią ruchomą jest wirnik wentylatora, pozbawiony łopatek, z zamocowaną płytką wyświetlacza.
Wentylator wymaga demontażu. Rozbiera się go stosunkowo łatwo. W pierwszej kolejności zdejmujemy nalepkę naklejoną od spodniej strony, pod którą znajduje się przeważnie gumowa zaślepka którą należy wyciągnąć. Pod zaślepką widać kawałek osi wirnika i plastikową zawleczkę zapobiegającą wysunięciu się wirnika ze stojana. Zawleczkę można łatwo usunąć za pomocą zakrzywionej pincety. Po jej usunięciu wirnik można swobodnie wysunąć i poobcinać łopatki. Pozostałości usuwamy za pomocą pilnika i papieru ściernego.
Kolejny czynnością, którą należy wykonać jest nawinięcie uzwojeń transformatora bezrdzeniowego (pierwotne na stojanie, wtórne na wirniku). Karkas uzwojenia pierwotnego wykonujemy z kawałka rurki PCV o średnicy 40 mm i wysokości 10 mm. Następnie rurkę przyklejamy do stojana w taki sposób, aby wirnik włożony w stojan swobodnie się w niej obracał. Rurkę przyklejamy punktowo za pomocą kleju cyjanoakrylowego do żeber stojana. Na karkasie nawijamy uzwojenie składające się z 10 zwojów drutu emaliowanego o średnicy 0,4 mm. Zwoje kładziemy w jednej warstwie, a nawijanie zaczynamy od dolnej krawędzi karkasu. Po nawinięciu końce uzwojenia prowadzimy po odpowiednim żeberku stojana, tak aby trafiały w odpowiednie miejsce na płytce zasilacza. Uzwojenie zabezpieczamy przed rozwinięciem warstwą lakieru.
Uzwojenie wtórne nawijamy drutem emaliowanym o średnicy 0,2 mm bezpośrednio na wirniku w miejscu, gdzie były łopatki, zaczynając nawijanie podobnie (jak w przypadku stojana), od krawędzi dolnej. Zwój przy zwoju owijamy wirnik 20 razy a uzwojenie zabezpieczamy lakierem. Kierunek nawijania uzwojeń nie ma znaczenia.
Schemat montażowy płytki wirnika pokazano na rysunek 3. Montaż płytki wirnika zaczynamy jak zwykle od elementów o najmniejszych gabarytach. Z uwagi na zastosowanie w zegarze układu PCF8563 potrzebować będziemy małego rezonatora kwarcowego o częstotliwości 32,768 kHz oraz baterii do podtrzymania pracy układu po zaniku głównego napięcia zasilania zegara. Bardzo mały rezonator kwarcowy można pozyskać z taniego, elektronicznego zegarka naręcznego. Kwarc po przylutowaniu do płytki wirnika pochylamy, tak aby leżał na rezystorze R20. Dodatkowo przyklejamy go kroplą kleju „na gorąco”. Bateria podtrzymująca pracę RTC jest typową baterią zegarkową o napięciu 1,5 V. Oczywiście, baterię montujemy plusem do góry. Kolejnym elementem na wirniku, któremu musimy poświęcić chwilę uwagi jest dioda Zenera D8. Podczas normalnej pracy zegara dioda ta dosyć mocno rozgrzewa się i dlatego powinna mieć moc strat wynoszącą co najmniej 1 W. W przypadku trudności z zdobyciem odpowiedniej diody do montażu powierzchniowego, można przylutować równolegle dwie diody Zenera o mocy 0,5 W w obudowie MMELF. Jako diody LED wyświetlacza polecam użycie diod o kącie świecenia około 40 stopni i jak największej jasności. Wybierając diody można wziąć pod uwagę czułość oka ludzkiego, która jest maksymalna dla długości fali około 550 nm, a ta z kolei odpowiada kolorowi zielonemu.
Zmontowaną płytkę wskazówki przytwierdzamy do czoła wirnika za pomocą kleju lub przykręcając płytkę do wirnika wkrętami (nie zapominamy o dystansach pod płytką). Wkręty odpowiednio skracamy, aby nie uderzały o magnetowód stojana podczas obrotu wirnika.
Wyprowadzenia uzwojenia wtórnego prowadzimy po wirniku w górę i po płytce wirnika do punktów oznaczonych na schemacie jako L1 i L2. Fotodiodę D1, odpowiedzialną za synchronizację wyświetlania, montujemy przy samej płytce drukowanej od spodniej strony.
Konstrukcję mechaniczną wirnika z zamocowana płytką umieszczono na rysunku 4.
Na koniec montażu wirnika pozostaje nam jego wyważenie. Do tego celu są przewidziane spore pola masy usytuowane po spodniej stronie płytki wokół diody D1 i pod diodami LED. Przygotowujemy tulejkę, w której umieszczamy oś wirnika. Tulejkę z osadzonym wirnikiem wkręcamy w imadło, tak aby płaszczyzna płytki wirnika była pionowo. Następnie zakręcamy wirnikiem i patrzymy czy za każdym razem zatrzymuje się w losowym położeniu. Jeśli nie, korygujemy wagę wirnika poprzez nalutowanie na wspomniane wyżej pole kropli cyny lub nałożenie odpowiedniej ilości kleju.
Następnie montujemy płytkę zasilacza. Jej schemat montażowy pokazano na rysunku 5.
Jest przygotowana do montażu pod stojanem, jak na rysunku 6. Przykręcamy ją czterema wkrętami Æ3 stosując tulejki dystansowe o długości około 15 mm. Płytkę montujemy w takiej pozycji, aby wyprowadzenia zasilania silnika wychodzące z korpusu wentylatora były w tym samym miejscu, co pola lutownicze złącza CON1. Diodę nadawczą podczerwieni IRED1 osłaniamy nieprzezroczystą tulejką, którą przyklejamy do płytki zasilacza. Tulejka znacznie zredukuje kąt świecenia diody, co zaowocuje krótszym i pewniejszym impulsem synchronizacji wskazówki.
Uruchomienie
Uruchomienie zegara zaczynamy od sprawdzenia płytki zasilacza, po uprzednim odłączeniu od układu uzwojenia pierwotnego oraz silnika wentylatora. Urządzenie podłączamy do źródła dobrze odfiltrowanego napięcia stałego o wartości 12 V. W pierwszej kolejności sprawdzamy napięcie na wyjściu stabilizatora IC1 (+5 V). Następnie do nóżki 3 układu IC3 podłączamy sondę oscyloskopu, wciskamy jeden z przycisków S1 lub S2 i weryfikujemy obecność impulsów o czasie trwania około 1 ms i przerwie pomiędzy nimi zależnej od wciśniętego przycisku. Dla przycisku S1 częstotliwość przebiegu powinna wynosić około 1...2 Hz, natomiast dla przycisku S2 około 5 Hz. Jeżeli wartość częstotliwości znacznie odbiega od podanej, należy skorygować wartości rezystancji R4, R8. Czas trwania impulsu korygujemy poprzez zmianę nastawy potencjometru P2. Jeżeli przebieg na wyjściu układu IC3 jest prawidłowy, przechodzimy do dalszego etapu uruchamiania. Sondę oscyloskopu podłączamy do wyjścia (noga 6) układu IC2 i sprawdzamy występowanie przebiegu prostokątnego o częstotliwości około 140 kHz. Następnie podłączamy uzwojenie pierwotne i potencjometrem P1 tak ustawiamy częstotliwość pracy generatora, aby pobór prądu przez nasz zasilacz był najmniejszy. W okolicach częstotliwości 140 kHz powinniśmy zobaczyć na amperomierzu wyraźne minimum, które nie powinno przekraczać 400 mA. Taki sposób strojenia jest najprostszy i zapewnia prawidłowe ustawienie częstotliwości generatora IC2. Strojenie należy przeprowadzać możliwie szybko, ze względu na niekorzystne warunki pracy wzmacniacza klasy E przy częstotliwości różnej od optymalnej.
Następnie możemy wsunąć wirnik i skontrolować napięcie na diodzie D8 płytki wirnika – powinno ono wynosić około 5 V. Sprawdzamy również temperaturę diody D8. Jeżeli napięcie na diodzie jest poprawne, a jej temperatura na tyle wysoka, że nie można dotknąć jej palcem, należy wysunąć wirnik i odwinąć jeden zwój uzwojenia, po czym ponownie skontrolować temperaturę i napięcie diody D8.
Po opisanych wyżej czynnościach pozostaje nam już tylko zaprogramowanie mikrokontrolera. W tym celu zgodnie z notą katalogową mikrokontrolera ATmega8 dolutowujemy do niego przewody od programatora i programujemy go. Dla ułatwienia programowania umieściłem na płytce pola lutownicze podłączone do tych linii interfejsu SPI, które nie są nigdzie wykorzystane. Po zaprogramowaniu procesora należy ustawić fusebity i uruchomić wewnętrzny oscylator RC procesora działający z częstotliwością 8 MHz oraz uaktywnić próg zerowania procesora na poziomie 4 V. Pola SJ1 i SJ2 umieszczone na płytce wirnika służą do wyboru trybu pracy zegara. Rozwarcie pola SJ1 powoduje naprzemienną (co 21 sekund) zmianę trybu wyświetlania czasu z cyfrowego na analogowy. Połączenie pola SJ1 umożliwia ustawienie zegara w tryb określony drugim polem SJ2. Zwarcie wspomnianego pola powoduje włączenie trybu analogowego, zaś rozwarcie włącza tryb cyfrowy.
Program zegara
Działanie oprogramowania zegara opiera się głownie na obsłudze przerwań zewnętrznych (INT0, INT1, ICP) i przerwań od timerów (T0, T1, T2). Nadrzędnym zadaniem jest obsługa przerwania synchronizacji, a co za tym idzie – poprawne wyświetlanie tarczy zegara.
Każdy obrót wskazówki powoduje powstanie opadającego zbocza na wejściu przechwytującym ICP, następuje odczytanie i wyzerowanie szesnastobitowego licznika T1, a przechwycona z licznika T1 wartość, po podzieleniu przez 60 określa czas, w którym wskazówka przesuwa się między sąsiednimi działkami na tarczy zegara. Odpowiedzialny za obsługę przechwytywania fragment programu umieszczono na listingu 1.
SIGNAL(SIG_INPUT_CAPTURE1) //przerwanie od opadającego
//zbocza sygnału na wejściu ICP
{
turn_time=TCNT1; //przechwyć czasu obrotu wskazówki zegara
TCNT1=0; //zeruj timer1
div_time =turn_time/60; //oblicz czas między działkami
OCR1A=div_time; //załaduj do rejestru porównania timera1
//czas między działkami
current_position =0; //wyzeruj pozycje wskazówki
display(); //wyświetl fragment tarczy
start_T0; //włącz timer wyznaczający czas świecenia
current_position =59; //ustal numer następnej pozycji wskazówki
//(silnik wentylatora obraca się w lewo)
}
Kolejna wyświetlona pozycja na tarczy zegara (działka o numerze 59) zostanie zainicjowana przez przerwanie od porównania zawartości rejestru Timera1 z rejestrem OCR1A. Następnie do zawartość rejestru OCR1A zostanie zwiększona o czas odstępu pomiędzy pozycjami wyświetlania (działkami), a numer aktualnie wyświetlanej pozycji zostanie zmniejszony o 1 (listing 2). Taka sytuacja powtórzy się 59 razy, po czym ponownie zostanie zgłoszone przerwanie od wejścia ICP (synchronizacja).
SIGNAL(SIG_OUTPUT_COMPARE1A) //przerwanie od porównania (należy
//wyświetlić kolejną pozycję)
{
if(current_position!=1) //jeśli pozycja różna od zerowej
OCR1A += div_time; // zwiększaj zawartości OCR1A
if(current_position!=0) //aby zawsze pozycja_aktualna >0
{
display(); //wyświetl fragment tarczy
start_T0; //włącz timer wyznacz. błysk
current_position--; //ustal numer następnej pozycji
}
}
Za odczyt czasu z układu RTC i ustawianie zegara odpowiedzialne są odpowiednio przerwania INT1 i INT0. Odczyt czasu realizowany jest w pętli głównej programu i odbywa się każdorazowo po zgłoszeniu przerwania INT1. Wygenerowanie przerwania INT0 wywołane wciśnięciem przycisku na części nieruchomej zegara powoduje załączenie timera2 i pomiar czasu trwania impulsu ujemnego. Jeśli długość impulsu mieści się w określonych granicach, następuje wyzerowanie sekund i zwiększenie liczby minut, a także zapis czasu do układu RTC (listing 3).
SIGNAL(SIG_INTERRUPT0) //przerwanie wywołane naciśnięciem
//przycisku ustawiania zegara
{
if((MCUCR&0x01)==0) //przerwanie wywołane zboczem opadającym
{
TCNT2=0; //wyzeruj timer2
start_T2; //włącz timer2
MCUCR|=0x01; //zmień zbocze aktywacji INT0 na narast.
}
else //przerwanie wywołane zboczem narast.
{
stop_T2; //zatrzymaj timer2
MCUCR&=0xFE; //zmień zbocze aktywacji na opadające
if((TCNT2>50)&&(TCNT2<70)) //sprawdź czy długość impulsu mieści
//się w wyznaczonych granicach
{
//jeśli tak zwiększ liczbę minut, wyzeruj sekundy
//i zapisz czas do RTC
}
}
RTC_flag=1; //ustaw flagę zezwalająca na odczyt z RTC
}
Łukasz Bojda
ukaszek_1983@tlen.pl
- R1: 470 Ω
- R2: 51 Ω
- R3: 22 Ω
- R4, R5: 100 kΩ
- R6: 330 Ω
- R7: 47 kΩ
- R8: 10 kΩ
- R9: 330 Ω
- P1: 4,7 kΩ/potencjometr nastawny
- P2: 47 kΩ/potencjometr nastawny
- C1, C5, C8, C9, C11, C12: 100 nF
- C2, C4: 100 µF/16 V
- C3: 470 µF/16 V
- C6: 100 nF/400 V
- C7: 2,7 nF
- C10, C13: 15 µF
- IC1: 7805
- IC2: UC3845N
- IC3: NE555N
- IC4: 4093N
- IRED1: LED 3 mm
- T1, T4: BC547
- T2: BD139
- T3: IRF530
- CON1...CON2: WAGO-500
- S1, S2: mikroprzycisk
- R1...R13: 10 Ω (dobrać do diod LED)
- R14: 1 kΩ
- R15, R16, R18, R19: 3,3 kΩ
- R17: 4,7 kΩ
- R20: 200 Ω
- C1: 20 pF
- C2: 100 nF
- C3: 100 nF
- C4, C5: 220 µF
- C6: 22 nF
- D1: SFH225
- D2, D4...D9: LL4148
- D3: Schottky
- D10: dioda Zenera 5,1 V/1 W
- IC1: ATmega8 (TQFP32)
- IC2: PCF8563
- LED1...LED13: diody LED SMD w obudowie o wym. 1206
- Q2: BC847
- B1: bateria 1,5 V z uchwytem
- Q1: kwarc zegarkowy 32768 kHz
- SJ1, SJ2: zworka