Modułowy odbiornik nasłuchowy na pasma 80 m i 40 m „Dosia”. Mikroprocesorowy moduł kontrolno-sterujący (1)

Modułowy odbiornik nasłuchowy na pasma 80 m i 40 m „Dosia”. Mikroprocesorowy moduł kontrolno-sterujący (1)
Pobierz PDF Download icon

Przedostatnia część publikacji o odbiorniku nasłuchowym na pasma KF 40m i 80m „Dosia” opisuje projekt mikroprocesorowego modułu kontrolno-sterującego, przeznaczonego do pomiaru częstotliwości pracy VFO, a także nastawiania i zapamiętywania kluczowych parametrów pracy urządzenia. Tak, jak większość innych modułów w projekcie odbiornika „Dosia”, może być on z powodzeniem zastosowany w innych urządzeniach homodynowych na podane pasma, a po wprowadzeniu drobnych modyfikacji w oprogramowaniu sterującym, także w wybranych urządzeniach heterodynowych. Publikację zamknie, obiecany czytelnikom, szczegółowy opis montażu całości urządzenia w dedykowanej obudowie, wraz z projektem estetycznego, dopasowanego panelu czołowego.

Podstawowe parametry:
  • pomiar częstotliwości pracy VFO (na obu pasmach: 40 m oraz 80 m),
  • zapamiętywanie kluczowych trybów pracy,
  • możliwość zaadaptowania do innych konstrukcji,
  • zasilanie 5 V DC.

Na rysunku 1 zaprezentowano schemat blokowo-montażowy odbiornika „Dosia”, uzupełniony o mikroprocesorowy moduł kontrolno-sterujący (AVT3198) wraz z dedykowanymi połączeniami z pozostałymi modułami całego projektu.

Rysunek 1. Schemat blokowo-montażowy odbiornika „Dosia” 40/80 m

Z kolei rysunek 2 prezentuje schemat elektryczny urządzenia. W dalszej części artykułu opisano techniczne podstawy działania tego modułu, a w kolejnej części artykułu zostaną pokazane szczegóły jego montażu i uruchomienia oraz możliwości zastosowania w innych projektach.

Rysunek 2. Schemat elektryczny modułu kontrolno-sterującego

Zasada działania i właściwości modułu kontrolno-sterującego

Do podstawowych funkcji modułu kontrolno-sterującego należą: pomiar częstotliwości pracy VFO (na obu pasmach: 40 m oraz 80 m) oraz nastawianie i zapamiętywanie kluczowych trybów pracy: wybranego pasma, typu filtru audio (dla emisji fonicznej SSB lub telegraficznej CW) oraz stanu pracy układu Automatycznej Regulacji Wzmocnienia (AGC: On lub Off). Pomiar częstotliwości pracy VFO, ze względu na ograniczenia techniczne zastosowanego prostego mikrokontrolera AVR ATmega8A, taktowanego zegarem o częstotliwości Fc=16 MHz, jest możliwy dla częstotliwości poniżej wartości Fc/2 (czyli mniej niż 8 MHz). Dlatego też poniżej tej częstotliwości układ może być opcjonalnie zastosowany (po drobnych modyfikacjach w oprogramowaniu sterującym mikrokontrolerem) również w innych urządzeniach radiokomunikacyjnych, w których zastosowano przemianę częstotliwości (heterodynach).

W przypadku współpracy modułu AVT3198 z układami VFO, które generują sygnały o niższych amplitudach i/lub nie posiadają dedykowanego wzmacniacza buforowego, chroniącego stabilność pracy generatora VFO przed konsekwencjami obciążenia go wejściem pomiarowym omawianego modułu, możliwe jest zastosowanie opcjonalnego, maksymalnie trzystopniowego bloku wzmacniaczy wstępnych. Ich ostatni stopień jest w stanie uformować stabilny sygnał cyfrowy, nadający się do bezpośredniego pomiaru częstotliwości przez mikrokontroler.

Na rysunku 2 pokazano schemat elektryczny omawianego modułu z wydzielonymi poszczególnymi blokami funkcjonalnymi. Zasilanie stabilizowane +5 V DC jest podawane na port P1, za którym umieszczono czwórnik filtrujący z elementami C1, C2, L1 i C3, pracujący w topologii tzw. PI-filtru. Jego zadaniem jest dwukierunkowa separacja źródła głównego napięcia zasilającego +5 V od potencjalnych zakłóceń impulsowych, pochodzących od mikrokontrolera (U1) oraz wyświetlacza LCD (U2). Zakłócenia mogłyby przenikać do obwodów modułów: filtrów wejściowych w.cz., mieszacza i amplifiltrów oraz generatora VFO i być wyraźnie słyszalne podczas pracy odbiornika.

Od strony wejścia zasilania modułu (port P1) zastosowano parę kondensatorów: elektrolityczny C1 (47 μF) oraz ceramiczny C2 (100 nF), które zapewniają skuteczne blokowanie do masy zakłóceń impulsowych w bardzo szerokim zakresie częstotliwości. Natomiast po stronie odbiorników zasilania zastosowano tylko jeden kondensator elektrolityczny C3 (47 μF), jednak ze świadomością, że każdy z zasilanych bloków w tym module ma zasilanie blokowane dla zakłóceń impulsowych dedykowanym kondensatorem lub kondensatorami ceramicznymi – tuż przy miejscu wprowadzenia zasilania do danego bloku. Oba filtracyjne dwójniki pojemnościowe są od siebie dodatkowo odseparowane dławikiem L1 (10 μH), który poprawia skuteczność tej separacji dla zakłóceń wyższych częstotliwości.

Sercem omawianego modułu jest blok mikrokontrolera U1 z wyświetlaczem LCD U2. Zasilanie mikrokontrolera, podawane na pin nr 7 (wejście VCC), jest blokowane do masy (dla zakłóceń impulsowych) pojemnością C4 (100 nF), a sam mikrokontroler jest taktowany z wykorzystaniem rezonatora kwarcowego X1 (16 MHz) i pomocniczych pojemności C8 i C9 (22 pF), podłączonych do pinów 9 i 10 (porty XTAL1/XTAL2). Piny 2...4 mikrokontrolera (porty PD0...PD2) zostały skonfigurowane i wykorzystane jako wejścia dla mikroprzełączników (przycisków) monostabilnych (SW1...SW3), które są odpowiedzialne za przełączanie pasma pracy odbiornika, wybór odpowiedniego amplifiltra oraz załączanie układu automatycznej regulacji wzmocnienia (rysunek 3). Kondensatory C5...C7 (10 nF) zapobiegają powstawaniu stanów nieustalonych na stykach przycisków.

Rysunek 3. Funkcje przycisków i prezentacja informacji na wyświetlaczu

Nastawienia wybrane wymienionymi przyciskami są zapamiętywane w pamięci EEPROM mikrokontrolera U1 (dostępne po wyłączeniu i ponownym włączeniu zasilania odbiornika). Ich wartości są niemal natychmiast odzwierciedlane w postaci odpowiednich sterujących poziomów logicznych (0/+5 V), wystawianych na pinach 5, 6 i 12 (porty PD3, PD4 i PD6). Są one podłączone do wyjść P2...P4 modułu AVT3198, dedykowanych sterowaniu zewnętrznych modułów: filtrów w.cz., mieszacza z amplifiltrami, generatora VFO i automatycznej regulacji wzmocnienia.

Wyświetlacz alfanumeryczny LCD (U2, 2×8 znaków) wyposażony jest w 16 wyprowadzeń. Piny 1...3 (Vss, Vcc i V0) podłączone są kolejno do: masy (GND), zasilania (+5 Vdc) oraz suwaka potencjometru montażowego RV1 (10 kΩ), którego zadaniem jest ustawienie poprawnego kontrastu wyświetlacza. Kondensator C10 (100 nF) blokuje lokalnie zasilanie wyświetlacza dla zakłóceń impulsowych. Piny 23...25 mikrokontrolera U1 (porty PC0...PC2) sterują wejściami RS, R/W i E wyświetlacza LCD (piny 4, 5 i 6 U2). Dane do wyświetlenia przesyłane są do wyświetlacza LCD z portów PB0...PB3 mikrokontrolera U1 (piny 14...17) na porty DB4...DB7 modułu U2 (piny 11...14).

Natomiast porty DB0...DB3 wyświetlacza LCD (piny 7...10) nie są wykorzystywane i dla zachowania stabilności sterowania (w przypadku różnych wykonań tego rodzaju wyświetlaczy) zostały trwale podłączone do masy zasilania.

Piny 15 i 16 wyświetlacza (LEDA oraz LEDK) są wyprowadzeniami anody i katody podświetlenia LCD. Katodę podłączono do masy modułu, natomiast anodę, przez rezystor R1 (10 V), do szyny zasilania +5 V DC. Niektóre moduły LCD są fabrycznie wyposażone w ograniczenie (źródło) prądowe podświetlenia LED i wówczas rezystor R1 może okazać się zbędny (w jego miejsce należy zastosować zworę). Ewentualnie, jeśli chcemy jednak zmniejszyć intensywność podświetlenia, można w jego miejsce zastosować opornik o innej, niż zaproponowana tutaj, wartości.

Piny mikrokontrolera U1: 1, 13, 18, 19, 26, 27 i 28 (porty: PC6, RESET, PD7, PB4, PB5, PC3, PC4 i PC5) pozostawiono niewykorzystane i niepodłączone, natomiast piny 20...22 (porty: AVCC, AREF i AGND), dedykowane do współpracy z wewnętrznym przetwornikiem analogowo-cyfrowym ADC, zgodnie z zaleceniem producenta zostały podłączone do zasilania +5 V DC lub masy układu GND (główną masę cyfrową mikrokontrolera podano na pin nr 8).

Wejściem do pomiaru częstotliwości pracy generatora VFO jest pin 11 mikrokontrolera (port PD5/T1), który został skonfigurowany programowo jako wejście wewnętrznego timer’a T1 w układzie U1. Zostało ono na stałe połączone elektrycznie z portem P7 omawianego tutaj modułu kontrolno-sterującego, opisanym na schemacie elektrycznym jako wejście pomiarowe „C”. Wejście to służy do bezpośredniego podłączenia wyjścia sygnału cyfrowego z modułu generatora VFO. Jest ono także na stałe elektrycznie podłączone do wyjścia opcjonalnego bloku wzmacniaczy wstępnych, którego przeznaczeniem jest zapewnienie odpowiedniego wzmocnienia, separacji i znacznej impedancji wejściowej w przypadku podłączenia omawianego modułu do wyjścia innego układu generatora VFO.

Blok ten został podzielony na dwa stopnie. Pierwszy z nich stanowi prosty wtórnik napięciowy o bardzo wysokiej impedancji wejściowej. Na jego wejście pomiarowe „A” (port P5 omawianego modułu) mierzony sygnał częstotliwościowy podawany jest dalej poprzez niewielką pojemność sprzęgającą C13 (10 pF lub inną, dobraną do konkretnego zastosowania) i trafia na bramkę tranzystora polowego N-JFET Q1 (BF245B). Jest ona spolaryzowana potencjałem masy układu przez znaczną rezystancję R5 (3,3 MΩ). Dren tranzystora Q1 jest podłączony do zasilania modułu +5 V DC, natomiast jego źródło łączy się z masą układu poprzez rezystor R6 (2,2 kΩ), gdzie dostępny jest buforowany sygnał mierzony. Dalej, poprzez niewielki kondensator sprzęgający C15 (10 pF lub inny, dobrany do danego zastosowania) mierzony sygnał trafia na wejście kolejnego stopnia wzmacniającego z tranzystorem bipolarnym Q2 (BC547B). Rezystory R3 (47 kΩ) i R7 (15 kΩ) stanowią dzielnik oporowy, polaryzujący bazę tranzystora Q2. Prąd roboczy kolektora Q1 ogranicza oporność emiterowa R8 (330 Ω), która wraz z indukcyjnością L2 (33 μH lub dobraną do partykularnych potrzeb) ustala także wzmocnienie napięciowe tego stopnia wzmacniającego.

Wzmocniony napięciowo sygnał mierzony, poprzez pojemność sprzęgającą C14 (150 pF lub dobraną do potrzeb), trafia na ostatni stopień wzmacniający. Pracuje on w klasycznym układzie wspólnego emitera z tranzystorem bipolarnym Q3 (BC547B) i rezystorem kolektorowym R2 (1 kΩ). Zadaniem tego stopnia jest nie tylko dalsze wzmocnienie sygnału mierzonego i zapewnienie dla niego stosunkowo niskiej impedancji wyjściowej, ale także uformowanie go do postaci sygnału prostokątnego (cyfrowego) o poziomach zbliżonych do 0/+5 V. Dlatego właśnie do rezystora R4 (100 kΩ), polaryzującego bazę tranzystora Q3 z kolektora tego tranzystora, równolegle dołączona została dioda Schottky D1 (BAT85), której zadaniem jest zapobieganie wchodzeniu Q3 w stan głębokiego nasycenia, którego wystąpienie znacznie spowalnia proces przełączania (a dokładnie: wyłączania) tranzystora. Działa to tak, że w momencie wchodzenia tranzystora w stan nasycenia potencjał jego kolektora zbliża się do wartości 0 V i wówczas dioda D1 zaczyna przewodzić (z napięciem około 0,2...0,3 V). Powoduje to obniżanie potencjału bazy Q3 i lekkie przytykanie tego tranzystora. Ostatecznie, przy potencjale bazy Q3 równym około 0,6 V i napięciu przewodzenia D1 równym około 0,2 V, potencjał kolektora Q3 nie spadnie znacznie poniżej 0,6–0,2=0,4 V, co oznacza, że tranzystor Q3 nie wchodzi w stan głębokiego nasycenia. Zasilanie opcjonalnego bloku wzmacniaczy wstępnych skutecznie blokuje do masy dla zakłóceń impulsowych i w.cz. para kondensatorów C11 (100 nF) i C12 (10 nF).

Należy jeszcze wyjaśnić jedną kwestię – jeśli chcemy mierzyć częstotliwość zewnętrznego sygnału cyfrowego (o poziomach logicznych), to wystarczy podać go na wejście pomiarowe „C” (port P7) omawianego modułu i wówczas nie należy montować opcjonalnych wzmacniaczy z tranzystorami Q1...Q3. Jeśli jednak istnieje potrzeba separacji, wzmocnienia i uformowania do poziomów cyfrowych zewnętrznego sygnału w.cz., to należy zrealizować część układu z tranzystorami Q2...Q3 (i elementami towarzyszącymi), a zewnętrzny sygnał mierzony wprowadzić na wejście pomiarowe „B” (port P6). Ostatecznie, jeśli okazałoby się, że ten blok nazbyt obciąża i destabilizuje zewnętrzny generator VFO, to dopiero wtedy należy zrealizować dodatkowy wzmacniacz bufor-separator z tranzystorem polowym Q1, a sygnał mierzony wprowadzić na wejście pomiarowe „A” (port P5). Oczywiście, nie ma potrzeby montażu niewykorzystywanych dwóch spośród trzech złączy P5...P6.

Na schemacie elektrycznym modułu AVT3198 ujęto także otwory mocujące (montażowe) J1...J4, zlokalizowane w narożnikach PCB tego modułu. Warto pamiętać o tym, że ich skuteczne połączenie nie tylko mechaniczne, ale także elektryczne (galwaniczne) z dedykowaną płytką podstawy całego odbiornika (a więc i jego rozproszoną masą oraz ekranem) jest istotnym elementem ochrony pozostałych bloków odbiornika (a w szczególności tych, w których przetwarzane są słabe sygnały) przed zakłóceniami cyfrowymi i impulsowymi.

Oprogramowanie kontrolno-sterujące

Oprogramowanie kontrolno-sterujące ma za zadanie monitorować, zapamiętywać oraz odwzorowywać stan przycisków tryby pracy odbiornika (wybranego pasma, typu filtru audio oraz włączenia układu Automatycznej Regulacji Wzmocnienia), a także dokonywać pomiaru częstotliwości pracy generatora VFO i sukcesywnie wyświetlać jej wartość na ekranie LCD. Jego kod źródłowy składa się z trzech modułów: głównego programu sterującego, bloku pomiaru częstotliwości oraz bloku obsługi wyświetlacza LCD.

Główny program sterujący rozpoczyna się od informacji na temat sposobu konfiguracji tzw. fusebit’ów mikrokontrolera. Potem następują definicje plików nagłówkowych bibliotek, pochodzących ze standardowych zasobów darmowego kompilatora AVR-GCC, a także bibliotek podprogramów obsługujących wyświetlacz LCD (lcd.h/lcd.c) oraz pomiar częstotliwości generatora VFO (fmeas.h/fmeas.c).

Dalej następują deklaracje zmiennych globalnych: linebuf (buforu znakowego dla wyświetlacza LCD), Freq (zmierzonej wartości częstotliwość F) oraz state_flags (flagi ustawień, przechowywanych w pamięci EEPROM). Po nich umieszczony został prototyp funkcji pomocniczej show_state(void), odpowiedzialnej za prezentację na ekranie LCD ustawień wykonywanych za pomocą przycisków: Band, Filter oraz AGC.

Listing 1. Główny blok programu int main(void) { /*** Konfiguracje portów ***/ // PORTB: linie DB.4..DB.7 wyświetlacza LCD 2x8 -> PB.0..PB.3 (OUT) DDRB = 0b00001111; //DDRB = 0x0F; PORTB = 0b00000000; //PORTB = 0x00; // początkowy stan LO // PORTC: linie RS, R/W i E wyświetlacza LCD 2x8 -> PC.0..PC.2 (OUT) DDRC = 0b00000111; //DDRC = 0x07; PORTC = 0b00000000; //PORTC = 0x00; // początkowy stan LO // PORTD: IN: obsługa przycisków SW1..SW3 (PD.0..2); wej. pom. Fvfo (PD.5); // OUT: sterowanie f-cjami RX-a (PD.3, PD.4, PD.6) // DDRD = 0b01011000; //DDRD=0x27; DDRD &= 0b01111000; // PD.5 b/z DDRD |= 0b01011000; // PD.5 b/z // PORTD = 0b00000111; //PORTD=0xD8; // 1 - pull-up’y dla przycisków PORTD &= 0b00100111; // PD.5 b/z PORTD |= 0b00000111; // PD.5 b/z /*** Odczyt parametrów z EEPROM ***/ state_flags = eeprom_read_byte( (unsigned char *) 0x01); // Flagi stanu /*** Inicjalizacja LCD i autoprezentacja ***/ InitLcd(); InstLcd(LCDLINE1); PutsLcd_P(PSTR(„RX Dosia”)); InstLcd(LCDLINE2); PutsLcd_P(PSTR(„AVT-319x”)); _delay_ms(1500); show_state(); // Prezentacja odczytanych wcześniej z EEPROM ustawień /*** Inicjalizacja procesu pomiaru F ***/ fmeas_init(); //! Fmeasure initial initialization fmeas_start(); //! Start the frequency measure /*** Główna pętla programu ***/ while(1) { /*** Blok sterowania pracą odbiornika ***/ // Flagi stanu na najmłodszych bitach zmiennej „state_flags”: // 2:AGC:0->Off/1->On; 1:Filter:0->PH/1->CW; 0:Band:0->80m/1->40m // Test stanu przycisku SW1/PD.0 (Band 40m/80m) i ew. zmiana stanu wyjścia P2/PD.3 if( (PIND & _BV(PD0)) == 0) { state_flags ^= _BV(0); // Zmiana flagi pasma względem aktualnego ustawienia // Jeżeli flaga == 1, to PD.3=1 if( (state_flags & _BV(0))>0 ) PORTD |= _BV(3); else PORTD &= ~_BV(3); // Jeżeli flaga == 0, to PD.3=0 show_state(); // Prezentacja zmienionych ustawień // Zapamiętanie flag w pamięci EEPROM eeprom_update_byte( (unsigned char *) 0x01, state_flags); _delay_ms(250); // Opóźnienie dla ustalenia stanu przycisku } // Test stanu przycisku SW2/PD.1 (Filter PH/CW) i ew. zmiana stanu wyjścia P3/PD.4 if( (PIND & _BV(PD1)) == 0) { state_flags ^= _BV(1); // Zmiana flagi filtru względem aktualnego ustawienia // Jeżeli flaga == 1, to PD.4=1 if( (state_flags & _BV(1))>0 ) PORTD |= _BV(4); else PORTD &= ~_BV(4); // Jeżeli flaga == 0, to PD.4=0 show_state(); // Prezentacja zmienionych ustawień // Zapamiętanie flag w pamięci EEPROM eeprom_update_byte( (unsigned char *) 0x01, state_flags); _delay_ms(250); // Opóźnienie dla ustalenia stanu przycisku } // Test stanu przycisku SW3/PD.2 (AGC On/Off) i ew. zmiana stanu wyjścia P4/PD.6 if( (PIND & _BV(PD2)) == 0) { state_flags ^= _BV(2); // Zmiana flagi filtru względem aktualnego ustawienia // Jeżeli flaga == 1, to PD.5=1 if( (state_flags & _BV(2))>0 ) PORTD |= _BV(5); else PORTD &= ~_BV(5); // Jeżeli flaga == 0, to PD.5=0 show_state(); // Prezentacja zmienionych ustawień // Zapamiętanie flag w pamięci EEPROM eeprom_update_byte( (unsigned char *) 0x01, state_flags); _delay_ms(250); // Opóźnienie dla ustalenia stanu przycisku } /*** Blok pomiaru i prezentacji F na LCD ***/ Freq = fmeas_get_value(); //! Get current counted freuency snprintf(linebuf, sizeof(linebuf), „%ld „, Freq); InstLcd(LCDLINE1); PutsLcd(linebuf); // Wyprowadzenie znaków na LCD } fmeas_stop(); //! Stop the frequency measure return 0; }

Następnie rozpoczyna się główny blok programu (listing 1), na początku którego następuje konfiguracja portów sterujących i danych wyświetlacza LCD, portów wejść przycisków i pomiaru częstotliwości oraz wyjściowych portów sterujących innymi modułami odbiornika. Kolejno następuje odczyt ustawień konfiguracyjnych, zapisanych w pamięci EEPROM, a następnie inicjalizacja wyświetlacza LCD, wyświetlenie ekranu powitalnego oraz rozpoczęcie procesu pomiaru częstotliwości, realizowane za pomocą sekwencji wywołań zewnętrznych funkcji: fmeas_init() oraz fmeas_start().

We wnętrzu głównej (teoretycznie nieskończonej) pętli programu cyklicznie realizowane są: analiza i aktualizacja stanu przycisków na odpowiednich wyjściach sterujących, prezentacja wartości zmienionych ustawień (funkcja show_state()) oraz zapamiętanie wartości zmienionych flag w pamięci EEPROM (funkcja eeprom_update_byte()).

Na końcu nieskończonej głównej pętli programu następuje realizacja bloku pomiaru i prezentacji częstotliwości generatora VFO na ekranie LCD (funkcja fmeas_get_value() oraz sekwencja funkcji: snprintf(linebuf, sizeof(linebuf), „%ld „, Freq); InstLcd(LCDLINE1); PutsLcd(linebuf)).

Gdyby z jakiegoś powodu wystąpiło jednak opuszczenie nieskończonej pętli while(1) {}, wówczas zatrzymany zostanie ciągły pomiar częstotliwości (funkcja fmeas_stop()) i nastąpi zatrzymanie wykonywania programu (polecenie return 0).

Funkcja show_state() jest odpowiedzialna za prezentację na wyświetlaczu LCD ustawień robionych za pomocą przycisków: Band, Filter oraz AGC. Jest ona realizowana za pomocą polecenia switch(state_flags & 0x07) i następujących po nim ośmiu klauzul case, których zadaniem jest wykrycie jednej z możliwych ośmiu kombinacji ustawień oraz wyprowadzenia do bufora znakowego ekranu LCD odpowiednio sformatowanej sekwencji znaków. Definicję funkcji show_state() kończy wyprowadzenie odpowiedniego ciągu znaków na dolny wiersz wyświetlacza LCD za pomocą poleceń: InstLcd(LCDLINE2) oraz PutsLcd(linebuf).

Blok pomiaru częstotliwości opisuje plik fmeas.c, zaczerpnięty z projektu AVT5470 (Cyfrowa skala częstotliwości i sterownik do tranceivera Taurus). Najistotniejsze fragmenty pokazuje listing 2.

Listing 2. Funkcje bloku do pomiaru częstotliwości /* --------------------------------- */ #define FIN_DDR DDRD // Freqeuency input ddr #define FIN_PIN _BV(PD5) // Frequency input pin /* --------------------------------- */ #define GTIMER_HZ 100UL #define GTIMER_PRELOAD (((F_CPU)/1024UL)/GTIMER_HZ) #define GTIMER_COUNT 10 // Define result multiply for receive HZ #define FMEAS_HZ_SCALE 10UL /* --- Hi timer software cnt --- */ static volatile uint16_t hi_timer; static volatile fmeas_t g_freq; /* --- Start or stop gate counting --- */ static inline void gate_ctl( bool en ) { if( en ) { TCNT1 = 0; hi_timer = 0; TCCR1B = _BV(CS12) | _BV(CS11) | _BV(CS10); } else { TCCR1B = 0; } } /* --- Fmeasure initial initialization --- */ void fmeas_init( void ) { sei(); FIN_DDR &= ~FIN_PIN; // Configure timer 1 for measure TCCR1A = 0; //Enable interrupt from timer 0 and over flow 1 TIMSK |= _BV(TOIE1) | _BV(OCF2); } /* --- Start the frequency measure --- */ void fmeas_start( void ) { OCR2 = GTIMER_PRELOAD - 1UL; gate_ctl( true ); TCCR2 = _BV(WGM21) | _BV(CS22) | _BV(CS21) | _BV(CS20); } /* --- Stop the frequency measure --- */ void fmeas_stop( void ) { gate_ctl( false ); TCCR2 = 0; } /* --- Get current counted freuency --- */ fmeas_t fmeas_get_value(void) { fmeas_t f1, f2; do { f1 = g_freq; f2 = g_freq; } while( f1 != f2 ); return f1 * FMEAS_HZ_SCALE; } /* --- Time 0 overflow vector gate frequency CNT --- */ ISR( TIMER2_COMP_vect ) { static uint8_t psc; if( ++psc == GTIMER_COUNT ) { gate_ctl( false ); g_freq = ((uint32_t)hi_timer << 16) | TCNT1; gate_ctl(true); psc = 0; } } /* --- HIGH part time value --- */ ISR( TIMER1_OVF_vect ) { ++hi_timer; }

Funkcje w nim ujęte zostały zaimplementowane w tym projekcie dzięki uprzejmości i wsparciu kolegi mgr. inż. Lucjana Bryndzy SQ5FGB, a ich opisy są dostępne w treści wspomnianego artykułu.

Natomiast blok obsługi wyświetlacza LCD opisuje plik lcd.c, zawierający typowe definicje procedur obsługi wyświetlacza LCD z popularnym sterownikiem HD44780, dostosowane do obsługi wyświetlacza alfanumerycznego, podłączonego do mikrokontrolera w sposób zastosowany w tym projekcie. Opisy ujęte w kodzie źródłowym, oraz wyczerpująca dokumentacja techniczna zastosowanego w tym projekcie ekranu LCD wydają się być w zupełności wystarczające do zrozumienia i ewentualnej adaptacji tej części oprogramowania do własnych potrzeb czytelników-konstruktorów.

Na koniec opisu oprogramowania modułu kontrolno-sterującego warto jest wspomnieć o tym, że w przypadku chęci jego zastosowania w innym urządzeniu radiokomunikacyjnym, a w szczególności w heterodynie (z przemianą częstotliwości), w kodzie źródłowym (przed kompilacją i wgraniem do mikrokontrolera) wystarczy odpowiednio uwzględnić zależność pomiędzy częstotliwościami: generatora VFO, pośrednią IF oraz odbieraną nośną, której to wartość powinna ostatecznie być prawidłowo wyświetlana na ekranie LCD urządzenia.

Adam Sobczyk SQ5RWQ
sq5rwq@gmail.com

Wykaz elementów:
Rezystory: (0,25 W/5%)
  • R1: 10 Ω*
  • R2**: 1 kΩ
  • R3**: 47 kΩ
  • R4**: 100 kΩ
  • R5**: 3,3 MΩ
  • R6**: 2,2 kΩ
  • R7**: 15 kΩ
  • R8**: 330 Ω
  • RV1: 10 kΩ „B” (liniowy, montażowy, leżący)
Kondensatory:
  • C1, C3: 47 μF/10 V
  • C2, C4, C10, C11: 100 nF
  • C8, C9: 22 pF
  • C5, C6, C7, C12**: 10 nF
  • C13**, C15**: 10 pF*
  • C14**: 150 pF*
Półprzewodniki:
  • D1**: BAT85 (obud. DO-35)
  • Q1**: BF245B (obud. TO-92)
  • Q2, Q3**: BC547B (obud. TO-92)
  • U1: Mikrokontroler ATMEGA8A-PU (obud. DIP-28)
  • U2: Alfanumeryczny wyświetlacz LCD 2×8 znaków
Inne:
  • L1: 10 μH/100 mA
  • L2**: 33 μH*
  • SW1, SW2, SW3: kątowy przycisk typu „micro-switch” (6 mm)
  • X1: rezonator kwarcowy 16 MHz (niski)
  • P1...P4, P5...P7**: złącza goldpin męskie (2 piny)
  • Podstawka precyzyjna pod układ U1 (DIP-28)
  • (*) – wartość podana lub wg opisu w tekście
  • (**) – element opcjonalnego bloku wzmacniaczy wstępnych
Artykuł ukazał się w
Elektronika Praktyczna
luty 2020
DO POBRANIA
Pobierz PDF Download icon
Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik grudzień 2024

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio listopad - grudzień 2024

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka, Podzespoły, Aplikacje listopad - grudzień 2024

Automatyka, Podzespoły, Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna grudzień 2024

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich styczeń 2025

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów