Coraz częściej utwierdzam się w przekonaniu, że elektronika nigdy nie przestanie mnie zadziwiać i pasjonować. Nie tak dawno na łamach Elektroniki Praktycznej prezentowałem projekt przenośnego radioodbiornika FM ze wsparciem dla RDS, zbudowany z użyciem odbiornika scalonego Si4703 firmy Silicon Labs. Ten projekt uświadomił mi, jak łatwe jest zbudowanie zaawansowanego urządzenia z użyciem niewielkiej liczby komponentów, a to wszystko za sprawą doskonałych układów scalonych. Wystarczy zastanowić się, ile energii i zapału należałoby poświęcić skonstruowaniu podobnego urządzenia używając elementów dyskretnych.
Może się wydawać, że taki sposób konstruowania urządzeń jest nieciekawy, gdyż nie wymaga inżynierskiego podejścia do zagadnienia wyrażającego się potrzebą wykonania dziesiątek czy setek obliczeń popartych sporą wiedzą, lecz moim zdaniem nie jest to prawdą, ponieważ w naszym wypadku cała "zabawa" zaczyna się w momencie tworzenia aplikacji odpowiadającej założeniom, co przecież nie miało miejsca w ujęciu tradycyjnym. Jest to zwyczajnie inna droga do osiągnięcia tego samego celu, niemniej ciekawa czy wymagająca.
Układ scalony nadajnika Si4711
Bazując na swoim doświadczeniu z układem Si4703 oraz wygodzie użytkowania telefonu komórkowego ze zintegrowanym nadajnikiem FM, postanowiłem sięgnąć po inny, bardzo ciekawy element z szerokiej palety układów tego producenta. Mowa o scalonym transmiterze FM o symbolu Si4711/4713 wyposażonym w funkcjonalność RDS. Charakteryzuje się on następującymi parametrami:
- Zintegrowany nadajnik FM w zakresie częstotliwości 76...108 MHz.
- Cyfrowa synteza częstotliwości z wbudowanym oscylatorem VCO.
- Analogowe i cyfrowe wejścia audio standardu I²S.
- Cyfrowa regulacja mocy emitowanego sygnału.
- Programowana wartość deemfazy.
- Cyfrowy modulator stereofoniczny.
- Pomiar mocy sygnału antenowego.
- Wbudowany układ oscylatora dla rezonatora kwarcowego 32768 Hz.
- Interfejs sterowania i kontroli standardu I²C, SPI oraz 3-Wire.
- Niewielka liczba komponentów zewnętrznych w aplikacji podstawowej.
- Brak konieczności strojenia obwodów radiowych, gdyż w układzie wykorzystano cyfrową obróbkę sygnałów przy wsparciu zaawansowanych technik DSP.
- Szeroki zakres napięcia zasilania (2,7...5,5 V).
- Mały pobór mocy (w tym tryb o ekstremalnie niskim zapotrzebowaniu na energię).
- Wbudowany regulator napięcia.
- Obsługa systemu RDS/RDBS.
- Małe wymiary obudowy (3 mm×3 mm).
Wymienione parametry układu predysponują go do zastosowania również w konstrukcjach amatorskich zwłaszcza, że aplikacja układu ogranicza się do zaledwie kilku elementów zewnętrznych. Wynika to z faktu, że w budowie układu Si4711/4713 zastosowano zaawansowany, cyfrowy tor przetwarzania sygnału. Na rysunku 1 pokazano wygląd obudowy układu Si4713, natomiast w tabeli 1 zamieszczono opis i znaczenie poszczególnych wyprowadzeń.
Jak to często bywa w przypadku układów peryferyjnych, obsługa i konfiguracja układu Si4713 jest możliwa dzięki wyposażeniu go interfejs szeregowy 3-wire kompatybilny z I²C i SPI oraz szereg rejestrów kontrolnych, których zapisywanie zmienia bieżący stan nadajnika, natomiast odczytywanie pozwala na monitorowanie stanu pracy układu. Aby jednak rozpocząć właściwą transmisję, jest konieczne poprawne zainicjowanie układu, które ma na celu wybór aktywnej magistrali sterującej (pomiędzy I²C, SPI i 3-wire) oraz uruchomienie wewnętrznego oscylatora niezbędnego z punktu widzenia części radiowej układu.
Rodzaj interfejsu komunikacyjnego wybiera się poprzez ustawienie odpowiednich stanów logicznych na wyprowadzeniach GPIO1 oraz GPIO2/INT. Logika sterująca zapamiętuje go podczas rosnącego zbocza sygnału na wejściu zerowania układu RST. Możliwe ustawienia umieszczono w tabeli 2.
W strukturze układu Si4713 zintegrowano rezystory podciągające wyprowadzenia GPIO1 oraz GPIO2/INT, odpowiednio, do napięcia zasilającego (pull-up) oraz do masy zasilania (pull-down) aktywne podczas sygnału zerującego, co oznacza, że te wyprowadzenia należy odpowiednio spolaryzować wyłącznie wtedy, gdy wymagany stan jest inny, niż domyślny. W tab. 2 nastawy domyślne oznaczono symbolem (*).
Po wyjściu z procedury zerowania układu i wyborze aktywnej magistrali sterującej, układ Si4713 pozostaje w trybie POWER_DOWN, gotowy na przyjęcie rozkazów sterujących, przy czym pierwszym, dopuszczalnym rozkazem, jaki może na tym etapie wykonać jest POWER_UP inicjujący proces aktywacji wewnętrznych peryferiów nadajnika, w tym zintegrowanego oscylatora. Warto przy okazji podkreślić, iż producent układu, firma Silicon Labs, zmieniła i ustandaryzowała interfejs programowy dla całej serii Si47xx, co ułatwiło programowanie tej rodziny układów.
Oprogramowanie
Ramka danych, którą należy przesłać do układu zawiera predefiniowany rozkaz sterujący (1 bajt) oraz krótką listę argumentów (maksymalnie 7 bajtów), których liczba i znaczenie są uzależnione od przesłanego wcześniej rozkazu sterującego. Po wysłaniu takiej ramki danych, układ nadrzędny (mikrokontroler) może zainicjować proces odczytu statusu wykonania rozkazu sterującego, który każdorazowo jest przygotowywany przez układ (maksymalnie 15 bajtów odpowiedzi), lecz jest to operacja opcjonalna. W tabeli 3 umieszczono przykładową sekwencję sygnałów sterujących w relacji Master (mikrokontroler) <-> Slave (Si4713) w wypadku wysyłania rozkazu sterującego TX_TUNE_FREQ, którym jest zmieniana częstotliwość transmisji FM. Specjalnym rodzajem rozkazu sterującego jest rozkaz SET_PROPERTY, którym określamy szereg właściwości funkcjonalno-sprzętowych układu transmittera Si4703 posiłkując się listą dołączonych argumentów. Konstrukcję ramki danych w przypadku wysyłania rozkazu SET_PROPERTY pokazano w tabeli 4.
Na listingach pokazano funkcje odpowiedzialne za realizację wspomnianych funkcjonalności tj. wysłania rozkazu sterującego wraz z listą niezbędnych argumentów (listing 1) i odczyt statusu odpowiedzi oraz funkcji odpowiedzialnej za zmianę właściwości funkcjonalnych układu Si4713 (listing 2). W ciele funkcji Si4713send- Command użyto funkcji narzędziowej Si4713WaitForCTS, której zadaniem jest sprawdzenie gotowości układu Si4713 na przyjęcie danych (dokładnie, sprawdzenie bitu CTS w rejestrze statusu układu). Funkcję Si4713WaitForCTS pokazano na listingu 3. Funkcję inicjalizującą układ pokazano na listingu 4. Do analizy kodu funkcji inicjalizacyjnej jest niezbędna znajomość zawartości pliku nagłówkowego, który za każdym razem tworzę w taki sposób, aby bez konieczności zaglądania do dokumentacji układu, móc zorientować się w możliwościach peryferium, którego ten kod dotyczy. Zawartość wspomnianego pliku nagłówkowego pokazano na listingu 5.
Na koniec przedstawię kod kilku krótkich funkcji narzędziowych pozwalających na ustawienie częstotliwości i mocy transmitowanego sygnału FM oraz dającą możliwość zdefiniowania własnych wiadomości systemu RDS (typu Program Service). Kody dwóch pierwszych funkcji pokazano na listingach 6 i 7. Na listingach 8 i 9 pokazano kod dwóch krótkich funkcji pozwalających na ustawienie wiadomości typu RDS Program Service (nazwa stacji), którą układ Si4713 będzie transmitował razem z wysyłanym dźwiękiem. Przy okazji należy wspomnieć, iż tego typu konfiguracja układu Si4713 w zakresie systemu RDS jest rozwiązaniem najprostszym i najszybszym, jednak sam układ udostępnia ogromną listę możliwości, jeśli chodzi o transmisję wiadomości tego typu.
Dla zrozumienia sposobu działania funkcji narzędziowych, trzeba opisać najważniejsze rozkazy sterujące z listą ich argumentów oraz wybranych właściwości funkcjonalnych układu Si4713. Poświęćmy, zatem chwilę na tą krótką lekturę.
|
Rozkaz POWER_UP musi być pierwszym rozkazem, jaki zostanie wysłany do układu nadajnika po ustawieniu sygnału zerowania (RST=1), gdyż umożliwia aktywację peryferiów układu Si4713 oraz konfigurację podstawowych parametrów jego pracy. Znaczenie poszczególnych bitów w kolejnych argumentach przedstawia się następująco:
- CTSIEN: ustawienie tego bitu aktywuje przerwanie CTS (Clear to Send),
- GPO2OEN: ustawienie tego bitu aktywuje wyjście GPIO2, wyzerowanie wymusza stan wysokiej impedancji na wspomnianym wyjściu,
- PATCH: stan tego bitu ma wpływ na przebieg procedury inicjalizacyjnej, jaka wykonywana jest przez firmware transmittera po ustaniu sygnału zerowania. Wyzerowanie tego bitu inicjuje normalną procedurę inicjalizacji wewnętrznych peryferiów, zaś ustawienie tego bitu umożliwia start procedury aktualizacji wewnętrznego oprogramowania układu,
- Stan tego bitu decyduje o źródle sygnału taktującego układ Si4713. Wyzerowanie tego bitu wymusza konieczność dostarczenia zewnętrznego sygnału taktującego (do wyprowadzenia RCLK), zaś ustawienie, uruchamia zintegrowany oscylator, który wymaga dołączenia do wyprowadzeń RCLK i GPIO3/DCLK rezonatora kwarcowego o częstotliwości 32768Hz (domyślnie, bez potrzeby dodatkowej konfiguracji) lub z zakresu 31.130 kHz...40 MHz (po dodatkowej konfiguracji wartości preskalera i wartości częstotliwości wynikowej REFCLK),
- Wartość bitów FUNC[3...0] określa dodatkową funkcjonalność rozkazu POWER_UP, według następującej specyfikacji: FUNC[3... ...0]=0x02 → wymusza tryb nadajnika sygnału FM, FUNC[3...0]=0x0F → wymusza rozrzerzoną odpowiedź układu Si4713 zawierającą (poza standardowym bajtem statusu) drobiazgowe informacje nt. wersji oprogramowania, które to mogą być przydatne w procesie jego aktualizacji,
- Wartość bitów OPMODE[7...0] ma wpływ na rodzaj użytych wejść sygnału audio według następującej specyfikacji: OPMODE[ 7...0] =0x50 → aktywuje analogowe wejścia sygnału audio (LIN/RIN), OPMODE[ 7...0] =0x0F → aktywuje cyfrową magistralę wejściową dla sygnału audio (DIN/ DFS/DCLK).
|
Rozkaz SET_PROPERTY pozwala na określenie nastaw funkcjonalno-sprzętowych układu Si4713. Znaczenie poszczególnych argumentów jest następujące:
- 16-bitowe słowo PROPERTY-MSB/PROPERTY-LSB określa predefiniowany rodzaj właściwości funkcjonalno-sprzętowej układu Si4713,
- 16-bitowe słowo VALUE-MSB/VALUE-LSB określa wartość dla przesłanej wcześniej właściwości funkcjonalno-sprzętowej układu Si4713.
Rozkaz TX_TUNE_FREQ pozwala na przestrojenie nadajnika FM układu Si4713. 16-bitowe słowo określone argumentami Argument2/Argument3 wyznacza nową częstotliwość transmisji, przy czym dla przykładu: wartość 7610 odpowiada częstotliwości 76,10 MHz zaś wartość 10800, częstotliwości 108,00 MHz itd. Wysłaniu tegoż rozkazu sterującego powinno towarzyszyć następujące bezpośrednio po nim sekwencyjne odczytywanie rejestru statusu układu Si4713 (za pomocą rozkazu sterującego GET_INT_STATUS) w oczekiwaniu na ustawienie bitu STCINT sygnalizującego zakończenie operacji przestrajania (jeśli nie uruchomiono dedykowanego przerwania STC).
Rozkaz TX_TUNE_POWER pozwala na określenie mocy transmisji nadajnika FM układu Si4713 oraz pojemności kondensatora w obwodzie strojenia anteny. Wysłaniu tegoż rozkazu sterującego powinno towarzyszyć następujące bezpośrednio po nim sekwencyjne odczytywanie rejestru statusu układu Si4713 (za pomocą rozkazu sterującego GET_INT_STATUS) w oczekiwaniu na ustawienie bitu STCINT sygnalizującego zakończenie operacji zmiany mocy sygnału (jeśli nie uruchomiono dedykowanego przerwania STC). Znacznie poszczególnych argumentów jest następujące:
- Bajt RFdB mV[7...0] określa moc transmisji FM nadajnika układu Si4713 w krokach 1 dBmV (maksimum równe 115 dBmV),
- Bajt ANTCAP[7...0] określa pojemność kondensatora w obwodzie strojenia anteny w krokach 0.25 pF (zakres 0...191). Ustawienie ANTCAP[7...0]=0x00 wymusza automatyczny dobór wspomnianej pojemności.
Rozkaz TX_RDS_PS pozwala na definicję napisów emitowanych automatycznie przez transmitter FM jako wiadomość typu PS (Program Service) wbudowanego procesora systemu RDS/RDSB. Znacznie poszczególnych argumentów jest następujace:
- Bity PSID[4...0] określają kolejny numer grupy 4 znaków wiadomości RDS typu PS według następującej specyfikacji:
- Bity PSID[4...0]=1 → ostatnie 4 znaki pierwszej wiadomości typu PS,
- Bity PSID[4...0]=2 → pierwsze 4 znaki drugiej wiadomości typu PS,
- Bity PSID[4...0]=3 → ostatnie 4 znaki drugiej wiadomości typu PS,
- Bity PSID[4...0]=22 → pierwsze 4 znaki dwunastej wiadomości typu PS,
- Bity PSID[4...0]=23 → ostatnie 4 znaki dwunastej wiadomości typu PS.
W ramach rozkazu TX_RDS_PS możliwe jest zdefiniowanie 12, 8-znakowych wiadomości RDS typu PS, które to będą wysyłane przez wbudowany w układ Si4713 procesor RDS sekwencyjnie.
- Bajty PSCHAR0[7...0]... PSCHAR3[7...0] określają kody ASCII kolejnych znaków poszczególnych wiadomości RDS typu PS, których to numer specyfikowany jest wartością bitów PSID[4...0].
Właściwość TX_COMPONENT_ENABLE pozwala określić, które z komponentów sygnału FM znajdą się w widmie transmitowanego sygnału radiowego. Znaczenie poszczególnych bitów jest następujące:
- RDS: ustawienie tego bitu aktywuje nadawanie sygnału RDS w widmie transmitowanego sygnału FM,
- LMR: ustawienie tego bitu aktywuje nadawanie składowej L-R (niezbędnej dla demodulacji Stereo) w widmie transmitowanego sygnału FM,
- PILOT: ustawienie tego bitu aktywuje nadawanie tzw. pilota sygnału Stereo w widmie transmitowanego sygnału FM.
Właściwość TX_LINE_INPUT_LEVEL pozwala na określenie, maksymalny poziom wejściowego sygnału audio, by w sposób optymalny wykorzystać charakterystykę modulacji FM, co z kolei przekłada się na wynikową jakość sygnału audio po stronie odbiornika radiowego (odstęp sygnału od szumu i inne). Znaczenie poszczególnych bitów przedstawia się następująco:
- LIATTEN[1...0]: wartość tych bitów określa maksymalną, dopuszczalną wielkość wejściowego sygnału audio oraz impedancję wejściową według następującej specyfikacji: LIATTEN[1...0]=0x00 → 190 mV/396 kV, LIATTEN[1...0]=0x01 → 301 mV/100 kV, LIATTEN[1...0]=0x02 → 416 mV/74 kV, LIATTEN[1...0]=0x03 → 636 mV/60 kV,
- LILEVEL[9...0]: wartość tych bitów określa rzeczywistą, maksymalną wielkość wejściowego sygnału audio [w mV] w odniesieniu do zakresu zdefiniowanego wartością bitów LIATTEN[1...0].
|
Właściwość TX_PREEMPHASIS pozwala określić wartość tzw. preemfazy sygnału FM według następującej specyfikacji: FMPE[1...0]=0x00 → 75 ms (Stany Zjednoczone), FMPE[1...0]=0x01 → 50 mms (Europa, Australia, Japonia), pozostałe wartości → Zarezerwowane.
Właściwość TX_RDS_PS_MIX pozwala na określenie, jaką część emisji danych RDS zajmie transmisja wiadomości typu PS (Program Service). Wartość bitów RDSPSMIX[2...0] określa procentowy udział emisji danych PS według następującej specyfikacji: RDSPSMIX[2... ...0]=0x01 → 12.5%, RDSPSMIX[2... ...0]=0x02 → 25%, RDSPSMIX[2...0]=0x03 → 50%, RDSPSMIX[2...0]=0x04 → 75%, RDSPSMIX[2...0]=0x05 → 87.5%, RDSPSMIX[2...0]=0x06 → 100%.
Budowa
Schemat ideowy transmitteraFM pokazano na rysunku 2. Jest to system mikroprocesorowy zbudowany z użyciem popularnego mikrokontrolera ATmega8 taktowanego wewnętrznym oscylatorem o częstotliwości 8 MHz. Zadaniem mikrokontrolera jest obsługa układu Si4713 za pomocą interfejsu TWI oraz realizacja interfejsu użytkownika zbudowanego z wyświetlacza alfanumerycznego o organizacji 2×8 znaków oraz z 3 przycisków funkcyjnych.
Ponadto, urządzenie wyposażono w stabilizator liniowy 78M05 zapewniający napięcie zasilania dla wyświetlacza LCD (+5 V) oraz, poprzez dwie diody 1N4148, napięcie zasilające mikrokontroler i układ Si4713 (ok. 3,4 V). Jest to najprostsze i jednocześnie dopuszczalne rozwiązanie w przypadku, gdy system mikroprocesorowy jest zasilany napięciem 3,3 V a wyświetlacz napięciem 5 V. Wyłącznie w takim przypadku, gdy nie korzysta się z operacji odczytu danych z wyświetlacza (wyprowadzenie R/W podłączone na stałe do masy).
Montaż
Schemat montażowy transmitteraFM pokazano na rysunku 3. Całość zmontowano na niewielkiej płytce drukowanej o wymiarach zastosowanego wyświetlacza LCD, ze zdecydowaną przewagą elementów do montażu powierzchniowego, rozmieszczonych - co należy szczególnie podkreślić - po obu stronach płytki. Z uwagi na zastosowanie niewielkich elementów SMD w dość "kłopotliwych" obudowach, montaż układu tego typu najlepiej jest przeprowadzić z użyciem stacji lutowniczej na gorące powietrze, odpowiedniej jakości topników lutowniczych oraz dysponując sporym doświadczeniem w tej kwestii. Dotyczy to zwłaszcza układu scalonego Si4713, którego niewielka obudowa o wymiarach 3 mm×3 mm ma 20 wyprowadzeń umieszczonych pod spodem i na obrysie obudowy. Montaż tego układu należy wykonać szczególnie ostrożnie, gdyż praktyka (jak i informacje zgłaszane przez Czytelników) wykazała, że te elementy są bardzo wrażliwe na przegrzanie i elektryczność statyczną, a ich uszkodzenia są dość trudne do wykrycia (np. układ może funkcjonować "prawie" poprawnie poza tym, że nie jest w stanie przestroić wbudowanego tunera FM, zatrzymując w tym momencie program obsługi urządzenia) sugerując częstokroć inne przyczyny braku poprawnego działania urządzenia.
Wracając jednak do montażu. Rozpoczynamy od przylutowania wszystkich układów scalonych. Następnie lutujemy diody, rezystory, kondensatory, pozostałe elementy bierne, a na końcu złącze goldpin przeznaczone dla wyświetlacza LCD, gniazdo słuchawkowe oraz mikroprzełączniki.
Poprawnie zmontowany układ powinien działać od razu po podłączeniu zasilania. Jako antenę należy zastosować kawałek nieekranowanego przewodu podłączonego do punktu lutowniczego na płytce drukowanej oznaczonego jako ANT. Co prawda, producent układu zaleca wykorzystanie jednej z żył przewodu zasilającego (dokładnie masy) jako medium transmisyjnego (tym samym wymuszenie połączenia wyprowadzenia antenowego do masy układu), jednak testy praktyczne wykazały, iż znacznie lepsza propagację sygnału zapewnia zastosowanie oddzielnego kawałka przewodu odseparowanego od masy urządzenia.
Wykaz elementówRezystory: (SMD 0603) Kondensatory: (SMD 0603) Półprzewodniki: Inne: |
Obsługa
Zaprojektowany transmitterFM jest bardzo prostym systemem mikroprocesorowym, o niewielkiej liczbie opcji Menu, zaprojektowano minimalistyczny i przejrzysty interfejs użytkownika. Urządzenie ma dwa tryby pracy: Przeglądanie i Edycja. Do zmiany trybów pracy służy przycisk umownie oznaczony Mode. W trybie Przeglądanie możemy zapoznać się z dostępnymi pozycjami menu urządzenia i ustawieniami transmittera dla każdej ze wspomnianych opcji. Do poruszania się po liście pozycji menu służą przyciski umownie oznaczone UP i DOWN. W trybie Edycja, co łatwo się domyślić, mamy możliwość zmiany wartości interesujących nas parametrów urządzenia. Edytowane parametry są wyróżniane (w drugim wierszu wyświetlacza), zaś ich zmiany są możliwe za pomocą UP i DOWN. Wyjątkowo, dla trybów edycji tekstów transmitowanych w postaci wiadomości RDS typu PS (PStext1...PStext4), krótkie przyciśnięcie wybranego przycisku powoduje zmianę bieżąco edytowanego znaku tekstu (z zakresu ASCII 32...122), zaś długie - przejście do kolejnego/poprzedniego znaku bieżącego tekstu. Dla pozostałych pozycji menu, przyciski UP i DOWN realizują pojedyncze funkcje służące wyłącznie regulacji wskazywanego parametru.
Każdorazowe opuszczenie trybu edycji, inicjowane ponownym przyciśnięciem przycisku MODE, powoduje po pierwsze, wysłanie bieżących ustawień do układu Si4713, natomiast po drugie, zapisanie ich w nieulotnej pamięci EEPROM mikrokontrolera, by ustawienia te stały się aktywne po ponownym włączeniu zasilania. Wygląd wszystkich, dostępnych pozycji menu pokazano na rysunku 4.
Robert Wołgajew, EP