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.
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.
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.
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.
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%).
Michał Kurzela, EP