Generator zaprojektowano z myślą o testowaniu urządzeń audio. Cenę obniżono dzięki programowej implementacji generatora DDS, bez użycia zewnętrznego generatora sygnałowego. Kształty sygnałów zostały dostosowane do najczęstszych pomiarów w układach audio:
- sinusoidalny: pomiar charakterystyki przenoszenia i wzmocnienia,
- trójkątny: ocena zniekształceń nieliniowych,
- prostokątny: oscylacje, ocena pasma przenoszenia.
Zasada działania
Bezpośrednia synteza cyfrowa (ang. DDS – Direct Digital Synthesis) to metoda wytwarzania sygnału w oparciu o odczytywanie odpowiednich próbek zapisanych w tablicy. Próbki sygnału są wystawiane na przetwornik cyfrowo-analogowy, który przekształca je w proporcjonalną wartość napięcia. Schemat blokowy zaimplementowanego w tym układzie syntezera przedstawia rysunek 1.
Gdyby z tablicy próbek odczytywać wszystkie po kolei, wówczas częstotliwość wytwarzanego sygnału byłaby stała. W tym układzie częstotliwość próbkowania wynosi 300 kHz, zaś tablica próbek zawiera ich 256, więc częstotliwość sygnału wyjściowego wynosiłaby 1171,875 Hz (300 kHz/256). Metoda DDS polega na tym, że nie trzeba odczytywać wszystkich próbek. Zgodnie z twierdzeniem Nyquista wystarczy, aby na jeden okres najwyższej częstotliwości w sygnale przypadały nie mniej niż 2 próbki. Dla sygnału sinusoidalnego minimum to dwie próbki na okres. Przy tej samej częstotliwości próbkowania można uzyskać – teoretycznie – sygnał analogowy o częstotliwości 150 kHz. Jak zostanie pokazane dalej, jakość tego sygnału byłaby bardzo niska.
Użytkownika nie interesuje jedynie częstotliwość minimalna i maksymalna, lecz także cała gama częstotliwości pośrednich. Można odczytywać co drugą próbkę, co trzecią i tak dalej. Niestety, skok częstotliwości jest równy częstotliwości minimalnej.
Generatory fabryczne z powodzeniem generują sygnał o częstotliwości zadanej z precyzją rzędu mHz lub lepszą. Można sobie poradzić z tym problemem na dwa sposoby. Pierwszy z nich to zwiększenie liczby próbek np. do 300 milionów. Wtedy krok regulacji częstotliwości wyniesie 1 mHz, za to potrzebna będzie olbrzymia pamięć na tak liczny zbiór próbek. Drugą opcją jest podział przez liczbę niecałkowitą – tej metody użyto w prezentowanym generatorze.
Przy użyciu mikrokontrolera o architekturze 32-bitowej to zadanie zostaje znacznie uproszczone. Jeżeli do zaadresowania jest 256 próbek, wówczas wystarczy do tego tylko 8 bitów. Pozostałe 24 bity rejestru akumulatora fazy to „część ułamkowa”. Dzięki temu krok regulacji częstotliwości generowanego sygnału wyniesie:
W ten sposób, w pamięci nadal można przechowywać 256 próbek. Przetwornik ma rozdzielczość 12 bitów, zatem próbki są 2-bajtowe – wymagane jest tylko 512 bajtów.
Sygnał na wyjściu przetwornika C/A jest aproksymowany za pomocą przebiegu schodkowego. Należy go odfiltrować za pomocą dolnoprzepustowego filtru regeneracyjnego, aby uzyskać zeń sygnał pożądany. W jego widmie jest wiele częstotliwości harmonicznych, w tym składowa sygnału użytecznego oraz składowa o częstotliwości równej częstotliwości próbkowania. Założono, że maksymalna częstotliwość wytwarzanego sygnału to 40 kHz, natomiast częstotliwość próbkowania wynosi 300 kHz. Charakterystyka amplitudowa filtru w paśmie przepustowym powinna być możliwie płaska. Jednocześnie tłumienie częstotliwości próbkowania powinno być jak najsilniejsze. Są to bardzo rygorystyczne wymagania, których jednoczesne spełnienie nie będzie łatwe.
W omawianym układzie zastosowano prosty, dwuczłonowy filtr RC, którego schemat ideowy (z programu symulacyjnego SPICE) pokazano na rysunku 2. Na rysunku 3 zamieszczono jego charakterystykę amplitudową. Jest ona kompromisem pomiędzy jakością pasma przepustowego a tłumieniem częstotliwości próbkowania. Dodatkowe tłumienie składowych o tak wysokich częstotliwościach wniosą użyte wzmacniacze operacyjne, które mają ograniczony czas narastania napięcia wyjściowego.
Budowa generatora
Schemat ideowy generatora pokazano na rysunku 4.
Układ generatora należy zasilać napięciem stałym z zakresu 12…15 V, dobrze filtrowanym i najlepiej stabilizowanym. Do dodatkowego filtrowania tętnień o małej częstotliwości służy kondensator C1. To napięcie jest używane do zasilania stopnia wyjściowego.
Napięcia +5 V, przeznaczonego dla wyświetlacza LCD, dostarcza stabilizator liniowy typu 7805. Kondensatory C2 i C3 zapobiegają jego wzbudzeniu. Prąd przezeń płynący jest na tyle niski, że nie wymaga radiatora. Z wyjścia układu 7805 jest zasilany stabilizator napięcia 3,3 V (LD1117-S33TR). To napięcie jest z kolei wymagane przez mikrokontroler STM32F051. Kaskadowe połączenie stabilizatorów pozwala rozłożyć moc w nich traconą. Stabilizator US2 jest układem LDO, który może pracować z tak niewielką (ok. 1,7 V) różnicą napięcia pomiędzy wejściem i wyjściem.
Na potrzeby poprawnej pracy wzmacniaczy operacyjnych w torze sygnału, na płytce generatora znajduje się również przetwornica wytwarzająca napięcie ujemne. Jego wartość to ok. –5 V, lecz – jak zostanie dalej pokazane – nie jest to parametr krytyczny. W tej roli bardzo dobrze sprawdza się układ pompy ładunkowej typu ICL7660 w swojej typowej aplikacji. Nie korzysta z elementów indukcyjnych, przez co poziom emitowanych zaburzeń elektromagnetycznych jest niewielki.
Przetwornik cyfrowo/analogowy znajdujący się w mikrokontrolerze ma wysoką rezystancję wyjściową, dlatego w pierwszej kolejności należy podać go na wtórnik napięciowy. Wybrano do tej roli układ typu TL084, ponieważ charakteryzuje się on: niską ceną, dostępnością, bardzo dużą impedancją wejściową (z racji zastosowania tranzystorów typu FET), szybką reakcją wyjścia (slew rate na poziomie 13 V/ms).
Napięcie na wyjściu przetwornika C/A zmienia się w zakresie 0…3,3 V, dlatego trzeba zapewnić wzmacniaczom operacyjnym możliwość poprawnego przeniesienia tego sygnału w całym zakresie jego zmienności. Do tego celu służy napięcie ujemne, wytwarzane przez ICL7660. Układ TL084 wymaga ok. 3 V „odstępu” pomiędzy ujemną linią zasilania a napięciem przyłożonym do któregokolwiek z wejść. Podobnie rzecz ma się z wyjściem, które również wymaga pewnego marginesu.
Użycie w tym miejscu wzmacniacza typu rail-to-rail byłoby o tyle nieefektywne, że szybkość zmian napięcia wyjściowego w nim jest niewielka (bądź jego ceny są wysokie). Ponadto, impedancja dołączona do wyjścia musi być, na ogół, rzędu kiloomów, co nie rozwiązuje problemu.
Napięcie z przetwornika A/C, po zbuforowaniu wtórnikiem napięciowym, trafia na potencjometr ustalający amplitudę. Impedancja wyjściowa takiego dzielnika potencjometrycznego ulega silnym wahaniom (od zera do ok. 5 kV), co wpływałoby na charakterystykę filtru. Z tego powodu, za potencjometrem znajduje się jeszcze jeden wtórnik. Dzięki temu filtr jest sterowany ze źródła o znikomo małej impedancji wyjściowej.
Zwora JP1 służy do ewentualnego ominięcia filtru regeneracyjnego i wyprowadzenia sygnału z przetwornika C/A wprost na wyjście. Jak zostanie potem pokazane, ten filtr wpływa negatywnie na czas narastania sygnału prostokątnego. Można w miejsce zwory dołączyć przełącznik odłączający filtr z toru przy generowaniu sygnału prostokątnego. Można również prowadzić testy z własnymi filtrami, o odmiennej topologii – możliwości jest wiele. Za filtrem włączono wzmacniacz nieodwracający o wzmocnieniu ok. 3 V/V. W ten sposób można uzyskać zmiany napięcia wyjściowego w zakresie 0…10 V. Taka amplituda jest przydatna podczas bezpośredniego wysterowania końcówki mocy. Przy okazji, wysoka impedancja wejściowa nie obciąża filtru.
Za wzmacniaczem jest kondensator odcinający składową stałą, a ściślej mówiąc, dwa kondensatory połączone równolegle. Duża pojemność C17 dobrze sprawdza się dla małej częstotliwości, za to C18 jest potrzebny do przeniesienia stromych zboczy. Rezystor R5 obciąża wstępnie wyjście układu, co polaryzuje kondensatory. Zworką JP2 można te kondensatory zewrzeć i w ten sposób wyłączyć je z toru sygnałowego.
Do wskazywania aktualnej częstotliwości oraz kształtu sygnału służy standardowy wyświetlacz alfanumeryczny, zgodny z HD44780 o organizacji 2 wiersze po 16 znaków. Musi być zasilany napięciem 5 V, lecz akceptuje poziomy logiczne wystawiane przez mikrokontroler pracujący w logice 3,3-woltowej. Do mikrokontrolera został dołączony w trybie 4-bitowym. Gdyby wyświetlacz przeszedł w tryb odczytu zawartości rejestrów, na wyprowadzenia mikrokontrolera zostałoby podane napięcie rzędu 5 V. Jednak wyprowadzenia typu FT są w stanie takie napięcie wytrzymać bez żadnych konsekwencji. Potencjometr P1 służy do ustalenia prawidłowego kontrastu wyświetlacza. Rezystor R6 ogranicza prąd pobierany przez podświetlenie ekranu. Drabinka rezystorowa RN1 polaryzuje niewykorzystane wyprowadzenia wyświetlacza.
Impulsator z przyciskiem służy do zmiany częstotliwości, zaś oddzielny microswitch jest przeznaczony do zmiany kształtu generowanego sygnału. Elementy stykowe iskrzą podczas przełączania, dlatego zostały do nich dodane elementy filtrujące. Przy styku rozwartym, rezystor 10 kV podciąga potencjał wejścia mikrokontrolera do +3,3 V. Podczas zwierania styku, ładunek z kondensatora jest odprowadzany poprzez rezystor 330 V. Włączenie rezystora szeregowo z kondensatorem zmniejsza prąd płynący podczas przełączania, co pozytywnie wpływa na żywotność styków oraz poziom emitowanych zakłóceń.
Zadaniem mikrokontrolera jest – między innymi – generowanie sygnału analogowego. W generatorze zastosowano STM32F051K8T6 w obudowie TQFP32. Ma 64 kB pamięci Flash oraz 8 kB pamięci RAM. Pochodzi z rodziny STM32F0, która cechuje się relatywnie niską wydajnością, za to ich cena jest bardzo przystępna – rzędu nawet kilku złotych. Źródłem sygnału zegarowego dla podzespołów mikrokontrolera jest zewnętrzny rezonator kwarcowy 8 MHz, którego częstotliwość jest powielana sześciokrotnie poprzez wbudowany mnożnik z pętlą PLL. Wyjście wewnętrznego generatora kwarcowego jest sprzęgnięte z rezonatorem poprzez rezystor R17, który utrudnia wzbudzenie na częstotliwościach harmonicznych. W ten sposób, do dyspozycji jest przebieg o stabilnej częstotliwości 48 MHz. Jest on wprawdzie obarczony szumami fazowymi, wynikającymi z samej zasady działania PLL, lecz producent układ zadbał o to, by były one na akceptowalnym poziomie. W tym zastosowaniu nie trzeba się nimi bardzo przejmować, gdyż budowany generator jest przystosowany do relatywnie niskich częstotliwości.
Sekcja analogowa, zawierająca m.in. przetwornik C/A oraz układ PLL, jest zasilana za pośrednictwem filtru RC, składającego się z R16, C30 i C31. Producent sam zaleca, aby dodać ten, którego celem jest zmniejszenie przenikania zakłóceń z ogólnego zasilania 3,3 V, do którego dołączone są układy cyfrowe. Zasilanie dla pozostałych bloków mikrokontrolera jest filtrowane łącznie 6 kondensatorami – po trzy na jedno wejście zasilania. Równoległe połączenie kondensatorów 10 mF, 100 nF i 1 nF zapewnia skuteczne filtrowanie szerokiego spektrum częstotliwości. Wejście BOOT0 służy do wyboru źródła programu. W typowych zastosowaniach jego potencjał powinien być bliski zeru. Gdyby jednak w przyszłości zaszła potrzeba zmiany, wówczas można wylutować rezystor R15, a wolne pole lutownicze połączyć z +3,3 V.
Złącze J4 służy do komunikacji z mikrokontrolerem za pośrednictwem protokołu SWD. Układ wyprowadzeń w tym złączu został dostosowany do płytek ewaluacyjnych z mikrokontrolerami z tej rodziny. Zawierają one programator mogący obsługiwać również układy dołączane z zewnątrz.
Oprogramowanie
Oprogramowanie dla mikrokontrolera napisano w środowisku Coocox.
Przetwornik C/A jest sterowany w przerwaniach od timera TIM2 (listing 1). Użycie DMA byłoby o tyle lepsze, że do wystawiania próbek nie byłby potrzebny rdzeń. Niestety, konieczność zbudowania akumulatora fazy i dodawania kolejnych liczb spowodowała, że nie można użyć DMA, które potrafi odczytywać jedynie kolejne adresy z pamięci. Wartości próbek są wpisywane do rejestru wejściowego przetwornika A/C bezpośrednio, bez użycia gotowych funkcji biblioteki StdPeriph. Funkcja ta wykonuje kilka dodatkowych czynności, które tutaj zabierałyby jedynie cenny czas.
Tablica próbek tabl_gen jest tablicą dwuwymiarową. Pierwszy jej wymiar to kształt, a drugi to 256 kolejno ułożonych próbek jednego okresu wytwarzanego sygnału. W ten sposób przełączanie między kształtami nie wymaga kopiowania odtwarzanej na wyjściu tablicy, wystarczy przeskoczyć w inny obszar pamięci.
Sama konfiguracja przetwornika C/A oraz timera TIM2 znajduje się na listingu 2. Przetwornik wystawia próbkę zaraz po jej pojawieniu się w rejestrze wejściowym, bez zbędnej zwłoki. W ten sposób częstotliwość próbkowania jest zdeterminowana jedynie przez kolejne przerwania od TIM2. Przesyłanie danych wewnątrz struktury zajmuje nieco czasu, który może ulegać zmianom, lecz wynikły z tego szum fazowy nie jest dokuczliwy przy zastosowaniach audio. W module DAC wyłączono bufor wyjściowy, ponieważ jego parametry nie były wystarczające:
- bardzo długi czas narastania napięcia wyjściowego (rzędu kilku mikrosekund),
- duża rezystancja wyjściowa,
- zawężenie zakresu zmian napięcia wyjściowego o margines wynoszący ok. 0,2 V od napięcia zasilania.
Zamiast niego funkcję bufora wyjściowego pełni opisany już wtórnik napięciowy. Konieczne jest również ustawienie odpowiedniego przerwania w kontrolerze przerwań NVIC tak, aby przepełnienie timera TIM2 wymuszało przeskok do obsługi DAC.
Na listingu 3 pokazano funkcję, która zamienia ustawioną częstotliwość na wartość przesunięcia w akumulatorze fazy. Wynika to ze wzoru:
Celowo nie ucięto części ułamkowej, aby obliczona wartość była możliwie zbliżona do żądanej. Część całkowita i ułamkowa są mnożone oddzielnie, aby nie wprowadzać zmiennych zmiennoprzecinkowych. Te obliczenia są wykonywane w pętli głównej, dlatego czas ich trwania nie ma większego znaczenia. Częstotliwość jest przechowywana w postaci oddzielnych cyfr, jest to prostsze przy ustawianiu każdej z osobna.
Układ generatora został zmontowany na dwustronnej płytce drukowanej o wymiarach 108 mm×58 mm, której schemat montażowy przedstawia rysunek 5. Lutowanie elementów należy rozpocząć od warstwy górnej, na której znajduje się mikrokontroler i inne podzespoły w obudowach SMD. Po odwróceniu płytki na drugą stronę można wlutować pozostałe elementy, poczynając od najniższych. Pod układ US4 polecam zastosować podstawkę. Stabilizator US1 można przylutować na dłuższych wyprowadzeniach, po czym położyć na powierzchni laminatu. Na sam koniec polecam zostawienie montażu 16-pinowego złącza męskiego pod wyświetlacz ciekłokrystaliczny. Powinno zostać wlutowane od strony wierzchniej, więc wcześniejszy jego montaż utrudni pozostałe czynności. Rezonator kwarcowy, jeżeli jest w niskiej obudowie, może znaleźć się na warstwie górnej.
Domyślna konfiguracja zworek powinna być następująca: JP1 zwarte 2 z 4 oraz 1 z 3 (uaktywnienie filtru dolnoprzepustowego), JP2 zwarte 2 z 3 (separacja składowej stałej). W ten sposób bardzo łatwe stanie się wykrycie jakiegoś uszkodzenia w torze. Ponadto, do złącza J2 należy podłączyć potencjometr.
Po doprowadzeniu zasilania do złącza J1 (12…15 V DC) należy skontrolować wartości napięć wychodzących z układów US1, US2 i US3. W wypadku tego ostatniego napięcie może nie osiągać wartości –5 V, ale wystarczy, aby było niższe od –3 V. Jeżeli kontrola powiodła się, można przejść do ustawienia kontrastu wyświetlacza potencjometrem. Po wyregulowaniu, jeżeli wyświetlacz działa prawidłowo, górny wiersz powinien być wypełniony zaczernionymi prostokątami.
Kolejną czynnością jest zaprogramowanie pamięci Flash mikrokontrolera. Może do tego posłużyć programator z interfejsem SWD lub jakakolwiek płytka ewaluacyjna wyposażona w takie złącze. Jeżeli układ generator będzie zasilany podczas programowania, lepiej nie łączyć wyprowadzenia numer 1 złącza J4 z programatorem. Ewentualna różnica napięć zasilających może wywołać przepływ prądu o znaczącej wartości, co może uszkodzić któreś urządzenie. Jeżeli programowanie przebiegło poprawnie, ekran wyświetlacza powinien wyglądać tak, jak na fotografii 6.
Płytka drukowana pod układ generatora została przewidziana do montażu w obudowie Z-80. W pokrywie górnej należy wyciąć otwór pod wyświetlacz oraz wywiercić otworki na microswitch, impulsator i śruby mocujące płytkę. Te ostatnie znajdują się 3 mm od krawędzi płytki. W układzie prototypowym wyświetlacz został przykręcony do płytki za pomocą czterech tulei dystansowych M3, co wymagało powiększenia otworów w wyświetlaczu. Tuleje te mają długość 10 mm. Dodatkowo, pomiędzy metalową tuleją a powierzchnią płytki generatora warto dołożyć podkładki z nieprzewodzącego materiału, np. poliamidu. Jeżeli ich grubość wynosi ok. 1 mm lub mniej, złącze wyświetlacza będzie kontaktowało pewnie. W bocznych ściankach obudowy muszą się znaleźć otwory na potencjometr do regulacji amplitudy, wtyk zasilający oraz gniazdo lub przewody z generowanym sygnałem. Polecam również wyprowadzenie przełączników dołączonych do goldpinów JP1 i JP2, aczkolwiek nie jest to konieczne. Płytkę generatora można przykręcić do górnej pokrywy, również używając do tego czterech tulei dystansowych M3 i odpowiednich śrub. Długość tych tulei w układzie prototypowym wyniosła 15 mm. Układ w obudowie można zobaczyć na fotografii 7.
Układ generatora z zaprogramowanym mikrokontrolerem oraz prawidłowo ustawionym kontrastem wyświetlacza jest gotowy do użytku. Domyślna częstotliwość wynosi 0 Hz, zatem na wyjściu panuje napięcie stałe, zbliżone do zera. Zmiana częstotliwości odbywa się poprzez ustawianie wartości każdej cyfry z osobna za pomocą enkodera. Przełączanie między cyframi odbywa się poprzez wciskanie osi enkodera. Aktualnie zaznaczona cyfra jest sygnalizowana odpowiednim położeniem kropki nad liczbą wyrażającą częstotliwość. Regulacja odbywa się bezzwłocznie, tj. po zmianie wartości którejkolwiek cyfry, sygnał o nowej częstotliwości pojawia się na wyjściu.
Zmiana kształtu odbywa się poprzez wciskanie microswitcha. Trzy kształty są przewijane w pętli:
- SINE (sinusoida),
- TRIANGLE (trójkąt),
- SQUARE (prostokąt o wypełnieniu 50%).
Przebiegi czasowe tych sygnałów o częstotliwości 1 kHz i maksymalnej amplitudzie przedstawiają rysunki 8, 9 i 10. Wiernie odwzorowują one założone kształty. Widmo amplitudowe sygnału sinusoidalnego jest wolne od harmonicznych i innych zakłóceń, co przedstawia rysunek 11. Pewne zastrzeżenia można mieć do sygnału prostokątnego. Czas narastania jego zboczy wynosi ok. 4,7 ms, co odpowiada pasmu ok. 75 kHz. W niektórych wypadkach to może być zbyt mało, by zaobserwować niepożądane reakcje badanego układu. Dlatego do układu wprowadzono zworkę JP1, która pozwala ominąć filtr regeneracyjny i tym samym zmniejszyć czas narastania. Z wyłączonym filtrem czas narastania maleje do ok. 900 ns, co przekłada się na poszerzenie pasma sygnału prostokątnego do ok. 390 kHz. Wraz ze wzrostem częstotliwości maleje amplituda generowanego sygnału – ten spadek jest widoczny powyżej ok. 20 kHz. Dlatego warto na bieżąco monitorować amplitudę za pomocą oscyloskopu, ponieważ generator jej nie kontroluje.
Zachęcam do własnych eksperymentów z tym układem, zwłaszcza z filtrem dolnoprzepustowym. Zastosowanie innego filtru może diametralnie zmienić jakość generowanego sygnału.
Michał Kurzela, EP