Celem projektu było zbudowanie prostego układu opartego na mikrokontrolerze AVR w małej, 8-nóżkowej obudowie, przy czym układ miał wykorzystywać do maksimum możliwości mikrokontrolera i zawierać minimalną liczbę elementów zewnętrznych. Jako serce wybrano układ ATtiny25, zawierający 2 kB pamięci FLASH, 10-bitowy przetwornik A/C i szybki układ czasowy z wyjściami PWM.
Do wytwarzania przebiegu sinusoidalnego użyto bezpośredniej syntezy cyfrowej. W pamięci stałej umieszczono 1024 próbki wartości jednego okresu przebiegu sinusoidalnego. Wartości te są odczytywane w odstępach czasu równych okresowi próbkowania TS (1,6 µs). Po każdym odczycie adres pamięci (reprezentujący fazę przebiegu) zmienia się o wartość Δ=f∙1024TS, gdzie f jest częstotliwością generowanego przebiegu. W ogólnym przypadku D jest liczbą ułamkową.
Mikrokontroler używa formatu stałoprzecinkowego. Zarówno faza, jak i jej przyrost mają 32 bity, z których 6 najstarszych jest ignorowanych, kolejne 10 wyznacza adres pamięci, a 16 najmłodszych stanowi część ułamkową. Najmniejsza możliwa do uzyskania niezerowa wartość Δ to 1/65536; odpowiadałaby jej częstotliwość 1/65536/(1024∙1,6 µs)=0,00931 Hz. W generatorze wartość Δ zawiera się w przedziale od 0,03276 do 32,76.
Synteza odbywa się w przerwaniach Timera 0, które są generowane co 32 okresy wewnętrznego systemowego zegara taktującego (20 MHz). Częstotliwość wytwarzanego przebiegu sinusoidalnego jest więc pochodną częstotliwości zegara systemowego. Źródłem tego zegara jest wewnętrzny generator RC. W danym egzemplarzu układu scalonego jego częstotliwość może się nieco różnić od standardowej. Dlatego w układzie wprowadzono możliwość dostrojenia (kalibracji) generatora RC z dokładnością ok. 1%.
Przetwornik C/A jest oparty na układach modulacji szerokości impulsu (PWM) mikrosterownika. Metoda przetwarzania PWM wykorzystuje fakt, że prostokątny przebieg cyfrowy o amplitudzie U i współczynniku wypełnienia K (0...1) ma wartość średnią równą U∙K. Po odfiltrowaniu składowej zmiennej przebiegu otrzymujemy napięcie wprost proporcjonalne do współczynnika K. Układ złożony z generatora fali prostokątnej o sterowanej szerokości i z filtru dolnoprzepustowego staje się więc przetwornikiem C/A.
Na rysunku 1 przedstawiono ideę przetwarzania PWM. Kolorem niebieskim narysowano przebieg cyfrowy (przed filtrem), a kolorem czerwonym – jego wartość średnia (po filtrze).
Założeniem przyjętym przy projektowaniu generatora było użycie wysokiej częstotliwości fPWM – kilka MHz. Modulator PWM, taktowany z 80 MHz i pracujący z rozdzielczością 8 bitów, generowałby jednak przebieg o częstotliwości 80 MHz/256=312,5 kHz. Dlatego wykorzystano dwa modulatory. Każdy z nich ma rozdzielczość 4-bitową, a więc fPWM=80 MHz/16=5 MHz. Modulator A przetwarza górne 4 bity każdej próbki, a modulator B – 4 bity dolne (o 16-krotnie mniejszej wadze). Przebiegi obu modulatorów są sumowane w R1/R2. Odpowiednie wagi zapewnia stosunek rezystancji wynoszący 1:16.
Rezystory tworzą wraz z C1 filtr dolnoprzepustowy 1. rzędu. Sinusoidalny sygnał wyjściowy ma częstotliwość do 20 kHz. Filtr nie powinien tłumić go bardziej niż o 0,5 dB, stąd częstotliwość graniczna fg wynosząca 70 kHz. fPWM wynosi 5 MHz, tętnienia osiągają więc ok. 100 mVpp. Przewidziano ich redukcję poprzez dodanie drugiego filtru dolnoprzepustowego, jak pokazano na rysunku 2.
Nastawa częstotliwości
Zakres generatora jest wybierany 3-pozycyjnym przełącznikiem S1 i wynosi, w pozycjach 1, 2 i 3, odpowiednio 20...200 Hz, 200 Hz...2 kHz i 2...20 kHz. Przełącznik ustawia na wejściu PB2 napięcia 0 V, +2,5 V lub +5 V, mierzone przez przetwornik A/C.
Regulacja częstotliwości wewnątrz zakresu jest wykonywana potencjometrem P1. Ewentualne „trzaski” potencjometru są filtrowane cyfrowo ze stałą czasową 50 ms. Charakterystyka potencjometru zawiera trzy strefy nieczułości o niewielkiej szerokości. Ułatwiają one ustawienie częstotliwości 20 Hz, 100 Hz, 200 Hz, 1 kHz, 2 kHz, 10 kHz i 20 kHz, często używanych w praktyce.
Kalibracja
Kalibracja wewnętrznego generatora RC polega na zmniejszaniu lub zwiększaniu stanu rejestru OSCCAL. Nową wartość OSCCAL program generatora zapisuje w nieulotnej pamięci EEPROM i wartość ta jest przywracana po każdym włączeniu zasilania.
W celu przeprowadzenia kalibracji należy wybrać zakres 200 Hz...2 kHz (przełącznik S1 w pozycji 2), a potencjometrem P1 ustawić częstotliwość 200 Hz, 1 kHz lub 2 kHz. Zmniejszenie/zwiększenie częstotliwości o jeden krok odbywa się przez dołączenie wejścia PB2 odpowiednio do masy lub +5 V przez rezystor 10 kΩ. Można w tym celu dodać na stałe rezystor (R6) i zworki (J2) ew. przyciski. Aby zapobiec efektowi drgania styków, program nie reaguje na zmiany stanu na PB2, jeśli są one krótsze niż 20 ms.
Podczas kalibracji należy unikać ustawiania częstotliwości większych niż znamionowa, gdyż wiązałoby się to z przekroczeniem dopuszczalnej częstotliwości zegara systemowego.
Montaż i uruchomienie
Schemat generatora przedstawia rysunek 3. Żółtą linią zaznaczono układ w wersji minimalnej. Aby zapewnić możliwość regulacji poziomu sygnału wyjściowego i jednocześnie odciąć składową stałą wynoszącą ok. +2,2 V, należy dołączyć kondensator C3 i potencjometr P2. Elementy R3 i C2 tworzą dodatkowy opcjonalny filtr dolnoprzepustowy, obniżający tętnienia do poziomu kilku miliwoltów.
Złącze J2 i rezystor R6 służą do kalibracji częstotliwości.
Przez złącze J3 można zaprogramować mikrokontroler (przedtem należy przełączyć S1 w pozycję 2). Ustawienia bitów-bezpieczników są następujące:
- LOW BYTE = 0xF1: CKDIV8=1, CKOUT=1, SUT1:0=11 (14 CK+16K CK+64 ms), CKSEL3:0=0001 (PLL Clock_
- HIGH BYTE = 0xDF: RSTDISBL=1, DWEN = 1, SPIEN=0, WDTON=1, EESAVE=1, BODLEVEL2:0=111
- EXTENDED=0xFF: SELFPRGEN = 1
Zaprogramowanie pamięci flash jest jedyną czynnością wymaganą przy uruchamianiu układu. Do zasilania generatora należy użyć stabilizowanego napięcia stałego 5 V±10%.
Jarosław Ziembicki
j.ziembicki@gmx.at
- R1: 1,1 kΩ
- R2: 18 kΩ
- R3: 1 kΩ
- R4...R6 10...22 kΩ (trzy jednakowe, 5%)
- C1: 2,7 nF (5 mm)
- C2: 470 pF (5 mm)
- C3: 10 µF/16 V (5 mm)
- C4: 0,1 µF (ceramiczny, 5 mm)
- U1: ATtiny25-20PU (obudowa DIP8)
- J1: gniazdo sygnałowe (np. BNC lub cinch)
- J2: złącze kalibracji (np. szpilkowe 3×1)
- J3: złącze szpilkowe 2×3
- J4: złącze zasilania (np. szpilkowe 2×1)
- P1, P2: potencjometr 10 kΩ, liniowy
- S1: przełącznik 3-pozycyjny