- dwa tryby pracy: generator lub wobulator,
- wyjście sygnału sinusoidalnego i prostokątnego,
- regulacja częstotliwości w zakresie od 1 Hz do 40 MHz, z krokiem regulowanym w zakresie od 1 Hz do 1 MHz,
- regulacja poziomu wyjściowego sygnału sinusoidalnego za pomocą potencjometru,
- możliwość zastosowania jednego z dwóch dostępnych na rynku, gotowych modułów generatorów DDS z chipem AD9850.
Oprogramowanie sterujące oraz montaż urządzenia
Program sterujący układem został napisany w całości w języku C dla mikrokontrolerów AVR i skompilowany w środowisku LINUX za pomocą popularnego kompilatora AVR-GCC z użyciem bibliotek z pakietu AVR-LIBC. Kod źródłowy został napisany w dość przejrzystym stylu i opatrzony wyczerpującymi komentarzami, dzięki czemu jego modyfikacje nie powinny być bardzo dużym wyzwaniem także dla mniej doświadczonych programistów, stając się dla nich jednocześnie źródłem inspiracji oraz polem do pożytecznych prac rozwojowych.
Na źródła programu sterującego pracą przyrządu składają się:
- AVT-5980.c - główny plik, zawierający m.in. funkcję main(),
- AVT-5980-lcd.c - plik zapewniający obsługę wyświetlacza LCD,
- AVT-5980-lcd.h - plik nagłówkowy dla pliku AVT-5980-lcd.c,
- AVT-5980-functions.c - plik zawierający pomocnicze funkcje sterowania urządzeniem,
- AVT-5980-functions.h - plik nagłówkowy dla pliku AVT-5980-functions.c.
Przyjęty podział nie był w zasadzie niezbędny, jednak zdaniem autora istotnie zwiększył czytelność opracowanego kodu. W dalszej części artykułu znajduje się zwięzły opis zawartości wymienionych zasobów.
Główny plik AVT-5980.c rozpoczynają definicje stałych (literałów) F_CPU i Fg_tab_MAX, niezbędnych do ustalenia: poprawnej częstotliwości pracy mikrokontrolera oraz liczby próbek generowanych częstotliwości dla wobulatora. Następnie dyrektywami #include włączone zostały wszystkie niezbędne dla prawidłowej kompilacji omawianego modułu pliki nagłówkowe. Dalej następują deklaracje wszystkich zmiennych i stałych o zasięgu globalnym dla tego pliku. Główny blok programu zawiera wyłącznie funkcję main(), ponieważ wszystkie funkcje pomocnicze zostały zadeklarowane i zdefiniowane w pozostałych plikach tego projektu.
W pierwszym kroku zaimplementowano konfigurację portów mikrokontrolera a także przypisano początkowe wartości tym z nich, które zdefiniowano jako wyjściowe. Port D w większości wykorzystano do obsługi wyświetlacza LCD (wyprowadzenia PD.4...PD.7 oraz PD.0...PD.2) z wyjątkiem linii PD.3, która stanowi wejście dla sygnału zewnętrznego przerwania INT1, przeznaczonego do precyzyjnego śledzenia zmian stanów wyprowadzeń enkodera obrotowego. Wyprowadzenia PB.0 i PB.1 w porcie B są wejściami stanów dwóch styków enkodera a pin PB.2 jest wyjściem sygnału przetwornika cyfrowo-analogowego DAC, zrealizowanego w technice PWM z użyciem wewnętrznego wyjścia "B" licznika TCNT1 (OC1B). Pozostałe dostępne wyprowadzenia portu B (PB.3...PB.5) zarezerwowano dla sygnałów MOSI/MISO/SCK zewnętrznego programatora ISP i są wyprowadzone na wbudowanym w przyrząd złączu P201.
Wyprowadzenia PC.0 i PC.1 portu C zdefiniowano kolejno jako: wejście przetwornika pomiarowego ADC0 oraz sensor przycisku enkodera SW1. Natomiast wyprowadzenia PC.2...PC.5 są wyjściami dla sygnałów sterujących modułem DDS - kolejno: DDS_RESET, DDS_DATA, DDS_FQ_UD oraz DDS_W_CLK.
W dalszej części głównej funkcji programu sterującego następuje inicjalizacja pracy ekranu LCD, enkodera i modułu DDS. Warto tu zwrócić uwagę na fakt, że zaraz po zainicjowaniu obsługi zewnętrznego przerwania INT1 następuje włączenie globalnej flagi przerwań, co jest warunkiem koniecznym poprawnej obsługi enkodera obrotowego SW1 w dalszej części programu. Dodatkowo, zaraz po uruchomieniu modułu DDS zostaje wpisana do niego częstotliwość pracy równa 0 Hz, co sprawia, że fizycznie nie generuje on jeszcze żadnego sygnału.
Następnie realizowane jest ustawianie początkowych wartości kluczowych parametrów roboczych urządzenia. Odbywa się to z wykorzystaniem wbudowanej w mikrokontroler pamięci EEPROM. Najpierw wczytywana jest jednobajtowa flaga, której sześć najmłodszych bitów wskazuje na to, czy poszczególne parametry robocze były już wcześniej (kiedykolwiek) zapisywane w pamięci EEPROM, czy nie. Jeśli tak, to dany parametr roboczy wczytywany jest do odpowiedniej zmiennej z kolejnych komórek pamięci EEPROM. Jeśli nie, to taka zmienna przyjmuje z góry ustaloną wartość domyślną, którą oczywiście można zmienić w trakcie normalnej pracy przyrządu. Opisany proces dotyczy parametrów: eeprom_stamp (wspomniana flaga), mode (tryb pracy urządzenia), Fg, Fg_old, dFg_ind, Fl, Fh, Fw_ind a także dFg, Fw oraz Tw, pobieranych ze stałych tablic programu bazujących na odpowiednich indeksach, załadowanych wcześniej z pamięci EEPROM.
Dalej wyświetlane są dwa ekrany powitalno-informacyjne, z których każdy zawiera po dwie linijki tekstu. Przejście do drugiego ekranu oraz do dalszej części programu następuje w wyniku naciśnięcia (i zwolnienia) przycisku enkodera SW1. Warto tu zwrócić uwagę na sposób programowej obsługi tego zdarzenia. Zwykle, aby uniknąć zjawiska zinterpretowania przez program wielokrotnego naciśnięcia, po zidentyfikowaniu zmiany stanu przycisku wprowadza się programowe opóźnienie za pomocą wbudowanej funkcji bibliotecznej lub po prostu bardzo długiej pętli. Oba te rozwiązania często nastręczają programistom (i późniejszym użytkownikom programu) sporo problemów z uwagi na to, że szybkość (a zatem i czas) wykonywania takich procedur może zależeć nie tylko od szybkości taktowania mikrokontrolera, ale także od rozbudowania kodu (liczby zagnieżdżeń wywoływanych funkcji i pętli) oraz wybranego dla procesu kompilacji poziomu optymalizacji. W grę bowiem wchodzi sposób użycia rejestrów procesora oraz jego stosu. W tej sytuacji najlepszym, często zalecanym przez doświadczonych programistów rozwiązaniem jest użycie do odliczania czasu któregoś z wbudowanych timerów mikrokontrolera lub zastosowanie procedury, która w ogóle nie wymaga odliczania czasu. W tym przypadku zastosowano (i powtórzono z powodzeniem w wielu miejscach omawianego programu) ostatnie z wymienionych podejść. W szczególności, zastosowano dwie nieskończone pętle z użyciem komendy while, z których pierwsza działa tak długo, aż zostanie wykryte naciśnięcia przycisku w SW1, a druga działa do momentu jego zwolnienia. Nie występuje tu ryzyko wpływu drgań styków przycisku, przed skutkami których zapobiega równolegle dołączona do styków pojemność C34.
Po omówionej powyżej wstępnej części programu następuje procedura wyboru trybu pracy przyrządu, dokonywana za pomocą manipulatora SW1. Wstępnie zasugerowane zostanie ustawienie zapamiętane ostatnio w pamięci EEPROM lub (w przypadku pierwszego użycia urządzenia) ustawienie domyślne (tryb generatora). Podobnie jak w przypadku wyświetlania ekranów powitalno-informacyjnych, procesem przejścia do kolejnego etapu programu kierują tutaj dwie nieskończone pętle while, przy czym w pierwszej z nich umieszczono sprawdzanie zachowania enkodera obrotowego oraz reakcję na ewentualną aktywność (zmiana trybu pracy i wizualizacja tej zmiany na ekranie LCD). Zakończeniem tego bloku programu jest aktualizacja w pamięci EEPROM flagi stanu zapamiętania zmiennych roboczych eeprom_stamp oraz zmiennej mode, wskazującej tryb pracy urządzenia.
Gdy już został wybrany tryb pracy urządzenia, za pomocą prostej pary komend if(…) {…} else {…} następuje rozgałęzienie kodu na procedury obsługi generatora albo wobulatora. Po wejściu do trybu generatora pierwszymi czynnościami są: ponowna inicjalizacja modułu DDS, wstępne ustawienie częstotliwości jego pracy (na podstawie uprzednio ustalonej wartości zmiennej Fg) oraz inicjalizacja modułu przetwornika analogowo-cyfrowego ADC w mikrokontrolerze. Następnie rozpoczyna się nieskończona pętla while, wewnątrz której rotacyjnie realizowane są wymienione dalej zadania.
Najpierw następuje wyświetlenie aktualnej wartości Fg. Potem rozpoczyna się kolejna pętla while, którą przerwać może tylko naciśnięcie przycisku enkodera SW1. W ramach tej zagnieżdżonej pętli realizowane są: pomiar i wyświetlanie aktualnej wartości sinusoidalnego napięcia wyjściowego Vout oraz, w odpowiedzi na obracanie pokrętłem enkodera SW1, następuje regulacja częstotliwości Fg (z ustalonym krokiem dFg i wyłącznie w dozwolonych ramach). Jeśli wykryta zostanie zmiana częstotliwości Fg, to jej nowa wartość jest przekazywana do modułu DDS i wyświetlana na ekranie LCD. Tym samym podstawowa robocza pętla generatora zostaje zakończona a po jej opuszczeniu, w kolejnej małej pętli while realizowane jest oczekiwanie na zwolnienie przycisku enkodera. Gdy to już się wydarzy, następuje aktualizacja wartości parametrów: Fg oraz eeprom_stamp w pamięci EEPROM, przy czym bit wskazujący na modyfikację i zapis parametru Fg w zmiennej eeprom_stamp jest uprzednio ustawiany.
Dalej program rozpoczyna kolejną pętlę while, przeznaczoną na zmianę kroku regulacji częstotliwości Fg, czyli dFg. Pętlę tę może przerwać naciśnięcie przycisku enkodera SW1. Tuż przed jej rozpoczęciem następuje wyświetlenie aktualnej wartości dFg. W samej pętli realizowana jest obserwacja tego, czy wystąpiło obracanie pokrętłem enkodera. Jeśli tak, to w dozwolonym zakresie modyfikowana jest wartość parametru dFg_ind, a za nim zmieniana i wyświetlana na ekranie LCD jest wartość docelowego parametru dFg.
Po opuszczeniu pętli modyfikacji dFg, w kolejnej małej pętli while realizowane jest oczekiwanie na zwolnienie przycisku enkodera. Gdy to już się wydarzy, następuje aktualizacja wartości parametrów: dFg_ind oraz eeprom_stamp w pamięci EEPROM, przy czym bit wskazujący na modyfikację i zapis parametru dFg_ind w zmiennej eeprom_stamp jest uprzednio ustawiany. Tym samym zamyka się główna, nieskończona (bez możliwości programowego przerwania) pętla obsługi funkcji generatora.
Tryb pracy wobulatora jest zorganizowany bardzo podobnie do trybu pracy generatora, jednak jest od tego pierwszego znacznie bardziej rozbudowany. Rozpoczyna się on od ponownej inicjalizacji modułu DDS oraz modułu przetwornika analogowo-cyfrowego ADC w mikrokontrolerze. Dalej następuje konfiguracja i inicjalizacja przetwornika PWM - z użyciem licznika TCNT1, kanału OCR1B i pinu PB.2 mikrokontrolera, przy czym parametr OCR1B zostaje ustawiony na wartość 0 - tak, aby na wyjściu SYNCHRO przyrządu panowało stałe napięcie 0 V. Na koniec tej części podprogramu obsługi wobulatora następuje konfiguracja timera TCNT0, używanego dalej do precyzyjnego odmierzania opóźnień w głównej pętli roboczej wobulatora.
Następnie rozpoczyna się nieskończona pętla while, wewnątrz której rotacyjnie realizowane są kolejno wymienione dalej zadania. Najpierw następuje wyświetlenie aktualnych wartości częstotliwości granicznych wobulacji: Fl oraz Fh. Następnie, w pętli for o Fg_tab_MAX w krokach tablicowane są wartości częstotliwości Fg, używane podczas regularnych cykli wobulacji. Takie podejście pozwoliło na znaczne zwiększenie maksymalnych osiąganych szybkości wobulacji, dzięki znacznemu skróceniu czasu trwania jej elementarnego kroku.
Przed wejściem do głównej pętli wobulacji realizowane są jeszcze: globalna blokada przerwań (celem uniknięcia zaburzeń w procesach: konfiguracji kanału PWM1B oraz timera TCNT0) a także ustawienie wartości rejestru OCR0A w timerze TCNT0 na obraną wcześniej wartość Tw (okres wobulacji)- koniecznie po wstępnej konfiguracji TCNT0, ale przed jego startem. Potem rozpoczyna się zewnętrzna większa pętla wobulacji z zastosowaniem instrukcji for, dla której celowo nie ustawiono żadnego możliwego warunku ani ograniczenia.
Wewnątrz pętli większej umieszczona jest mniejsza pętla for w zakresie 0...Fg_tab_MAX. Dla każdej z nich kolejno ustawiane są: wartość wyjścia przetwornika DAC/PWM (parametr OCR1B) oraz częstotliwość pracy modułu DDS (na podstawie wartości pobranej z tablicy Fg_tab[]) a następnie uruchamiany jest timer TCNT0. Dalej w pustej pętli while sprawdzany jest warunek równości TCNT0==OCR0A, którego spełnienie oznacza, że odmierzone zostało opóźnienie czasowe, niezbędne do uzyskania właściwej częstotliwości wobulacji Fw.
Po zakończeniu mniejszej pętli for następuje czasowe wyłączenie generowania sygnału przez moduł DDS oraz wyzerowanie rejestru OCR1B, co spowoduje pojawienie się napięcia 0 V na wyjściu "SYNCHRO" przyrządu. Tym samym, mierzony układ zewnętrzny uzyska czas niezbędny do wygaśnięcia jego odpowiedzi częstotliwościowej a zastosowany oscyloskop otrzyma sygnał nakazujący powrót rysującej plamki do początkowej pozycji na osi X.
Obie pętle robocze for (większą i mniejszą) może przerwać naciśnięcie przycisku enkodera SW1. Jeśli ono nastąpi, wówczas rozpocznie się pusta pętla while, testująca zwolnienie przycisku, po którym to zdarzeniu z kolei nastąpi globalne odblokowanie przerwań mikrokontrolera i - tym samym - zakończenie głównej procedury obsługi procesu wobulacji oraz przejście do potencjalnych działań regulacyjnych.
W tym miejscu należy podkreślić fakt, że globalne zablokowanie przerwań na czas realizacji głównej procedury obsługi procesu wobulacji wyłącza także możliwość śledzenia zdarzeń związanych z obracaniem pokrętłem enkodera mechanicznego SW1. Z jednej strony eliminuje to wpływ niepożądanych opóźnień na regularność cykli wobulacji, z drugiej jednak uniemożliwia regulację jakiego kolwiek parametru wobulacji podczas jej trwania. Jest to swego rodzaju namiastka pracy programu w trybie czasu rzeczywistego, tzn. z deterministycznym czasem realizacji zadania - jak w systemach operacyjnych czasu rzeczywistego RTOS.
Po opuszczeniu głównej procedury obsługi procesu wobulacji program rozpoczyna pętlę while, przeznaczoną zmianie kroku regulacji częstotliwości Fg, czyli dFg. Jest ona wykonywana całkowicie analogicznie tak, jak w przypadku omówionego wcześniej podprogramu obsługi funkcji generatora i dlatego nie będzie tu szczegółowo opisywana.
W kolejnych dwóch blokach programu głównego wobulatora przetwarzane są zmiany częstotliwości krańcowych wobulacji: dolnej Fl oraz górnej Fh. Procesy te są realizowane bardzo podobnie do procesu regulacji częstotliwości Fg w trybie pracy generatora, jednak z kilkoma istotnymi różnicami. Po pierwsze, obie wartości parametrów są przetwarzane w osobnych procedurach i wizualizowane na osobnych ekranach. Po drugie, ich zmiany nie pociągają za sobą żadnych bezpośrednich zmian w sposobie pracy modułu DDS, który poza główną pętlą wobulacji jest nieaktywny. Z tego też powodu nie jest na bieżąco mierzone i wyświetlane napięcie Vout wyjściowego sygnału sinusoidalnego. Dodatkowo, mechanizmy kontroli dozwolonych wartości parametrów Fl i Fh uwzględniają także konieczność spełnienia warunku: Fh>Fl. Oczywiście, ustawiane są także inne (odpowiednie) flagi bitowe w zmiennej eeprom_stamp.
W następnym bloku programowym realizowana jest zmiana częstotliwości wobulacji Fw. Tu występuje bardzo silne podobieństwo do procedury zmiany kroku regulacji częstotliwości dFg, bowiem w dozwolonych granicach modyfikowany jest indeks Fw_ind, wskazujący na właściwe parametry w tabelach: Fw_tab oraz Tw_tab. Należy tu wyjaśnić, że rzeczywistym parametrem roboczym, ustalanym w efekcie pracy omawianej tutaj procedury, jest Tw=Tw_tab[Fw_ind], natomiast parametr Fw=Fw_tab[Fw_ind] jest wyznaczany jedynie w celu wizualizacji dla użytkownika przyrządu. Parametr Tw ma bowiem realny wpływ na czas trwania elementarnego kroku (a więc i całego pojedynczego cyklu) wobulacji. Na koniec tego bloku programowego aktualizowana jest oczywiście także odpowiednia flaga bitowa w zmiennej eeprom_stamp.
Ostatni blok programowy (w ramach pełnego cyklu obsługi wobulatora) służy regulacji, pomiarowi i wyświetlaniu na bieżąco na ekranie LCD wartości sinusoidalnego napięcia wyjściowego Vout. Regulacja i pomiar odbywają się na środku przemiatanego pasma częstotliwości, czyli dla Fg=(Fl+Fh)/2. Takie rozwiązanie obrano przede wszystkim dlatego, że w przypadku znacznej szerokości przemiatanego pasma odczyt wartości Vout mógłby być mało czytelny - głównie z uwagi na potencjalne fluktuacje tego napięcia w trakcie przemiatania. Dodatkowo, wynik pomiaru byłby silnie zakłócany poprzez wyłączenie wyjścia modułu DDS na czas po zakończeniu poprzedniego a przed rozpoczęciem nowego cyklu wobulacji (czas martwy). Ten blok programowy nie kończy się żadnym wpisem do pamięci EEPROM, ponieważ potencjalny efekt jego działania zostaje trwale odzwierciedlony poprzez nastawę potencjometru PR3 regulacji napięcia Vout.
W tym miejscu zamyka się główna, nieskończona (bez możliwości programowego przerwania) pętla obsługi trybu wobulatora i, po przejściu pełnego cyklu nastaw wszystkich parametrów wobulacji, program wraca do bloku regularnego generowania sygnału wyjściowego w trybie przemiatania.
Pliki źródłowe: AVT-5980-lcd.c oraz AVT-5980-lcd.h zawierają zasoby niezbędne do obsługi użycia alfanumerycznego wyświetlacza LCD 2×16 ze sterownikiem zgodnym z HD44780. Ponieważ ich zawartość nie jest esencjonalna z punktu widzenia głównych zadań prezentowanego przyrządu, nie będzie tu szczegółowo omawiana. Warto jednak krótko wspomnieć o trzech istotnych funkcjach, używanych w pozostałej części oprogramowania: InitLcd(), InstLcd() oraz PutsLcd(). Pierwsza z nich inicjuje pracę modułu LCD i powinna zostać użyta przed wysłaniem do wyświetlacza jakichkolwiek innych poleceń lub danych. Druga z wymienionych funkcji jest używana do przesyłania do modułu LCD komend sterujących, np. umieszczających kursor ekranowy na początku linii x (LCDLINEx). Trzecia funkcja wyświetla na ekranie LCD wskazany ciąg tekstowy, umieszczony w pamięci RAM mikrokontrolera.
Plik źródłowy AVT-5980-functions.c zawiera funkcje pomocnicze, niezbędne do sterowania urządzeniem, a zdefiniowany dla niego plik nagłówkowy AVT-5980-functions.h ujmuje definicje stałych literałów oraz deklaracje wspomnianych funkcji, niezbędne do prawidłowej kompilacji głównego pliku źródłowego.
Funkcje te to kolejno:
ext_int1_init() - definicja obsługi zewnętrznego przerwania INT1,
dds_init() - inicjalizacja modułu DDS,
dds_freq_set() - ustawianie roboczej częstotliwości pracy modułu DDS,
F_show() - wyświetlanie aktualnej wartości częstotliwości Fg, Fl lub Fh na ekranie LCD,
dFg_show() - wyświetlanie aktualnej wartości kroku regulacji częstotliwości dFg,
Fw_show() - wyświetlanie aktualnej częstotliwości wobulacji Fw,
adc_init() - konfiguracja i inicjalizacja przetwornika analogowo-cyfrowego ADC,
adc_read() - próbkowanie i odczyt wartości z wybranego kanału przetwornika ADC,
Vout_measure() - pomiar aktualnego sinusoidalnego napięcia wyjściowego Vout,
Vout_show() - wyświetlanie aktualnego napięcia Vout,
pwm_init() - konfiguracja i inicjalizacja przetwornika DAC/PWM,
tc0_config() - konfiguracja licznika/timera TCNT0,
tc0_start() - start licznika/timera TCNT0,
tc0_stop() - zatrzymanie licznika/timera TCNT0.
Ich partykularne użycie oraz sposób działania są dość szczegółowo udokumentowane w poszczególnych plikach źródłowych i dlatego nie będą tu dalej szerzej omawiane.
Do prostej i wygodnej kompilacji oraz linkowania pliku wykonywalnego (do wgrania do mikrokontrolera) został zastosowany pracujący w środowisku Linux program make, dla którego opracowany został dedykowany plik konfiguracyjny Makefile. Produktem jego działania jest m.in. plik wynikowy w formacie z rozszerzeniem *.hex, przeznaczony do załadowania do mikrokontrolera. Oba wymienione tutaj pliki zostały załączone do oprogramowania będącego częścią tego projektu.
Montaż i uruchomienie
Układ generatora należy zmontować na dwóch dwustronnych płytkach drukowanych, które pokazano na rysunkach 7 i 8.
Szczegóły montażu płytki głównej zostały pokazane na fotografii 4. Została ona zrealizowana na dwuwarstwowej płytce drukowanej, umieszczonej poziomo w obudowie urządzenia i połączonej z płytką sterującą za pomocą kątowych złączy typu "goldpin". Na płytce znajdują się m.in. blok zasilania urządzenia oraz wszystkie bloki wykonawcze. Płytka sterująca zawiera mikrokontroler i elementy manipulacyjne. Płytkę drukowaną sterowania zamocowano: u dołu do płyty głównej za pomocą trzech par złączy krawędziowych (P5+P11, P6+P10 i P7+P9) oraz od przodu do czołowego panelu przyrządu - fotografia 5. Na fotografii tytułowej oraz na fotografii 6 pokazano sposób wykorzystania przedniego i tylnego panelu obudowy. Przykładowe wzory opisów na panele załączono w materiałach dodatkowych do projektu.
Uruchomienie poprawnie zmontowanego urządzenia nie powinno nastręczać większych trudności. Montaż elementów rozpoczynamy tradycyjnie od elementów najniższych (rezystory, dławiki i diody) i kolejno montujemy elementy coraz wyższe (podstawki pod układy scalone, kondensatory, potencjometry, tranzystory i wszelkie elementy łącznikowe), zwracając uwagę na to, by nie pomylić ich wartości i polaryzacji. Kolejność przygotowania obu PCB nie jest zbyt istotna, bowiem żadna z nich nie jest w stanie samodzielnie funkcjonować bez drugiej z płytek. Jakkolwiek rozsądnym podejściem wydaje się zmontowanie i uruchomienie w pierwszej kolejności płytki głównej oraz przetestowanie poprawności pracy bloku zasilającego ze stabilizatorami liniowymi U1 i U2, podającego napięcia +5 V i +9 V dla całego przyrządu. Elementy U1 i U2 należy wyposażyć w niewielkie radiatory.
Całe urządzenie powinno być zasilane napięciem stałym +11...14 V (optymalnie: +12 V) ze źródła o wydajności prądowej około 500 mA. W testach roboczych układ nie pobierał nigdy prądu większego od 250 mA, ale warto dysponować pewnym zapasem, gwarantującym poprawność pracy stabilizatorów scalonych. Po sprawdzeniu napięć zasilających +9 V i +5 V warto skontrolować stałoprądowe punkty pracy wzmacniacza sygnału sinusoidalnego z tranzystorami Q1...Q3. Napięcia na wyprowadzeniach tych tranzystorów, z dokładnością rzędu 0,1...0,2 V (maksymalnie), wynikającą z tolerancji parametrów zastosowanych elementów, powinny być następujące: Vb(Q1)≈2,1 V; Ve(Q1)≈1,4 V; Vc(Q1)=Vb(Q2)≈6,7 V; Ve(Q2)≈7,4 V; Vc(Q2)=Vb(Q3)≈2,5 V; Ve(Q3)≈1,8 V; Vc(Q3)=5,5 V.
Gniazda montażowe dla modułów DDS należy wykonać z przyciętych na odpowiednią długość (liczba pinów) i oszlifowanych odcinków żeńskich listew typu "goldpin". W przypadku modułu typu "A" wystarczą listwy jednorzędowe, natomiast w przypadku modułu typu "B" jedno z gniazd wykonujemy z listwy dwurzędowej lub sklejamy ją na potrzebny rozmiar z dwóch listew jednorzędowych (najlepiej ostrożnie za pomocą kleju cyjanoakrylowego, np. "Cyjanopan", "Kropelka" czy "SuperGlue"). Jeśli jesteśmy zdecydowani na zastosowanie jednego, konkretnego typu modułu DDS, to oczywiście wystarczy przygotowywanie i montaż gniazd jednego rodzaju.
Po zmontowaniu i wstępnym uruchomieniu (bez zainstalowanego modułu DDS) płytki głównej urządzenia należy przystąpić do montażu płytki sterowania, mocowanej do przedniego panelu urządzenia (rysunek 8 i fotografia 5). Kolejność montażu powinna być podobna, jak w przypadku głównej płyty urządzenia: od elementów najmniejszych do największych. 16-pinowe gniazdo dla wyświetlacza LCD (U11) należy przyciąć z odpowiedniego odcinka żeńskiej listwy typu "goldpin". Natomiast wyprowadzenia do montażu potencjometru regulacyjnego poziomu sygnału sinusoidalnego PR3 wykonujemy z pięciu segmentów odcinka męskiej listwy typu goldpin, po usunięciu (wyciągnięciu) zbędnych pinów: drugiego i czwartego.
Warto zadbać o solidne zamontowanie enkodera obrotowego z przyciskiem (SW1), który powinien mieć starannie przylutowane nie tylko wyprowadzenia elektryczne, ale także dwa metalowe mocowania mechaniczne (enkoder będzie ulegał dość znacznym naprężeniom mechanicznym przy naciskaniu przycisku). Na fotografii 5 pokazano także montaż potencjometru PR2, odpowiedzialnego za regulację kontrastu wyświetlacza LCD. Celowo zamontowano go na tylnej stronie PCB sterowania po to, aby ułatwić proces regulacji w całkowicie zmontowanym urządzeniu.
Rezystor R21, ograniczający prąd podświetlenia wyświetlacza LCD (U11), miał w modelowym wykonaniu wartość 10 Ω, jednak jego optymalna rezystancja (dla danego typu ekranu LCD) może być inna. W szczególności, element ten może okazać się zbędny, jeśli wyświetlacz ma wbudowane ograniczenie (źródło) prądowe dla podświetlenia LED. Warto to sprawdzić przed zamontowaniem U11 i R21 na stałe.
Po zmontowaniu obu PCB należy przystąpić do wykonania ich połączeń mechaniczno-elektrycznych. Do ich realizacji należy zastosować odcinki kątowych żeńskich oraz prostych męskich (albo odwrotnie) listew typu "goldpin". Za ich pomocą łączymy parami porty: P5 i P11, P6 i P10 oraz P7 i P9. Te czynności montażowe należy wykonać bardzo starannie z uwagi na pewność i trwałość wymienionych połączeń w trakcie całego okresu eksploatacji urządzenia. Po wprowadzeniu dokładnie przyciętych listew do głównej PCB zalutowujemy je od spodu, pilnując tego, by montaż został wykonany pod kątem prostym do płytki (można wstępnie punktowo dokleić wszystkie listwy do PCB za pomocą kleju cyjanoakrylowego).
Poprawnie zmontowane urządzenie zapewne z łatwością zmieści się w obudowie Z3A produkcji firmy KRADEX (lub większej) a zapewnione na obu PCB otwory montażowe powinny znacznie ułatwić solidny montaż mechaniczny. Wstępne, pełne uruchomienie urządzenia powinno zostać wykonane przed ostatecznym zamontowaniem go w obudowie. Ten etap zostanie opisany w kolejnej części artykułu.
Adam Sobczyk SQ5RWQ
sq5rwq@gmail.com
- R1: 510 Ω
- R2: 82 Ω
- R4: 68 Ω
- R5: 10 kΩ
- R6: 15 kΩ
- R7, R10: 150 Ω
- R8: 10 Ω
- R9: 240 Ω
- R11: 15 Ω
- R12: 33 Ω
- R14, R15, R103: 2,2 kΩ
- R17, R18, R19: 10 kΩ
- R20: 2,2 kΩ
- R21: 10 Ω
- R22, R23: 22 kΩ
- R101, R102 100 Ω
- R104: 1M Ω
- R105: 2,7 kΩ
- R106: 100 kΩ
- R107, R108: 10 kΩ/1%
- PR1: 20 kΩB (liniowy, montażowy, w obudowie RM-065)
- PR2: 10 kΩB (liniowy, montażowy, w obudowie RM-065)
- PR3: 1 kΩB (liniowy, obrotowy, wyprowadzany na przedni panel)
- C1: 47uF/16V
- C2, C4, C5: 470 nF/50 V
- C3, C6, C12: 100 μF/16 V
- C7: 470uF/16V
- C8, C10, C19, C22, C24, C105, C110,C36, C37, C38, C41: 100 nF/50 V
- C11: 150pF/50V
- C15, C20, C21, C109, C23: 10 μF/16 V
- C16, C101, C103, C34, C42, C43: 10 nF/50 V
- C17: 47 pF/50 V
- C18: 330 pF/50 V
- C25, C26, C35: 68 nF/50 V
- C32, C33, C102, C104, C106: 1 nF/50 V
- C39, C40: 22 pF/50 V
- C107, C108: 1 μF/50 V
- C111: 4,7 μF/16 V
- L4: 3,3 μH (osiowy)
- L5: 4,7 μH (osiowy)
- L6, L103: 10 μH (osiowy)
- L101: 100 μH/0,5 A (pionowy, okrągły na rdzeniu ferrytowym)
- L102 2,2 μH (osiowy)
- D101, D201, D202: BAT85 (DO-35)
- Q1: 2N3904 (NPN, TO-92)
- Q2: 2N3906 (PNP, TO-92)
- Q3: BC141-16 lub 2N2219A (TO-39)
- U1: LM7809 (TO-220)
- U2: LM7805 (TO-220)
- U3: 74HC00 (DIP-14)
- U4, U101: MCP6002 (DIP-8)
- U5: Moduł DDS z AD9850 typu "A"
- U6: Moduł DDS z AD9850 typu "B"
- U10: ATmega328-PU (DIP-28)
- U11: Wyświetlacz LCD 16×2, zgodny z HD44780
- JP201: Złącze goldpin proste męskie (3 piny) + zworka (na 2 piny)
- P1: Złącze śrubowe ARK-2 (raster 5 mm)
- P2, P3, P4: Gniazda BNC 50 Ω (mocowane do panelu) + złącza goldpin męskie 2 piny
- P5: Złącze goldpin kątowe męskie (5 pinów)
- P6: Złącze goldpin kątowe męskie (6 pinów)
- P7: Złącze goldpin kątowe męskie (7 pinów)
- P9: Złącze goldpin proste żeńskie (7 pinów)
- P10: Złącze goldpin proste żeńskie (6 pinów)
- P11: Złącze goldpin proste żeńskie (5 pinów)
- P201: Złącze IDC kątowe, poziome, męskie 2×5 pinów
- SW1: Enkoder obrotowy mechaniczny z przyciskiem (20...24 imp./obr.)
- X1: Rezonator kwarcowy 16 MHz (obud. HC-49 niska) z podkładką izolacyjną
- Obudowa wentylowana Z1A KRADEX lub o zbliżonych parametrach
- Gniazdo zasilania np. koncentryczne 5,5/2,1 mm, montowane na panelu
- Włącznik zasilania 12 V/0,5 A
- Podstawki pod układy scalone: U3, U4, U10, U101
- Radiatory do obudów TO-220, małe, 2 szt.
- Gałki na PR3 i SW1 stosownie do wymiarów i rozmieszczenia elementów
- Śruby, nakrętki i podkładki M2,5/M3 (wg opisu w tekście)
- Srebrzanka 0,7 mm, ok. 0,5 m
- Listwy goldpin proste żeńskie (50 pinów, 2 szt.) do użycia w gniazdach do podłączenia U5/U6 i U11