Image:Praca inzynierska Wasala Serus

advertisement
PAŃSTWOWA WYŻSZA SZKOŁA
ZAWODOWA W TARNOWIE
INSTYTUT POLITECHNICZNY
Kierunek: ELEKTRONIKA I TELEKOMUNIKACJA
PRACA INŻYNIERSKA
Tytuł pracy:
Badanie wybranych urządzeń cyfrowej rejestracji dźwięku
Autorzy:
Opiekun pracy:
Krzysztof Wąsala
dr inż. Robert Wielgat
Jakub Seruś
Tarnów 2010
1
2
Spis treści
1. Wstęp.............................................................................................................................4
2. Przetwarzanie analogowo-cyfrowe................................................................................6
2.1 Teoria......................................................................................................................6
2.2 Rodzaje współcześnie stosowanych przetworników..............................................9
3. Układ do badania przetworników A/C........................................................................16
3.1 Zastosowane układy scalone.................................................................................18
3.1.1 Mikrokontroler LPC2368 (minimoduł MMlpc236x)....................................18
3.1.2 Przetwornik AD1871.....................................................................................25
3.1.3 Przetwornik AD7652.....................................................................................27
3.1.4 Układ FT2232H (minimoduł MMusbX232H)..............................................29
3.1.5 Wzmacniacz operacyjny OP275...................................................................30
3.2 Zasilanie układu....................................................................................................31
3.3 Połączenia modułów.............................................................................................32
3.3.1 MMlpc236x z AD1871 oraz AD7652...........................................................32
3.3.2 MMlpc236x z MMusbX232H.......................................................................34
3.4 Przedwzmacniacz mikrofonowy na układzie OP275...........................................35
3.5 Konfiguracja mikrokontrolera LPC2368 (wraz z minimodułem)........................37
3.5.1 Środowisko programistyczne Keil uVision4 oraz program Flash Magic.....37
3.5.2 Konfiguracja rdzenia oraz peryferiów...........................................................40
3.5.3 Program sterujący..........................................................................................44
3.6 Konfiguracja przetworników A/C.........................................................................59
3.6.1 AD1871.........................................................................................................59
3.6.2 AD7652.........................................................................................................62
3.7 Konfiguracja FT2232H (oraz minimodułu)..........................................................64
3.8 Aplikacja dla systemu Windows przechwytująca wyniki przetwarzania A/C......66
4. Działanie układu do badania przetworników analogowo-cyfrowych.........................74
5. Podsumowanie.............................................................................................................77
6. Bibliografia..................................................................................................................78
7. Podział obowiązków....................................................................................................79
DODATEK A: Projekty obwodów drukowanych...........................................................81
3
1. Wstęp
Zagadnienia związane z cyfrowym przetwarzaniem sygnałów są w dzisiejszych
czasach niezwykle istotne. Jest to wynikiem upowszechnienia się elektroniki cyfrowej,
która wypiera technikę analogową. Taka tendencja jest obserwowana od wielu lat, i z
każdym rokiem wydaje się, że nabiera coraz większego tempa. Powodów takiego stanu
rzeczy jest wiele. Przede wszystkim, wydajne układy cyfrowe są tanie, a ich
możliwości, w zakresie tworzenia przemysłowych systemów sterowania czy obróbki
sygnałów audio-wideo, znacznie przekraczają te, oferowane przez układy analogowe.
Do zalet układów cyfrowych dodać należy jeszcze prostotę w tworzeniu nawet
skomplikowanych algorytmów, niski, w porównaniu z elektroniką analogową, wręcz
znikomy pobór energii elektrycznej, niezawodność oraz odporność na zakłócenia.
Powyższe stwierdzenia w oczywisty sposób wyjaśniają, dlaczego technika
cyfrowa cieszy się dzisiaj tak dużą popularnością. Zanim jednak zacznie się przetwarzać
dane za pomocą wydajnych układów cyfrowych, analogowe sygnały, które są obecne w
naszym świecie, trzeba zamienić na postać cyfrową. Do tego celu służą przetworniki
analogowo-cyfrowe, które są bardzo ważną składową każdego systemu. Od ich
możliwości zależy, na jak wiernie oddanym sygnale będą operować układy realizujące
konkretną funkcję bądź algorytm. Obecnie, na rynku dostępnych jest wiele
przetworników, różniących się sposobem przetwarzania (np. SAR, sigma-delta) oraz
parametrami, takimi jak częstotliwość próbkowania czy rozdzielczość bitowa. Różne
typy przetworników sprawdzają się inaczej w różnych zastosowaniach, dlatego zawsze
trzeba dobrać układ do własnych potrzeb.
Niniejsza
pozwalającego
praca
inżynierska
badać
możliwości
była
próbą
stworzenia
przetworników
prostego
układu,
analogowo-cyfrowych
w
zastosowaniach audio.
Jak już zostało powiedziane, celem pracy było stworzenie układu, który pozwoli
porównać ze sobą dwa przetworniki A/C oraz ocenić ich możliwości podczas zamiany
sygnałów audio. Budowa samego układu nie determinuje w zasadzie, jakiego typu i do
jakich celów przetworniki będzie można badać. Jego zadaniem jest przesłanie wyników
4
przetwarzania A/C do komputera PC, na którym znajduje się odpowiednia aplikacja. Od
niej zależy, w jaki sposób sygnały zostaną zbadane.
Transmisja odbywa się przy wykorzystaniu protokołu RS232 oraz układu FT2232H,
podpiętego do portu USB komputera. Dane z przetworników zbiera mikrokontroler
LPC2368, a następnie wysyła je do FT2232H, który jest pomostem między
mikrokontrolerem, a komputerem PC. Zastosowanie FT2232H upraszcza całe
przedsięwzięcie, ponieważ rozwiązuje kwestię implementacji protokołu USB. Układ
może być skonfigurowany, aby był widziany w komputerze, jako dodatkowy port COM
(tzw. wirtualny COM). Z uwagi na ograniczenia w prędkości transmisji takiego
rozwiązania, połączenie odbywa się z wykorzystaniem dedykowanej biblioteki,
dostarczanej przez producenta układu. To pozwala na bezpośrednią i szybką
komunikację z FT2232H.
Przetworniki
A/C
otrzymują
sygnał
analogowy
z
przedwzmacniacza
mikrofonowego, opartego o układ OP275, lub bezpośrednio z mikrofonu, bądź innego
źródła sygnału analogowego.
W niniejszym opracowaniu pracy inżynierskiej znajduje się podstawowa wiedza
teoretyczna
o
sygnałach
cyfrowych,
jest
pokrótce
wyjaśnione
zagadnienie
przetwarzania informacji na postać cyfrową, a pod koniec rozdziału 2. – są omówione
stosowane obecnie typy przetworników analogowo-cyfrowych.
Kolejne części traktują o budowie układu do badania przetworników, jego
programowaniu oraz konfiguracji. Następnie jest omówiona aplikacja dla komputera
PC.
Rozdział 4, to podsumowanie pracy inżynierskiej.
5
2. Przetwarzanie analogowo-cyfrowe
2.1 Teoria
Proces przetwarzania analogowo-cyfrowego składa się z dwóch etapów:
próbkowania oraz kwantowania.
Próbkowanie polega na pomiarze zmiennej w czasie wielkości analogowej w
pewnych (najczęściej regularnych) odstępach czasu. Podczas każdego takiego pomiaru,
zachodzi proces, zwany kwantowaniem, a więc przypisaniem zmierzonej wartości
analogowej jej cyfrowego odpowiednika. Liczba takich przedziałów (odpowiedników)
może być różna, w zależności od rozdzielczości bitowej przetwornika A/C. Im więcej
przedziałów (większa rozdzielczość), tym odwzorowanie sygnału analogowego
(przyjmującego nieskończenie dużą liczbę wartości w danym przedziale czasu)
dokładniejsze.
Rys.1 Próbkowanie oraz kwantyzacja1
Z kwantowaniem jest związane pojęcie kodowania, ponieważ każdemu
przedziałowi można przypisać jego wartość, przedstawioną w różny sposób. Może to
być naturalny kod binarny, kod BCD, U2 (uzupełnień do dwóch), kod Graya i wiele
innych.
Proces próbkowania może zachodzić z różną częstotliwością, którą nazywa się
częstotliwością próbkowania. Jej wartość jest uzależniona od szybkości zmian
przetwarzanego sygnału analogowego. Im szybsza zmienność, tym wyższa powinna być
częstotliwość próbkowania. Oczywiście sygnały wolno zmienne można próbkować z
dużą częstotliwością, jednak nie jest to rozwiązanie optymalne, gdyż wzrasta wtedy
1 Źródło: http://pl.wikipedia.org/wiki/Próbkowanie
http://pl.wikipedia.org/wiki/Kwantyzacja_(technika)
6
ilość informacji, jakie trzeba będzie później przetwarzać. Sygnał powinien być
próbkowany z częstotliwością pozwalającą na jego późniejsze odtworzenie. Przyjmuje
się, że powinna ona wynosić więcej, niż podwojona graniczna częstotliwość widma
przetwarzanego sygnału analogowego (twierdzenie Kotielnikowa-Shannona):
fp > 2fgr
(1.1)
gdzie:
fp – częstotliwość próbkowania
fgr – graniczna częstotliwość widma sygnału
W praktyce, znalezienie optymalnej częstotliwości próbkowania nie musi wiązać się z
analizą widmową sygnału analogowego, poddawanego dyskretyzacji. Dla sygnałów
audio, za częstotliwość graniczną przyjmuje się 20 kHz, ponieważ ludzki narząd słuchu
nie potrafi odbierać wyższych częstotliwości. Najczęściej f p dla zastosowań audio
wynosi 44,1 kHz, a więc spełnia warunek (1.1).
Kodowanie
Jak zostało powiedziane, każdemu przedziałowi, powstałemu w wyniku
kwantowania sygnału analogowego, można przypisać wartości, wykorzystując różne
rodzaje kodowania. Omówione zostaną dwa, naturalny kod binarny i kod uzupełnień do
dwóch (U2), ponieważ na takich operują zastosowane w niniejszej pracy inżynierskiej
przetworniki A/C.
Liczby całkowite w naturalnym kodzie binarnym zapisuje się wg
następującego schematu:
ai-1 · 2i-1 + ai-2 · 2i-2 + ... + a2 · 22 + a1 · 21 + a0 · 20
(1.2)
Ponieważ jest to pozycyjny system liczbowy o podstawie 2, stosuje się kolejne potęgi
tej cyfry, które są mnożone przez liczby 1 bądź 0, czyli elementy zbioru znaków
systemu binarnego. Liczba 10 zapisana w systemie dwójkowym przybiera postać 1010:
10102 = 1 · 23 + 0 · 22 + 1 · 21 + 0 · 20 = 1010
7
W systemie binarnym można również zapisywać liczby rzeczywiste:
0,1012 = 0 · 20 + 1 · 2-1 + 0 · 2-2 + 1 · 2-3 = 0,62510
Najpopularniejszym, stosowanym obecnie sposobem zapisu liczb całkowitych w
systemach cyfrowych, jest kod uzupełnień do dwóch (U2). Wynika to z faktu, iż
operacje dodawania oraz odejmowania są w nim wykonywane tak samo, jak dla liczb
binarnych bez znaku.
W U2, na n bitach da się zapisać liczby z zakresu:
-2 n-1 , 2 n-1 – 1
W kodzie uzupełnień do dwóch, najstarszy bit jest nazywany bitem znaku, ponieważ
świadczy o znaku liczby:
•
„1” na najbardziej znaczącej pozycji oznacza, że liczba jest ujemna,
•
„0” na najbardziej znaczącej pozycji oznacza, że liczba jest dodatnia.
Aby zamienić liczbę w U2 na przeciwną, należy wykonać dwie czynności:
•
dokonać inwersji bitów, czyli zamienić 0 na 1 i odwrotnie,
•
do powstałej liczby dodać wartość 1.
Na przykład, dana jest liczba:
1010 = 000010102
Po inwersji i zwiększeniu o jeden:
111101012 + 1 = 11110110U2 =
= 1 · (-(27)) + 1 · 26 + 1 · 25 + 1 · 24 + 0 · 23 + 1 · 22 + 1 · 21 + 0 · 20 =
= -128 + 64 + 32 + 16 + 4 + 2 = -1010
8
2.2 Rodzaje współcześnie stosowanych przetworników2
Przetworniki analogowo-cyfrowe zamieniają wejściowe napięcie analogowe na
odpowiadającą mu liczbę ze znakiem, zapisaną na określonej liczbie bitów, w
odpowiednim kodowaniu (np. w kodzie uzupełnień do dwóch). Ta liczba jest tak
naprawdę numerem przedziału kwantowania, a więc pewnym przybliżeniem
rzeczywistej wartości przetwarzanego napięcia. Wielkość przybliżenia, a więc
dokładność przetwarzania, jest uzależniona od bitowej rozdzielczości przetwornika. Im
większa, tym więcej przedziałów kwantowania i lepsza dokładność. Podstawowe
parametry, charakteryzujące przetworniki A/C, to:
•
czas konwersji (przetwarzania) – czas, jaki upływa od podania sygnału
wejściowego, rozpoczynającego przetwarzanie, a pojawieniem się na wyjściu
sygnału cyfrowego
•
rozdzielczość, definiowana jako:
ΔU = Uref / 2n
n – liczba bitów słowa wyjściowego.
Rys.2 Charakterystyka przejściowa przetwornika A/C
•
błąd kwantyzacji (ΔU/2 lub LSB/2) – odchylenie rzeczywistej charakterystyki
2
Na podstawie: Tomasz P. Zieliński: Cyfrowe przetwarzanie sygnałów. Od teorii do zastosowań.
Warszawa, WKŁ 2007
Wojciech Głocki: Układy cyfrowe. Warszawa, WSiP
9
(„schodkowej”) od charakterystyki idealnej.
Metody przetwarzania analogowo-cyfrowego dzieli się na dwie podstawowe
grupy:
•
bezpośrednie,
•
pośrednie.
Metody bezpośrednie polegają na natychmiastowym porównaniu wielkości poddawanej
przetwarzaniu z wielkości referencyjną (odniesienia). Do tej grupy zaliczają się
przetworniki bezpośredniego porównania oraz kompensacyjne.
W metodach pośrednich, wielkość przetwarzana jest najpierw zamieniana na wielkość
pomocniczą, np. czas. Wielkość pomocnicza jest z kolei porównywana z odniesieniem.
Do najczęściej spotykanych przetworników A/C należą:
•
przetworniki bezpośredniego porównania,
•
przetworniki z kompensacją równomierną,
•
przetworniki z kompensacją wagową,
•
przetworniki typu sigma-delta,
•
przetworniki całkujące, w szczególności podwójnie całkujące.
Przetworniki bezpośredniego porównania
Zwane również przetwornikami typu Flash, są najszybszymi przetwornikami
analogowo-cyfrowymi. Metoda przetwarzania wielkości analogowej na cyfrową polega
na jednoczesnym porównaniu napięcia wejściowego, z odpowiednimi częściami
napięcia odniesienia, otrzymanymi z dzielnika. Porównywaniem zajmują się
komparatory, których ilość jest determinowana rozdzielczością przetwornika, zgodnie z
zależnością:
2n–1
(1.3)
gdzie: n – rozdzielczość przetwornika.
10
Zaletą przetworników z bezpośrednim porównaniem jest szybkość działania. Duża
liczba komparatorów powoduje, że wynik przetwarzania jest otrzymywany natychmiast.
Te same komparatory stanowią również o dość poważnej wadzie urządzenia. Jak łatwo
wyliczyć z zależności (1.3), wraz z każdym dodatkowym bitem rozdzielczości, ilość
komparatorów się podwaja. Ma to negatywny wpływ na koszty oraz zajmowaną
powierzchnię. Z tego powodu, budowane są tylko przetworniki o rozdzielczości
ograniczonej do 8 bitów.
Rys.3 Przetwornik A/C typu Flash
Przetworniki z kompensacją równomierną
Po uruchomieniu, licznik zaczyna zliczać impulsy generatora. Na jego wyjściu
pojawiają się kolejne liczby binarne (0000, 0001, 0010, 0011, …), które są podawane na
wejście przetwornika C/A i zamieniane na napięcie analogowe. To, w komparatorze,
jest porównywane z przetwarzanym napięciem wejściowym. Wyjście komparatora jest
równe 1, dopóki napięcie wejściowe jest większe od napięcia pochodzącego z
przetwornika C/A. W końcu jednak, rosnące liniowo napięcie U C/A przekracza wartość
Uwe, co powoduje pojawienie się 0 na wyjściu komparatora i zatrzaśnięcie stanu
licznika, który jest wynikiem przetwarzania C/A.
Zaletą przetwornika z kompensacją liniową jest prostota, natomiast główną wadą –
11
długi czas przetwarzania dla napięć wejściowych zbliżonych do maksymalnego
napięcia zakresowego, bowiem musi wtedy zostać wykonana duża liczba porównań. Z
tego powodu, przetwornik nie znajduje wielu zastosowań w praktyce.
Rys.4 Przetwornik A/C z kompensacją równomierną (liniową)
Przetworniki z kompensacją wagową
Rys.5 Przetwornik A/C z kompensacją wagową
Przetworniki z kompensacją wagową są znacznie szybsze od układów z
kompensacją równomierną. Przetwarzanie polega na kolejnym porównywaniu napięcia
wejściowego z napięciem uzyskanym z przetwornika C/A. Różnica, w porównaniu do
kompensacji równomiernej, polega na tym, że układ logiki ustawia kolejno bity od
najstarszego do najmłodszego, i pozostawia je lub kasuje w zależności od sygnału z
komparatora. Na początku jest syntezowane napięcie równe połowie zakresu (1000) –
rysunek 6. Ponieważ jest ono mniejsze od Uwe, włączony poprzednio bit pozostaje
ustawiony i dokładany jest młodszy (1100), który powoduje ustawienie napięcia
równego 3/4 zakresu. To nadal jest mniejsze od wejściowego, zatem jest ustawiany
12
kolejny młodszy bit (1110). Napięcie uzyskane na wyjściu przetwornika C/A jest tym
razem wyższe od przetwarzanego, a więc ostatnio ustawiony bit jest kasowany, a zostaje
ustawiony następny, tym razem ostatni (jest rozważany przetwornik 4-bitowy) – 1101.
Jak widać na wykresie, napięcie wciąż jest trochę wyższe od wejściowego, jednak
skończyły się już bity, które można by dalej ustawiać, bądź gasić. Zatem wynik
konwersji analogowo-cyfrowej, to 1101.
Przetworniki tego typu są szybkie i względnie tanie, dlatego znajdują znacznie szersze
zastosowanie, niż przetworniki z kompensacją liniową.
Rys.6 Zasada działania przetwornika z kompensacją wagową
Przetworniki typu sigma-delta3
Działanie przetworników sigma-delta opiera się na nadpróbkowaniu sygnału, co
umożliwia kształtowanie szumu kwantyzacji, konkretnie jego przesunięcie poza pasmo
użyteczne sygnału.
Rys.7 Modulator sigma-delta4
3 Na podstawie: Robert Bandyk: Dlaczego przetwornik 1-bitowy jest lepszy od 16-bitowego, część 3.
Elektronika dla wszystkich. Kwiecień 2003
4 Źródło: Robert Bandyk: Dlaczego przetwornik 1-bitowy jest lepszy od 16-bitowego, część 3.
13
Metoda przetwarzania sigma-delta, to tak naprawdę technika PDM (pulse density
modulation), w której przetwornik określa różnicę (Δ - delta) między aktualną wartością
sygnału, a sumą (Σ – sigma) wartości poprzednich próbek wyjściowych. Można
powiedzieć, że na wyjściu przetwornika sigma-delta, w danej chwili może pojawić się
jedna z dwóch wartości: 0 lub 1, wskazująca, czy w tej chwili sygnał wejściowy jest
większy czy mniejszy od scałkowanej sumy poprzednich próbek. Na przetwornik jest
podawany sygnał analogowy, a na wyjściu pojawia się 1-bitowy ciąg impulsów o dużej
częstotliwości, zmodulowany sygnałem wejściowym. Liczba impulsów w jednostce
czasu odpowiada wartości amplitudy sygnału wejściowego, co ilustruje rysunek 8. W
kolejnej fazie, 1-bitowy strumień jest odfiltrowywany i przekształcany w cyfrowy
sygnał wyjściowy. Strumień jest tak ukształtowany przez modulator, aby większość
energii szumu kwantyzacji znalazła się poza użytecznym pasmem sygnału.
Rys.8
Do największych zalet przetworników typu sigma-delta należą duże rozdzielczości, oraz
zwiększone SNR. Wady, to niskoczęstotliwościowy zakres zastosowań oraz duże
zapotrzebowanie na moc.
Przetworniki z podwójnym całkowaniem
Przetwornik tego typu zamienia średnią wartość mierzonego napięcia na czas, a
więc należy do grupy urządzeń z przetwarzaniem pośrednim. W pierwszym cyklu
całkowania, do integratora jest doprowadzone mierzone napięcie, które ładuje
kondensator. W tym samym czasie jest uruchamiany licznik impulsów. W kolejnej fazie,
Elektronika dla wszystkich. Kwiecień 2003
14
do integratora jest dołączane napięcie odniesienia o przeciwnej biegunowości, które
rozładowuje pojemność. Moment całkowitego rozładowania kończy zliczanie
impulsów, których liczba odpowiada wartości przetwarzanego napięcia analogowego.
Metoda podwójnego całkowania jest dokładna, ale też powolna.
Rys.9 Przetwornik A/C podwójnie całkujący
15
3. Układ do badania przetworników A/C
Zbudowany na potrzeby pracy inżynierskiej układ składa się z pięciu modułów,
które zostały osadzone na zaprojektowanej do tego celu płycie głównej:
•
minimoduł MMlpc236x, z mikrokontrolerem LPC2368,
•
moduł z przetwornikiem AD1871,
•
moduł z przetwornikiem AD7652,
•
przedwzmacniacz mikrofonowy, oparty o układ scalony OP275,
•
minimoduł MMusbX232H, z układem FT2232H.
Rys.10 Układ do badania przetworników A/C
16
Na płycie głównej znajdują się gniazda typu żeńskiego, w których są osadzane moduły.
Każda z nóżek układu scalonego ma podwójne wyprowadzenia na płycie głównej
(oprócz przedwzmacniacza mikrofonowego), w postaci łącz szpilkowych. Moduły są
łączone ze sobą za pomocą przewodów, co pozwala dowolnie konfigurować cały układ.
Ponadto, na płycie głównej zostały umieszczone trzy stabilizatory, dostarczające
napięcia do zasilania modułów. Do dyspozycji jest jest jeden regulator 3,3 V oraz dwa
po 5 V. Przewidziane zostały również dwa wejścia, jedno dla zasilacza sieciowego oraz
drugie – wejście typu mini-jack dla mikrofonu.
Zadaniem
stworzonego
układu
jest
zapisanie
wyników
przetwarzania
analogowego-cyfrowego na komputerze PC. Do wejść przetworników A/C jest
podłączone wyjście przedwzmacniacza mikrofonowego lub inne źródło sygnału
analogowego. Wyjścia przetworników, na których pojawiają się rezultaty konwersji, są
podłączone do odpowiednich interfejsów mikrokontrolera LPC2368.
Przetwornik AD7652 (SAR) łączy się z mikrokontrolerem poprzez interfejs SPI,
wykorzystywany
do
przesyłania
rezultatów
konwersji
analogowo-cyfrowej.
Przetwornik jest kontrolowany głównie poprzez podłączenie odpowiednich nóżek do
stanu niskiego bądź wysokiego (masy lub 5 woltów), z wyjątkiem dwóch
wyprowadzeń, które są połączone z dwoma wyprowadzeniami mikrokontrolera
LPC2368, ustawionymi w tryb wejść/wyjść ogólnego przeznaczenia.
Przetwornik AD1871 (sigma-delta) wykorzystuje magistrale SSP0 (pracującą w
trybie SPI) oraz I2S. Pierwsza jest wykorzystywana do konfiguracji przetwornika, druga
– do przesyłu danych. Przetwornik AD1871 działa w trybie master, z częstotliwością
próbkowania 96 kHz. Z taką samą częstotliwością, przez interfejs I2S, wysyła dane do
mikrokontrolera. Za odbiór informacji jest odpowiedzialna funkcja wywoływana
przerwaniem od timera w LPC2368. Timer zgłasza przerwanie z częstotliwością 96
kHz. W tej samej funkcji następuje inicjalizacja przetwarzania w AD7652 (który działa
w trybie slave), a następnie odczytanie rezultatów konwersji i zapisanie ich do pamięci.
Z przetwornika AD1871 jest odbierane 64 bity informacji (po 32 bity na kanały lewy i
prawy), natomiast z AD7652 – 16 bitów (jest to przetwornik mono).
Po każdorazowym odczycie obu przetworników, następuje wysłanie danych do układu
FT2232H, a z niego – do komputera PC. Mikrokontroler LPC2368 łączy się z FT2232H
17
wykorzystując interfejs UART3 (RS232), którym wysyła pięć 8-bitowych paczek
danych (ograniczenie protokołu RS232), co daje łącznie 40 bitów informacji. Pierwsze
3 bajty, to wyniki konwersji z przetwornika AD1871, konkretnie jego lewego kanału.
Pozostałe 2 bajty, to rezultat przetwarzania AD7652.
Odczyt danych z FT2232H na komputerze może odbywać się dwojako.
Pierwszym sposobem jest skonfigurowanie układu, aby był widziany w systemie
Windows, jako wirtualny port COM. To rozwiązanie nie zapewnia jednak
wystarczającej szybkości przesyłu danych, dlatego w pracy inżynierskiej został
wykorzystany drugi sposób, czyli bezpośredni dostęp do buforów układu FT2232H. Jest
to możliwe, dzięki specjalnej bibliotece, dostarczanej przez producenta układu (FTDI),
zawierającej zestaw odpowiednich funkcji.
Na komputerze PC działa aplikacja, która, z odpowiednią częstotliwością,
odczytuje bufory FT2232H i odbiera 1-bajtowe paczki danych. Dwie pierwsze
(odpowiadające przetwornikowi AD1871) zapisuje, jako lewy kanał pliku WAVE,
natomiast dwie ostatnie (AD7652) – jako prawy. Jak widać, brakuje 1 bajta danych z
przetwornika AD1871. Jest to najmniej znaczący bajt i jest on pominięty. Następnie
program dokłada wymagany nagłówek i zapisuje plik na dysku twardym.
Otrzymany w ten sposób plik zawiera rezultaty konwersji analogowo-cyfrowej z obu
przetworników. Z wykorzystaniem odpowiedniej aplikacji, można przeprowadzić np.
analizę częstotliwościową zebranych danych. Układ może zostać również wykorzystany
do celów dydaktycznych, ponieważ jest rekonfigurowalny.
3.1 Zastosowane układy scalone
3.1.1 Mikrokontroler LPC2368 (minimoduł MMlpc236x)5
Mikrokontroler LPC2368 jest sercem układu do badania przetworników
analogowo-cyfrowych. Jest oparty o rdzeń AMR7TDMI-S, który może pracować z
częstotliwością do 72 MHz. Najważniejsze cechy LPC2368, to:
5 Na podstawie: LPC23XX User's manual. Rev. 02 - NXP B.V., 2009
18
•
rdzeń AMR7TDMI-S, pracujący z częstotliwością do 72 MHz,
•
512 kB wbudowanej pamięci Flash oraz 32 kB lokalnej pamięci SRAM
ogólnego przeznaczenia, podłączonej do szybkiej, lokalnej magistrali procesora,
•
16 kB pamięci SRAM dla interfejsu Ethernet; może zostać wykorzystana, jako
pamięć ogólnego przeznaczenia,
•
8 kB pamięci SRAM dla interfejsu USB; może zostać wykorzystana, jako
pamięć ogólnego przeznaczenia,
•
podwójna, szybka magistrala AHB, dla jednoczesnej komunikacji z interfejsami
USB oraz Ethernet, a także wykonywania programu z lokalnej pamięci Flash,
•
zaawansowany, wektoryzowany kontroler przerwań, wspierający do 32
przerwań,
•
kontroler DMA podłączony do magistrali AHB, który może być wykorzystany
do komunikacji z interfejsem SSP, I2S, portem kart SD/MMC, a także do
transferów pamięć-pamięć,
•
interfejsy szeregowe:
•
Ethernet MAC z kontrolerem DMA, na oddzielnej magistrali AHB,
•
kontroler USB 2.0 z kontrolerem DMA,
•
cztery UART-y, jeden z liniami modemowymi, jeden ze wsparciem
IrDA, wszystkie z kolejką FIFO; podłączone do magistrali APB,
•
•
kontroler SPI (APB),
•
dwa, wieloprotokołowe kontrolery SSP (APB),
•
trzy interfejsy I2C (APB),
•
interfejs I2S, dla zastosowań audio (APB),
•
dwa kanały CAN (APB),
inne peryferia, rezydujące na magistrali APB:
•
interfejs kart SD/MMC,
19
•
•
do 70 wejść/wyjść ogólnego przeznaczenia,
•
10-bitowe przetworniki A/C i C/A,
•
cztery liczniki ogólnego przeznaczenia,
•
jeden generator PWM, mogący pracować w trybie zwykłego licznika,
•
zegar czasu rzeczywistego RTC,
•
układ Watchdog,
zasilanie pojedynczym napięciem 3,3 wolta (3,0 do 3,6 V).
Charakterystyka procesora ARM7TDMI-S. Architektura RISC6
ARM7TDMI-S jest 32-bitowym mikroprocesorem ogólnego przeznaczenia,
zbudowanym na architekturze ARM. Jest zatem procesorem RISC-owym (Reduced
Instruction Set Computer), a więc operuje na zdecydowanie prostszych rozkazach, niż
procesory CISC-owe (Complex Instruction Set Computer). Zastosowanie architektury
RISC daje możliwość stosowania znacznie prostszego dekodera rozkazów. W
procesorach tego typu, wszystkie operacje są wykonywane na rejestrach, a nie
bezpośrednio na pamięci. Aby móc wykonać operację na danych znajdujących się w
pamięci, należy zrobić trzy rzeczy:
•
załadować daną z pamięci do rejestru,
•
wykonać operację na rejestrze,
•
zapisać daną z powrotem do pamięci.
Procesory z architekturą RISC oferują znacznie więcej rejestrów, które są rejestrami
ogólnego przeznaczenia. Zastosowano w nich również przetwarzanie potokowe, dzięki
czemu większość instrukcji wykonuje się w jednym cyklu zegara.
Jak zostało powiedziane, ARM7TDMI-S jest procesorem 32-bitowym, a więc
posiada 32-bitowe rejestry. Jest to 31 rejestrów ogólnego przeznaczenia, z których jeden
(R15) jest licznikiem rozkazów. Procesor potrafi zaadresować 4 GB pamięci i
przetwarza instrukcje w trójpoziomowym potoku. Gdy potok zostanie zapełniony, rdzeń
6 Na podstawie: Lucjan Bryndza: LPC2000. Mikrokontrolery z rdzeniem ARM7. Warszawa, BTC 2007
20
wykonuje efektywnie trzy rozkazy jednocześnie, znajdujące się w różnych fazach. W
tym samym czasie, jeden rozkaz jest wykonywany, drugi dekodowany, a trzeci
pobierany z pamięci, co ilustruje rysunek 11.
Instrukcja
ADDS
R0,R4,R8
Pobranie
ADCS
R1,R5,R9
ADCS
R2,R6,R10
ADCS
R3,R7,R11
ORR
R0,R0,#3
ORR
R2,R2,#3
ADDS
R0,R4,R8
ADCS
R1,R5,R9
ADCS
R2,R6,R10
ADCS
R3,R7,R11
ORR
R0,R0,#3
ADDS
R0,R4,R8
ADCS
R1,R5,R9
ADCS
R2,R6,R10
ADCS
R3,R7,R11
ADDS
R0,R4,R8
ADCS
R1,R5,R9
ADCS
R2,R6,R10
Dekodowanie
Wykonanie
Rys.11 Sposób wykonywania instrukcji przez rdzeń ARM7TDMI-S7
Przetwarzanie potokowe zapewnia możliwość wykonywania większości instrukcji w
jednym cyklu zegara. Tak efektywne działanie jest możliwe, gdy w programie nie
występują rozgałęzienia. Jeśli takie się pojawi, potok jest czyszczony i zapełniany
nowym instrukcjami, co zajmuje dodatkowy czas.
ARM7TDMI-S, może być skonfigurowany tak, aby zapisywał dane w formacie
little-endian lub big-endian. W mikrokontrolerach LPC2300, rdzeń jest na stałe
ustawiony przez producenta w tryb little-endian i nie ma możliwości zmiany.
W mikrokontrolerach LPC2300 zastosowano dodatkowy kontroler pamięci MAM
(Memory
Acceleration
Module),
który
przyspiesza
wykonywanie
programu
znajdującego się w pamięci Flash. Jego działanie polega na wykorzystaniu 128-bitowej
organizacji pamięci i pozwala, podczas jednego cyklu dostępu, pobrać 4 rozkazy naraz.
Rdzeń ARM7TDMI-S może wykonywać dwa podzbiory rozkazów:
•
32-bitowe instrukcje ARM,
•
16-bitowe instrukcje THUMB.
16-bitowe instrukcje zajmują w pamięci o połowę mniej miejsca, jednak spowalniają
operowanie na 32-bitowych liczbach. 32-bitowy kod zapewnia większą szybkość
podczas pracy z 32-bitowymi liczbami oraz lepsze zarządzanie dużymi obszarami
pamięci.
7 Źródło: Lucjan Bryndza: LPC2000. Mikrokontrolery z rdzeniem ARM7. Warszawa, BTC 2007
21
Krótka charakterystyka mikrokontrolera LPC23688
Rdzeń ARM7TDMI-S korzysta z lokalnej magistrali, która zapewnia najszybszą
komunikację z pamięcią Flash, SRAM, portami ogólnego przeznaczenia oraz dwiema
magistralami AHB. Te dają dostęp do interfejsu Ethernet, USB, wektoryzowanego
kontrolera przerwań, kontrolera DMA, a także magistrali APB. Do APB są podłączone
pozostałe urządzenia peryferyjne mikrokontrolera.
Urządzenia AHB zajmują 2-megabajtowy obszar pamięci, znajdujący się na samej
górze 4-gigabajtowej przestrzeni adresowej. Wolniejsze peryferia, podpięte do
magistrali APB, są ulokowane w 2-megabajtowym rejonie pamięci, zaczynającym się
od adresu 3,5 GB.
System przerwań w ARM7TDMI-S9
Rdzeń ARM7TDMI-S posiada dwa wejścia przerwań zewnętrznych: FIQ oraz
IRQ. FIQ jest przerwaniem szybkim, o najkrótszym czasie reakcji i najwyższym
priorytecie.
Rdzeń posiada wektoryzowany kontroler przerwań (VIC), dzięki któremu można
podłączyć do 32 przerwań zewnętrznych do dwóch wejść procesora. VIC umożliwia
skonfigurowanie każdej z 32 linii tak, aby generowane na niej przerwanie było typu FIQ
bądź IRQ. Ze względu na swój charakter, do linii FIQ powinno być podłączone co
najwyżej jedno przerwanie. To oznacza, że cała reszta musi być przerwaniami typu
IRQ. Każdemu z przerwań IRQ, w wektoryzowanym kontrolerze przerwań, można
oddzielnie ustawić priorytet. VIC posiada 32 sloty, każdy przyporządkowany jednemu
urządzeniu, mogącemu generować przerwanie (SPI, I2S, TIMER0 itd.). Każdy slot ma
przyporządkowany rejestr, do którego wpisuje się adres procedury obsługi przerwania
oraz
rejestr,
w
którym
ustala
się
jego
priorytet.
Są
to
odpowiednio:
VICVectAddr0...VICVectAddr31 oraz VICVectPriority0...VICVectPriority31.
8 Na podstawie: LPC23XX User's manual. Rev. 02 - NXP B.V., 2009
9 Na podstawie: LPC23XX User's manual. Rev. 02 - NXP B.V., 2009
22
Rys.12 Schemat blokowy mikrokontrolera LPC236810
Minimoduł MMlpc236x
Minimoduł firmy Propox znacząco ułatwia pracę z mikrokontrolerem LPC2368,
który jest dostarczany w małej obudowie TQFP100, z gęstym układem wyprowadzeń,
co utrudnia stosowanie go w projektach amatorskich.
10 Źródło: LPC23XX User's manual. Rev. 02 - NXP B.V., 2009
23
Rys.13 Minimoduł MMlpc236x oraz opis jego wyprowadzeń
Minimoduł, to płytka o wymiarach 36x56 mm, na której sygnały z
mikrokontrolera są wyprowadzone za pomocą dwurzędowych łącz szpilkowych, o
typowym rastrze 0,1' (2,54 mm). Posiada również złącze RJ45 dla modułu Ethernet
PHY 10/100 Mb, a także 12-megahercowy kwarc. Jest w zasadzie kompletną płytą
główną dla mikrokontrolera LPC2368, do której wystarczy podłączyć napięcie zasilania
24
i urządzenie jest gotowe do pracy.
3.1.2 Przetwornik AD187111
AD1871, to przetwornik analogowo-cyfrowy stereo, przeznaczony do
zastosowań wymagających szybkiego konwertowania sygnałów analogowych na postać
cyfrową.
Składa
się
z
dwóch,
24-bitowych
kanałów
przetwarzających
z
programowalnym wzmocnieniem, modulatora sigma-delta oraz filtra decymującego.
Najważniejsze cechy przetwornika, to:
•
5-woltowy przetwornik A/C stereo typu sigma-delta, z interfejsem cyfrowym
tolerującym 3,3 V,
•
częstotliwość próbkowania do 96 kHz,
•
16-/20-/24-bitowa długość słowa,
•
szeregowe porty danych:
•
Right-Justified, Left-Justified, I2S i tryby DSP,
•
połączenie kaskadowe (do 4 urządzeń na jednym porcie DSP),
•
kontrola poprzez port SPI bądź piny konfiguracyjne,
•
obudowa SSOP z 28 wyprowadzeniami.
11 Na podstawie: AD1871 User's manual. Rev. 0 - Analog Devices, Inc., 2002
25
Rys.14 Schemat blokowy przetwornika AD187112
Zastosowany
modulator
sigma-delta,
zapewnia
optymalną
wydajność
dla
standardowych częstotliwości próbkowania audio, z zakresu od 32 do 96 kHz.
Dolnoprzepustowy filtr decymujący posiada bardzo dobre tłumienie w zakresie pasma
zaporowego.
Rys.15 Moduł z przetwornikiem AD1871
12 Źródło: AD1871 User's manual. Rev. 0 - Analog Devices, Inc., 2002
26
Przetwornik AD1871 został osadzony na zaprojektowanym, dla potrzeb pracy
inżynierskiej, obwodzie drukowanym, na którym znajdują się wszystkie potrzebne do
działania elementy, jak dławiki i kondensatory, a także generator kwarcowy o
częstotliwości 24,576 MHz. Sygnały pochodzące z układu scalonego zostały
wyprowadzone na dwóch, jednorzędowych łączach szpilkowych z rastrem 2,54 mm.
Powstały w ten sposób moduł (rys.15) jest osadzony na płycie głównej.
3.1.3 Przetwornik AD765213
AD7652, to przetwornik analogowo-cyfrowy typu SAR. Najważniejsze cechy
przetwornika:
•
przepustowość: 500 kSPS,
•
16-bitowa rozdzielczość,
•
zakres napięć dla wejścia analogowego: 0 V to 2.5 V,
•
równoległy i szeregowy interfejs 5 V/3 V,
•
kompatybilny z SPIR/QSPI/MICROWIRE/DSP,
•
pojedyncze zasilanie 5 V,
•
rozpraszanie mocy:
•
•
65 mW (typowo), 130 μW @ 1 kSPS bez REF,
•
80 mW (typowo) z REF,
obudowy LQFP i LFCSP z 48 wyprowadzeniami.
13 Na podstawie: AD7652 User's manual. Rev. 0 - Analog Devices, Inc., 2003
27
Rys.16 Schemat blokowy przetwornika AD765214
Przetwornik zawiera logikę sterującą procesem przetwarzania, przetwornik C/A,
wewnętrzny zegar, napięcie referencyjne, obwód korekcji błędów, oraz system
szeregowych i równoległych portów.
Rys.17 Moduł z przetwornikiem AD7652
14 Źródło: AD7652 User's manual. Rev. 0 - Analog Devices, Inc., 2003
28
Dla przetwornika AD7652 (podobnie, jak dla AD1871) również został
zaprojektowany
obwód
drukowany,
zawierający
potrzebne
elementy
oraz
wyprowadzenia sygnałów, zrealizowane przy użyciu czterech pojedynczych łączy
szpilkowych (raster 2,54 mm).
3.1.4 Układ FT2232H (minimoduł MMusbX232H)15
MMusbX232H, to minimoduł firmy Propox, przeznaczony do transmisji danych
przez interfejs USB 2.0, z maksymalną szybkością 480 Mbit/s. Bazuje na układzie
FT2232H lub FT4232H. W pracy inżynierskiej został użyty moduł oparty o FT2232H,
który posiada dwa synchroniczne silniki MPSSE (Multi-protocol Synchronous Serial
Engine), pozwalające na komunikację poprzez interfejsy JTAG, I2C, SPI oraz UART,
na dwóch kanałach jednocześnie.
Minimoduł jest wyposażony w dodatkową pamięć EEPROM 93LC46,
pozwalającą na zewnętrzną konfigurację układu FT2232H. Zasilanie może być
pobieranie bezpośrednio z portu USB lub z dodatkowego stabilizatora.
Rys.18 Minimoduł MMusbX232H
15 Na podstawie: http://www.sklep.propox.com/index.php?d=produkt&id=2751
29
Wyprowadzenia
sygnałów
są
zrealizowane
za
pomocą
pojedynczych
łączy
szpilkowych, o rastrze 2,54 mm.
3.1.5 Wzmacniacz operacyjny OP27516
OP275 jest niskoszumowym wzmacniaczem operacyjnym, zbudowanym w
oparciu o technologię łączącą oba rodzaje tranzystorów – bipolarne oraz JFET. Tak
powstały wzmacniacz zapewnia precyzję oraz niskie szumy, typowe dla tranzystora
bipolarnego, oraz szybkość i jakość dźwięku tranzystora JFET. Najważniejsze cechy
OP275:
 Hz ,
•
niskie szumy: 6 nV /
•
małe zniekształcenia: 0,0006 %,
•
duże slew-rate: 22 V / us,
•
szerokie pasmo: 9 MHz,
•
mały prąd zasilania: 5 mA,
•
obudowy SOIC i PDIP z 8 wyprowadzeniami.
Rys.19 Wyprowadzenia wzmacniacza operacyjnego OP27517
W oparciu o układ wzmacniacza operacyjnego OP275, został zaprojektowany
przedwzmacniacz mikrofonowy, którego sygnał wyjściowy może być podawany na
wejścia przetworników analogowo-cyfrowych.
16 Na podstawie: OP275 User's manual. Rev. C - Analog Devices, Inc., 2004
17 Źródło: OP275 User's manual. Rev. C - Analog Devices, Inc., 2004
30
Rys.20 Przedwzmacniacz mikrofonowy, oparty o układ OP275
Moduł z przedwzmacniaczem został wyposażony w łącza szpilkowe. Dokładny opis
przedwzmacniacza znajduje się w podrozdziale 3.4.
3.2 Zasilanie układu
Zasilanie układu (modułów) stanowią trzy stabilizatory, dostarczające trzy
rodzaje napięć:
•
3,3 wolta, do zasilania modułu z mikrokontrolerem oraz interfejsów danych
przetworników; za napięcie odpowiada układ scalony LM1117,
•
5
woltów,
dla
zasilania
części
analogowej
przetworników
oraz
przedwzmacniacza mikrofonowego; LM7805,
•
5 woltów, do zasilania części cyfrowej przetworników; LM7805.
Każdy ze stabilizatorów jest wspomagany przez dwa kondensatory filtrujące, o
wartościach 10 i 100 mikrofaradów. Ponadto, pomiędzy stabilizatorami, a gniazdem dla
zasilacza sieciowego, zastosowane zostały diody prostownicze oraz bezpiecznik.
Stany wysokie oraz niskie do sterowania przetwornikami pobierane są z: 5 woltów
31
cyfrowego zasilania oraz masy.
Rys.21 Układ zasilania modułów
3.3 Połączenia modułów
W tym podrozdziale są przedstawione schematy połączeń poszczególnych
modułów. Dla przejrzystości rysunków, pominięto wyprowadzenia niezwiązane
bezpośrednio
z
łącznością
między
układami,
jak
zasilania,
wyprowadzenia
konfiguracyjne itp.
3.3.1 MMlpc236x z AD1871 oraz AD7652
Przetwornik AD7652 komunikuje się z mikrokontrolerem LPC2368 za pomocą
interfejsu SPI, z którego są wykorzystane dwa wyprowadzenia: MISO oraz SCK. MISO
stanowi wejście danych układu nadrzędnego (master), jakim jest interfejs SPI
mikrokontrolera/ SCK, to sygnał zegara. Wejście #CNVST służy do inicjalizacji
konwersji analogowo-cyfrowej, poprzez ustawienie go w stan niski. Do tego została
wykorzystana linia P0.16 mikrokontrolera, która jest ustawiona w tryb wyjścia
ogólnego przeznaczenia. Wyjście BUSY przetwornika informuje mikrokontroler, że
konwersja wciąż trwa i nie można jeszcze odbierać danych. Jest podłączone do wejścia
P2.8.
32
Rys.22 Sposób połączenia mikrokontrolera z przetwornikami A/C
Przetwornik AD1871 wykorzystuje dwa interfejsy mikrokontrolera:
•
SSP0 (linie SCK0, MOSI0), do konfiguracji przetwornika poprzez jego trzy
specjalne rejestry,
•
I2S (linie I2SRX_SDA, I2SRX_CLK, I2SRX_WS), do przesyłania rezultatów
przetwarzania analogowo-cyfrowego.
Konfiguracja przetwornika odbywa się poprzez zapis jego trzech rejestrów
konfiguracyjnych, realizowany z wykorzystaniem wejść CCLK oraz CIN. Dane są
przesyłane magistralą SSP0, ustawioną w tryb SPI. Linia P1.21 mikrokontrolera jest
ustawiona w tryb wyjścia ogólnego przeznaczenia i łączy się z wejściem CLATCH
przetwornika, na który, przed zapisem rejestrów konfiguracyjnych, musi zostać podany
stan niski. Później linia jest ustawiana w stan wysoki.
AD1871 wysyła rezultaty konwersji analogowo-cyfrowej przez interfejs I2S, który tym
razem jest ustawiony w tryb slave, natomiast przetwornik – master. Odbywa się to z
wykorzystaniem trzech linii magistrali:
•
I2SRX_SDA, linia danych,
33
•
I2SRX_CLK, linia zegarowa,
•
I2SRX_WS, linia wyboru słowa.
Wszystkim zarządza przetwornik, dostarczając sygnał zegarowy oraz odpowiednie
poziomy na linii wyboru słowa (kanał lewy lub prawy).
Jak widać na schemacie, do przetwornika AD1871 jest dołączony generator
kwarcowy o częstotliwości 24,576 MHz. Dostarcza on sygnał zegarowy potrzebny do
prawidłowego działania modulatora sigma-delta.
3.3.2 MMlpc236x z MMusbX232H
Minimoduł MMusbX232H służy do komunikacji mikrokontrolera LPC2368 z
komputerem PC. Zapewnia możliwość zapisu programu sterującego do pamięci Flash
mikrokontrolera oraz przesyłu danych do komputera.
Rys.23 Sposób połączenia mikrokontrolera z modułem MMusbX232H
Linie AD0-AD4 są wykorzystywane do programowania mikrokontrolera,
natomiast BD0-BD1 – do odbioru danych z mikrokontrolera, które są następnie
wysyłane do komputera PC. W obu przypadkach są wykorzystane interfejsy UART (0 i
3) LPC2368. Do programowania są wykorzystane dodatkowo dwie linie modemowe,
podłączone do wejść #RESET oraz P2.10 mikrokontrolera.
Dokładniejszy opis działania całego układu jest omówiony przy okazji
konfiguracji przetworników, mikrokontrolera oraz układu FT2232H (minimoduł
MMusbX232H), w podrozdziałach od 3.5 do 3.7.
34
3.4 Przedwzmacniacz mikrofonowy na układzie OP27518
Wzmacniacz jest zasilany pojedynczym napięciem. Kondensatory C5 i C6
stanowią filtr odsprzęgający zasilanie. Elementy C7 i C8 stanowią separację dla
składowej stałej, niezbędną przy zasilaniu pojedynczym napięciem. Rezystory R7 i R10
powodują, że w spoczynku, na wyjściach układu, napięcie stałe jest równe zeru
(potencjał masy). Ich wartości można zmieniać w szerokim zakresie.
Przy zasilaniu przedwzmacniacza pojedynczym napięciem, konieczne jest zastosowanie
rezystorów ustalających wartość spoczynkowego napięcia stałego na wyjściach.
Odpowiedzialne są za to elementy R3 (potencjometr) i R6. Ustalone na wyjściach
napięcie stałe, to około 2,5 wolta, a więc połowa napięcia zasilającego. Zapewnia to
odpowiedni zakres niezniekształconych, zmiennych napięć wyjściowych (rysunek 24).
Rys.24 Przebiegi napięć na wyjściu
Wzmocnienie układu ustala się za pomocą rezystorów R1, R2 oraz R4, R5. Dla wyjścia
odwracającego (wyprowadzenie 2 na JP2), jest to stosunek R1/R2, natomiast dla
wyjścia nieodwracającego (wyprowadzenie 3 na JP2) – R4/R5. Jak widać na rysunku
19, układ scalony OP275 zawiera w sobie dwa wzmacniacze operacyjne. Sygnał z
mikrofonu jest podawany na wejście odwracające pierwszego (-IN_A). Z jego wyjścia
(OUT_A) idzie na łączówkę JP2 oraz wejście drugiego wzmacniacza (-IN_B), również
odwracające. To powoduje, że na wyjściu OUT_B (wyprowadzonym na łączówkę JP2)
jest otrzymywany sygnał nieodwrócony. Jego wzmocnienie jest równe iloczynowi
18 Na podstawie: Piotr Górecki, Zbigniew Orłowski: Niskoszumny przedwzmacniacz mikrofonowy.
Elektronika dla wszystkich 10/96
Stanisław Kuta: Elementy i układy elektroniczne. Część I. Kraków, Wydawnictwa
AGH 2000
35
wzmocnień poszczególnych stopni (A i B). W tym przypadku wynosi ono 20 (2 * 10).
Kondensator C9 separuje wejście analogowe przetwornika AD7652 od reszty układu.
Na wejściu AD7652, za pomocą dzielnika, jest na stałe ustawione napięcie 1,25 wolta,
odpowiadające połowie jego napięcia referencyjnego. Kondensatory C1 i C4 filtrują
niepożądane w układzie sygnały w.cz.
Ponieważ wyjścia obu wzmacniaczy (OUT_A, OUT_B) zostały wyprowadzone
na łączówkę JP2, układ oferuje dwie wartości wzmocnień: dwukrotne oraz
dwudziestokrotne.
Rys.25 Schemat przedwzmacniacza mikrofonowego
Wyprowadzenia JP1-2 oraz JP2-1 są przeznaczone dla zastosowanych w tej
pracy inżynierskiej przetworników A/C. Nie oferują żadnego wzmocnienia, ponieważ
oba układy mają wystarczająco czułe wejścia, przez co zastosowanie wzmacniacza
może powodować przesterowanie.
36
3.5 Konfiguracja mikrokontrolera LPC2368 (wraz z
minimodułem)19
Konfiguracja minimodułu MMlpc236x sprowadza się do podłączenia zasilania
3,3 wolta do wyprowadzenia 1 na łączówce JP2 oraz przynajmniej jednej masy. Aby
móc programować układ oraz przesyłać dane z mikrokontrolera do komputera PC,
należy wykonać połączenia wg schematu z rysunku 23. Po wykonaniu tych czynności,
można przejść do wgrania odpowiedniego programu do pamięci Flash mikrokontrolera.
Program został napisany w środowisku Keil uVision4 i przesłany do pamięci za pomocą
aplikacji Flash Magic. W dalszych podrozdziałach jest dokładnie omówiony proces
tworzenia programu sterującego dla mikrokontrolera oraz sposób programowania
pamięci Flash.
3.5.1 Środowisko programistyczne Keil uVision4 oraz program Flash
Magic
Do stworzenia programu sterującego mikrokontrolerem LPC2368 zostało użyte
środowisko Keil uVision4 w wersji darmowej, co oznacza ograniczenie wielkości kodu
do 32 kilobajtów. Na potrzeby niniejszej pracy inżynierskiej jest to wystarczająca
wielkość. Aby rozpocząć pisanie programu, należy stworzyć nowy projekt (Project ->
New uVision Project). Po zapisaniu go pod odpowiednią nazwą, przechodzi się do okna
wyboru CPU. W tym przypadku jest to LPC2368 firmy NXP, po wybraniu którego
program pyta, czy ma dodać plik startowy do projektu. Po wybraniu Tak plik startowy
zostanie wygenerowany automatycznie.
19 Na podstawie: LPC23XX User's manual. Rev. 02 - NXP B.V., 2009
37
Rys.26 Interfejs programu Keil uVision4
Po lewej stronie są wyświetlone wszystkie pliki użyte w projekcie, w tym
wygenerowany automatycznie plik startowy (LPC2300.s). Keil uVision oferuje dwie
możliwości jego edycji. Ręczną, poprzez modyfikowanie kodu w assemblerze, bądź
przy użyciu wygodnego edytora (rysunek 27). Oprócz pliku startowego, należy się
również zaopatrzyć w plik nagłówkowy (lpc23xx.h). Można go pobrać ze strony
http://www.keil.com. Po wykonaniu tych czynności, można przystąpić do pisania
właściwego programu w języku C++. Odbywa się to na podobnych zasadach, jak w
innych środowiskach programistycznych, a więc dodawaniu kolejnych plików z kodem
źródłowym oraz plików nagłówkowych.
Po napisaniu programu trzeba stworzyć plik HEX, który zostanie przesłany do
pamięci Flash mikrokontrolera. W tym celu, należy kliknąć ikonę zaznaczoną
czerwonym kółkiem na rysunku 26. Następnie, w zakładce Output, trzeba wybrać
Create HEX File. Kolejnym krokiem jest wejście w menu Project i wybranie opcji
Build target. W katalogu z projektem zostanie utworzony plik HEX.
38
Rys.27 Edytor pliku startowego
Program Flash Magic
Gotowym plikiem HEX należy zaprogramować pamięć Flash mikrokontrolera.
W tym celu, można się posłużyć programem Flash Magic.
Należy wybrać właściwy rodzaj mikrokontrolera oraz port COM, który jest w tym
przypadku jednym z wirtualnych portów, zainstalowanych po podłączeniu minimodułu
MMusbX232H. Następnie, należy ustawić Baud Rate, rodzaj interfejsu oraz szybkość
pracy oscylatora, którym jest napędzany mikrokontroler. Na module MMlpc236x jest
zamontowany 12-megahercowy kwarc. Po zaznaczeniu opcji wymazywania pamięci i
wskazaniu odpowiedniego pliku HEX, można rozpocząć zapisywanie pamięci Flash
(naciśnięcie przycisku Start). Po zakończeniu operacji, mikrokontroler powinien
rozpocząć wykonywanie nowo wgranego programu.
39
Rys.28 Flash Magic
3.5.2 Konfiguracja rdzenia oraz peryferiów
Sekwencja inicjująca mikrokontroler jest zawarta w pliku startowym
LPC2300.s. Są tam zdefiniowane wielkości stosów dla poszczególnych trybów ochrony,
ustawienia pętli PLL, dzielniki dla taktowania procesora i peryferiów, oraz wiele innych
rzeczy. W tym podrozdziale jest dokładnie omówiona procedura konfiguracji
mikrokontrolera, od rdzenia, po wykorzystane urządzenia peryferyjne.
Pętla PLL oraz sygnały zegarowe
Pętla PLL zwielokrotnia częstotliwość pochodzącą z rezonatora kwarcowego,
pozwalając uzyskać stabilny sygnał zegarowy.
Sygnał pochodzący z rezonatora (1 do 24 Mhz) jest podawany na pętlę fazową PLL,
skąd, po powieleniu, stanowi zewnętrzny sygnał zegarowy. Sygnał ten, po zastosowaniu
odpowiednich podzielników, taktuje rdzeń mikrokontrolera, magistrale AHB oraz APB,
40
a co za tym idzie, wszystkie podłączone do nich urządzenia.
Konfiguracja pętli z użyciem edytora programu Keil uVision4 (rysunek 27), sprowadza
się do:
•
wybrania zakresu głównego oscylatora (rejestr SCS),
•
włączenia bądź wyłączenia oscylatora (SCS),
•
wybrania źródła sygnału dla pętli PLL (CLKSRCSEL),
•
ustawienia parametrów mnożnika MSEL i dzielnika NSEL (PLLCFG),
•
wybrania
podzielników
(USBCLKCFG)
oraz
dla
urządzeń
taktowania
CPU
peryferyjnych
(CCLKCFG),
(rejestry
USB
PCLKSEL0
i
PCLKSEL1).
Główny oscylator, to zewnętrzny rezonator kwarcowy. Zamiast nim, pętla PLL może
być taktowana wewnętrznym oscylatorem RC lub oscylatorem RTC. W przypadku
minimodułu MMlpc236x, do mikrokontrolera jest podłączony zewnętrzny rezonator 12
MHz.
Wartości MSEL (M) oraz NSEL (N) wybiera się wg następujących zależności:
•
FCCO = (2 × M × FIN) / N, gdzie:
FIN – częstotliwość źródłowa pętli PLL (pochodząca z rezonatora 12 MHz),
FCCO – sygnał wyjściowy z pętli PLL, służący do taktowania mikrokontrolera;
musi zawierać się w przedziale 275 do 550 MHz.
•
M = (FCCO × N) / (2 × FIN)
•
N = (2 × M × FIN) / FCCO
•
FIN = (FCCO × N) / (2 × M)
Częstotliwość wyjściowa pętli PLL (FCCO) musi zostać tak dobrana, aby można było z
niej uzyskać zegary taktujące rdzeń mikrokontrolera (CCLK) oraz interfejs USB (o ile
jest używany). Zegar dla rdzenia jest ustalany wg potrzeb, natomiast USB musi być
taktowane częstotliwością 48 MHz. Ponieważ w pracy inżynierskiej jest wymagane
taktowanie rdzenia na poziomie 72 MHz, częstotliwość FCCO powinna wynosić np. 288
MHz. To pozwoli, przy użyciu dostępnych dzielników, uzyskać obie wartości zegarów:
41
48 oraz 72 MHz.
Dzielnik dla rdzenia (CCLKSEL w rejestrze CCLKCFG) wynosi zatem 4, natomiast
dzielnik dla USB (USBSEL w rejestrze USBCLKCFG) – 6.
Pozostaje jeszcze dobranie podzielników dla urządzeń peryferyjnych (rejestry
PCLKSEL0 oraz PCLKSEL1). Podzielniki te ustala się zgodnie z zależnością:
PCLK = CCLK / x, gdzie:
•
PCLK – taktowanie urządzenia peryferyjnego,
•
CCLK – taktowanie rdzenia mikrokontrolera (72 MHz),
•
x – wartość podzielnika (1, 2, 4 lub 8).
Dla celów pracy inżynierskiej muszą zostać ustalone częstotliwości taktowania dla
następujących urządzeń peryferyjnych:
•
SPI: x = 1,
•
SSP0: x = 1,
•
UART3: x = 1,
•
I2S: x = 1
•
TIMER0: x = 4.
Zasilanie urządzeń peryferyjnych
Rejestr PCONP pozwala na włączenie lub wyłączenie poszczególnych
peryferiów (rysunek 29).
Zostało włączone zasilanie dla I2S, UART3, SSP0, SPI, TIMER0 oraz GP DMA.
42
Rys.29 Rejestr PCONP w edytorze pliku startowego
Konfiguracja kontrolera pamięci MAM
Kontroler MAM umożliwia pracę pamięci Flash z pełną szybkością rdzenia
mikrokontrolera. Jego konfiguracja sprowadza się do wybrania trybu pracy (w pełni
włączony, częściowo włączony, wyłączony) oraz określenia liczby cykli zegarowych
procesora, w oczekiwaniu na dostęp do pamięci Flash. Dokumentacja określa liczbę
cykli, w zależności od szybkości działania CPU:
43
Tabela 1.
Zegar CPU
Liczba cykli zegarowych
< 20 MHz
1 CCLK
20 – 40 MHz
2 CCLK
40 – 60 MHz
3 CCLK
> 60 MHz
4 CCLK
W pracy inżynierskiej kontroler MAM jest w pełni załączony, natomiast liczba cykli
zegarowych wynosi 4 (taktowanie rdzenia, to 72 MHz).
Wielkości stosów dla poszczególnych trybów ochrony
Na rysunku 27 widać, że edytor daje możliwość modyfikowania wielkości
stosów. Nieużywanym trybom ochrony zostały przyporządkowane stosy o wielkości 8
bajtów. Dla używanych w programie, a więc Supervisor Mode, Interrupt Mode oraz
User Mode, zostały ustalone wartości odpowiednio: 64, 256, 1024 bajty.
Zewnętrzny kontroler pamięci (EMC)
EMC
jest
wykorzystywany
do
podłączenia
dodatkowej
pamięci
do
mikrokontrolera. Jeśli taka nie jest używana, EMC powinien być wyłączony, gdyż
mógłby powodować niewłaściwe działanie programu.
Konfigurowanie pliku startowego można uznać za zakończone. Resztę
zawartych w nim ustawień zaleca się zostawić na domyślnym poziomie. Teraz opisany
zostanie program sterujący, w którym jest zawarta również szczegółowa konfiguracja
użytych urządzeń peryferyjnych.
3.5.3 Program sterujący
Program sterujący realizuje opisany na początku rozdziału 3. algorytm działania.
44
Jest w nim również kod odpowiedzialny za szczegółową konfigurację urządzeń
peryferyjnych. W pliku startowym zostały one włączone oraz ustawiono dla nich
główne zegary taktujące.
Projekt składa się z następujących plików:
•
LPC2300.s
•
lpc23xx.h
•
adc_reader.c
Pierwszy z nich został już dokładnie omówiony, drugi, to plik nagłówkowy z
definicjami rejestrów mikrokontrolera. Jak zostało już powiedziane, można go pobrać
ze strony http://www.keil.com.
Właściwy kod programu jest zawarty w pliku adc_reader.c, który zostanie teraz
przedstawiony. Na początku znajdują się deklaracje funkcji obsługi przerwań, tablic do
przechowywania
rezultatów
konwersji
analogowo-cyfrowych
oraz
zmiennych
pomocniczych (listing 1).
Listing 1.
#include "LPC23xx.H"
/* definicje LPC23xx */
/* Deklaracja funkcji obsługi przerwania od odbiornika UART0 */
void UART3_RX_IRQ(void) __irq;
/* Deklaracja funkcji obsługi przerwania od licznika TIMER0 */
void TIMER0_IRQ(void) __irq;
/* Jednoelementowa tablica dla 16 bitów danych z portu SPI (SPI0) */
int dane_spi[1];
/* Dwuelementowa tablica dla 64 bitów danych z portu I2S */
long int dane_i2s[2];
int i;
45
Funkcja główna programu (main()) zawiera szczegółowe konfiguracje
wykorzystanych urządzeń peryferyjnych mikrokontrolera. Najpierw są ustawiane
odpowiednie funkcje dla wyprowadzeń układu (rysunek 13) oraz są konfigurowane
porty ogólnego przeznaczenia.
Listing 2.
/* Konfiguracja portów GPIO oraz wybór funkcji wyprowadzeń */
PINSEL0 = 0xC000150A;
PINSEL1 = 0x3C;
PINSEL3 = 0x3C300;
PINSEL4 = 0x00;
PINSEL9 = 0x00;
/* Port P0.16 jako wyjście */
IODIR0 = 0x10000;
/* Port P1.21 jako wyjście */
IODIR1 = 0x200000;
/* Port P2.8 jako wejście */
FIO2DIR = 0x00;
/* Pull-down resistor dla P2.8 włączony */
PINMODE4 = 0x30000;
/* Wszystkie piny na portach odblokowane */
FIO0MASK = 0x00; FIO1MASK = 0x00; FIO2MASK = 0x00; FIO3MASK = 0x00;
W rejestrach PINSEL są wybierane funkcje dla poszczególnych wyprowadzeń
mikrokontrolera, zgodnie z poniższą tabelą. Pogrubioną czcionką zaznaczono wybraną
funkcję.
46
Tabela 2.
Wyprowadzenie
Nr rejestru
PINSEL
Numery bitów
w rejestrze
Ustawienie
P0.0/RD1/TXD3/SDA1
0
1:0
10
P0.1/TD1/RXD3/SCL1
0
3:2
10
P1.20/PWM1.2/SCK0
3
9:8
11
P1.21/PWM1.3/SSEL0
3
11:10
00
P1.23/PWM1.4/MISO0
3
15:14
11
P1.24/PWM1.5/MOSI0
3
17:16
11
P0.15/TXD1/SCK0/SCK
0
31:30
11
P0.16/RXD1/SSEL0/SSEL
1
1:0
00
P0.17/CTS1/MISO0/MISO
1
3:2
11
P0.18/DCD1/MOSI0/MOSI
1
5:4
11
P2.8/TD2/TXD2/TRACEPKT3
4
17:16
00
P0.4/I2SRX_CLK/RD2/CAP2.0
0
9:8
01
P0.5/I2SRX_WS/TD2/CAP2.1
0
11:10
01
P0.6/I2SRX_SDA/SSEL1/MAT2.0
0
13:12
01
Aby dla wyprowadzenia P2.8/TD2/TXD2/TRACEPKT3 wybrać funkcję P2.8 (portu
wejścia/wyjścia ogólnego przeznaczenia - GPIO), należy w rejestrze PINSEL4, na
bitach 17:16, ustawić kombinację 00.
Dodatkowo, dla GPIO, należy wybrać, czy wyprowadzenie będzie wejściem czy
wyjściem. Odpowiadają za to rejestry IODIR0, IODIR1 oraz FIO2DIR. Każdemu
wyprowadzeniu odpowiada w nich dokładnie jeden bit, zatem ustawienie P2.8, jako
wejścia, to konieczność wyzerowania bitu numer 8 w rejestrze FIO2DIR. Wpisanie
jedynki, to ustawienie wyprowadzenia, jako wyjścia. Przy wyborze funkcji
alternatywnych (MISO, SCK itd.), nie ma takiej potrzeby.
Jeśli wyprowadzenie jest wejściem, można dla niego wybrać podciąganie rezystorem do
stanu wysokiego, niskiego, bądź wyłączyć podciągnie. Odpowiadają za to rejestry
PINMODE, w których każdemu wyprowadzeniu odpowiadają po dwa bity. W pracy
inżynierskiej P2.8 ma włączony rezystor podciągający do stanu niskiego.
Rejestry FIOxMASK służą do blokowania (ustawienie na odpowiednim bicie jedynki)
portów ogólnego przeznaczenia, co oznacza, iż nie można zmieniać, ani odczytywać ich
47
stanów.
Kolejnym
punktem
programu
jest
konfiguracja
systemu
przerwań.
Wykorzystywane są dwa przerwania: od odbioru danych interfejsu UART3 oraz od
licznika TIMER0.
Listing 3.
/* Konfiguracja systemu przerwań */
/* Przerwania jako IRQ */
VICIntSelect = 0x0;
/* Adres procedury obsługi przerwania od odbiornika UART3 */
VICVectAddr29 = (unsigned int) UART3_RX_IRQ;
/* Najwyższy priorytet dla przerwania UART3_RX_IRQ */
VICVectCntl29 = 0x0;
/* Adres procedury obsługi przerwania od TIMER0 */
VICVectAddr4 = (unsigned int) TIMER0_IRQ;
/* Drugi priorytet dla przerwania TIMER0_IRQ */
VICVectCntl4 = 0x1;
/* Włączenie przerwań od UART3 oraz TIMER0 */
VICIntEnable = 0x20000010;
/* Wyłączenie pozostałych przerwań */
VICIntEnClr = 5FFF FFEF;
W pierwszej kolejności przerwania są ustawiane, jako wektoryzowane IRQ, co uzyskuje
się poprzez wyzerowanie, odpowiadającego danemu urządzeniu peryferyjnemu, bitu w
rejestrze VICIntSelect. Jedynka na nim, to przerwanie typu FIQ. Tabela 3 prezentuje
przyporządkowanie peryferiów do slotów w wektoryzowanym kontrolerze przerwań.
Oznacza to, że sterowanie danym przerwaniem odbywa się poprzez ustawienie bądź
wyzerowanie odpowiedniego bitu w wybranym rejestrze konfiguracyjnym. Numer bitu
odpowiada numerowi slotu.
Do rejestrów VICVectAddr(x) należy wpisać nazwy stworzonych funkcji, które
obsługują przerwanie, jeżeli to wystąpuje. Numer rejestru VICVectAddr(x) odpowiada
przyporządkowanemu danemu przerwaniu slotowi (tabela 3). Z VICVectAddr(x) są
48
powiązane rejestry VICVectCntl(x), w których ustawia się priorytet danego przerwania,
wpisując odpowiednie liczby (im niższa, tym wyższy priorytet). Dwa ostatnie rejestry
służą do odblokowania (lub zablokowania) przerwań w wektoryzowanym kontrolerze
przerwań. Odblokowanie odbywa się przez wpisanie jedynki na odpowiednim bicie w
rejestrze VICIntEnable. Ustawienie jedynki na bicie rejestru VICIntEnClr, blokuje
odpowiadające mu przerwanie.
Tabela 3.20
Następnym krokiem jest konfiguracja interfejsu UART3. Służy on do kontroli
układu z poziomu aplikacji Windows oraz przesyłania danych (wyników konwersji
analogowo-cyfrowych) do komputera PC.
Listing 4.
/* Konfiguracja UART3 */
/* Dostęp do podzielników częstotliwości dla Baudrate */
U3LCR = 0x80;
/* Ustawienie Baudrate = 4 500 000 = 72 MHz / 16 */
/* DLL = 1 */
U3DLL = 0x01;
/* DLM = 0 */
U3DLM = 0x00;
/* MulVal = 1, DivAddVal = 0 */
U3FDR = 0x10;
/* 8-bitowa długość znaku, 1 bit stopu, brak bitu parzystości */
20 Źródło: LPC23XX User's manual. Rev. 02 - NXP B.V., 2009
49
U3LCR = 0x03;
/* Przerwanie od odebrania danych włączone */
U3IER = 0x01;
/* Bufor FIFO włączony, generowanie przerwania po odbiorze jednego znaku */
U3FCR = 0x01;
Najpierw jest ustawiana prędkość transmisji (Baudrate). W tym celu, w rejestrze
U3CLR należy wpisać heksadecymalną wartość 0x80. To odblokuje dostęp do rejestrów
U3DLL oraz U3DLM, które odpowiadają za szybkość transmisji. Ponieważ uzyskanie
odpowiedniej prędkości tylko za ich pomocą, wymagałoby stosowania rezonatorów
kwarcowych o wartościach dzielących się bez reszty przez tę właśnie prędkość (np.
11,0592 MHz), w mikrokontrolerach LPC2300 jest zastosowany dodatkowy rejestr
U3FDR. Pozwala on uzyskać dowolną prędkość transmisji z dowolnego rezonatora
kwarcowego. Parametry DLL, DLM, MulVal oraz DivAddVal (dwa ostatnie znajdujące
się w dodatkowym rejestrze U3FDR), wyznacza się z następującej zależności:
Po ustawieniu baudrate, w rejestrze U3LCR są konfigurowane pozostałe parametry
transmisji, takie jak długość przesyłanego słowa, liczba bitów stopu oraz bit parzystości.
W omawianym projekcie, jest to 8-bitowa długość słowa, jeden bit stopu oraz brak bitu
parzystości.
W rejestrze U3IER jest włączane generowanie przerwania od odbioru danych interfejsu
UART3. W U3FCR jest włączany bufor FIFO oraz jest ustawiana liczba znaków, po
odbiorze których generowane będzie przerwanie. Tutaj jest to jeden znak.
Poniżej omówiono konfigurację interfejsu SPI, który posłuży do komunikacji z
przetwornikiem AD7652.
50
Listing 5.
/* Konfiguracja SPI do komunikacji z AD7652 */
/* Przesyłane 16 bitów, CPHA = 1, CPOL = 0, Master mode */
S0SPCR = 0x2C;
/* Prędkość interfejsu SPI; PCLK / 0x08 = 72 MHz / 8 = 9 MHz */
S0SPCCR = 0x8;
W rejestrze S0SPCR są ustawiane parametry takie, jak liczba przesyłanych bitów, faza
próbkowania danych (CPHA), polaryzacja sygnału zegarowego (CPOL) oraz tryb pracy
SPI. Jest zatem przesyłanych 16 bitów, natomiast interfejs pracuje w trybie master.
Polaryzacja sygnału zegarowego jest dodatnia (CPOL = 0), a dane próbkowane są na
zboczu narastającym (CPHA = 1).
W rejestrze S0SPCCR jest ustawiany podzielnik dla szybkości pracy interfejsu SPI, wg
zależności:
Prędkość SPI = PCLK / S0SPCCR
Prędkość pracy SPI wynosi zatem 9 MHz.
Następnie jest ustawiony kontroler SSP0, który posłuży do programowania
rejestrów konfiguracyjnych przetwornika AD1871.
Listing 6.
/* Konfiguracja SSP0 jako SPI do kontroli AD1871 */
/* SSP0 jako SPI, 16-bitowy format, CPOL = 0, CPHA = 1, SCR = 0 */
SSP0CR0 = 0x8F;
/* PCLK / 32 = 2,25 MHz */
SSP0CPSR = 0x08;
/* SSP0 wyłączony, SSP0 jako master */
SSP0CR1 = 0x00;
/* SSP0 włączony */
SSP0CR1 = 0x02;
51
Konfiguracja SSP0 jest podobna do SPI. Dodatkowo trzeba określić, że SSP0 ma
działać, jako SPI, ponieważ jest on kompatybilny z kilkoma innymi standardami (SPI,
SSI, Microwire). Na końcu procedury konfiguracyjnej włącza się interfejs, za pomocą
rejestru SSP0CR1. Jednak to należy uczynić dopiero, gdy zostaną ustalone pozostałe
parametry pracy interfejsu.
Po skonfigurowaniu SSP0, jako SPI, następuje zapisanie trzech konfiguracyjnych
rejestrów przetwornika AD1871. Sprowadza się to do wysłania trzech, 16-bitowych
słów przez SSP0. Zostały one dokładniej omówione w podrozdziale 3.6.1, dotyczącym
konfiguracji przetwornika.
Listing 7.
/* Konfiguracja AD1871 */
/* stan niski na wejściu CLATCH AD1871 (P1.21 mikrokontrolera) */
IOCLR1 = 0x200000;
/* Pierwszy rejestr konfiguracyjny */
SSP0DR = 0x40;
/* Czekaj na koniec nadawania */
while(SSP0SR & 0x10);
/* Drugi rejestr konfiguracyjny */
SSP0DR = 0x1000;
/* Czekaj na koniec nadawania */
while(SSP0SR & 0x10);
/* Trzeci rejestr konfiguracyjny */
SSP0DR = 0x2030;
/* Czekaj na koniec nadawania */
while(SSP0SR & 0x10);
/* Stan wysoki na wejściu CLATCH AD1871 (P1.21 mikrokontrolera) */
IOSET1 = 0x200000;
52
Aby uzyskać dostęp do rejestrów przetwornika AD1871, należy na jego wejściu
CLATCH ustawić stan niski. Wejście CLATCH jest podłączone do wyprowadzenia
P1.21 mikrokontrolera. Następnie, przez interfejs SSP0, wysyłane są trzy, 16-bitowe
słowa, które programują rejestry konfiguracyjne przetwornika. Odbywa się to przez
wpisanie do rejestru danych SSP0DR tych słów. Po każdym wpisaniu jest sprawdzane,
czy transmisja została zakończona. Następuje to przez określenie, czy odpowiedni bit w
rejestrze SSP0SR jest jedynką. Jeśli tak, oznacza to, że dane są wciąż przesyłane, co
powoduje, że program krąży w pustej pętli while do momentu, aż bit zostanie
wyzerowany. Po wysłaniu ostatniego słowa konfiguracyjnego, stan linii CLATCH jest
ustawiany na wysoki, co blokuje dostęp do rejestrów konfiguracyjnych przetwornika.
TIMER0, a właściwie przerwanie od niego, służy do wysyłania rezultatów
przetwarzania analogowo-cyfrowego do komputera.
Listing 8.
/* Konfiguracja TIMER0 */
/* Wartość, do której zlicza T0PC; gdy doliczy, inkrementowany jest TC */
T0PR = 188;
/* Inkrementowany z częstotliwością PCLK */
T0PC = 0;
/* gdy T0MR0 = TC -> generuj przerwania i resetuj TC */
T0MCR = 0x03;
/* Wartość, z która porównywany jest TC; gdy równe, podejmowana jest wybrana
wyżej akcja */
T0MR0 = 1;
/* TIMER w trybie TIMER (zlicza narastające zbocza PCLK) */
T0CTCR = 0x00;
/* Zerowanie TIMERa i preskalera */
T0TCR =0x02;
Rejestr T0PC jest inkrementowany z częstotliwością pracy TIMER0, a więc 18 Mhz.
Gdy jego wartość osiągnie tą, zapisaną w T0PR, jest zwiększany rejestr TC, a ten jest z
53
kolei porównywany z T0MR0. Po zrównaniu wartości wywoływane jest przerwanie od
TIMER0.
Ostatnim urządzeniem peryferyjnym, które trzeba skonfigurować, jest interfejs
I2S, służący do odbioru danych z przetwornika AD1871. Został ustawiony kanał
odbiorczy, ponieważ tylko on jest używany.
Listing 9.
/* Konfiguracja I2S do odbioru danych z AD1871 */
/* Kanał odbiorczy; slave, stereo, 32-bitowy format */
I2S_DAI = 0x7E3;
/* Zegar dla kanału odbiorczego, PCLK / (8+1) = 8 MHz */
I2S_RXRATE = 0x08;
/* Stop i reset; */
I2S_DAI = 0x7FB;
/* Po resecie */
I2S_DAI = 0x7E3;
W rejestrze I2S_DAI, kanał odbiorczy jest ustawiony do pracy w trybie podrzędnym
(slave), natomiast format danych, to 32-bitowe stereo. Oznacza to odbiór z przetwornika
32-bitów danych na kanał. Następnie, w rejestrze I2S_RXRATE, należy ustawić
podzielnik dla zegara kanału odbiorczego, wg zależności:
Zegar I2S = PCLK / (I2S_RXRATE + 1)
Minimalna częstotliwość pracy zegara powinna wynieść:
96000 * 2 * 32 = 6,144 MHz
Przesyłanych jest 32 bity na kanał, z częstotliwością próbkowania 96 kHz. W programie
częstotliwość wynosi 8 MHz, a więc spełnia wymagania.
Aby zapewnić poprawną synchronizację interfejsu, należy, po każdej zmianie
parametrów pracy, zresetować kanał odbiorczy, co jest dokonywane w rejestrze
54
I2S_DAI.
Konfiguracja mikrokontrolera została zakończona. Pozostało napisanie dwóch
funkcji, które obsługują procedury przerwań od odbioru danych interfejsu UART3 oraz
od TIMER0. Funkcje te znajdują się poza sekcją main() programu. Najpierw procedura
obsługi przerwania UART3.
Listing 10.
void UART3_RX_IRQ(void) __irq
{
int cnt=0;
/* Odbiór danych od aplikacji PC: 0xDB lub 0x24 */
cnt = U3RBR;
/* Włącz TIMER0 oraz preskaler; rozpocznij odbieranie danych z przetworników i
wysyłanie do komputera */
if(cnt==0xDB) {T0TCR = 0x01;}
/* Wyłącz TIMER0 */
if(cnt==0x24) {T0TCR = 0x00;}
/* Koniec procedury przerwania */
VICVectAddr = 0;
}
Przerwanie jest wywoływane, gdy interfejs UART3 odbierze dane. Dane te pochodzą z
aplikacji
działającej
na
komputerze
PC
i
uruchomiają,
bądź
wyłączają,
przechwytywanie wyników konwersji analogowo-cyfrowych z przetworników. Program
może wysłać jedną z dwóch kombinacji:
•
0xDB, co powoduje uruchomienie licznika TIMER0,
•
0x24, co wyłącza licznik TIMER0.
55
Włączenie licznika TIMER0 powoduje cykliczne (z częstotliwością 96 kHz)
wchodzenie do procedury obsługi przerwania od tego układu (o której zaraz). Procedura
zajmuje się odbieraniem danych
(rezultatów konwersji) z przetworników A/C, a
następnie wysyła je do aplikacji działającej na komputerze. Odbywa się to z częstością
96 kHz, ponieważ z taką częstotliwością próbkowania działają oba przetworniki. Jeżeli,
podczas działania układu, z aplikacji Windows nadchodzi komenda do zatrzymania
przetwarzania, wtedy mikrokontroler wchodzi do procedury obsługi przerwania od
interfejsu UART3 i wyłącza licznik TIMER0.
Ostatnią składową programu jest procedura obsługi przerwania od licznika
TIMER0.
Listing 11.
void TIMER0_IRQ(void) __irq
{
/* Wskaźnik do wybierania kolejnych bajtów z tablicy SPI */
char *spi;
/* Wskaźnik do wybierania kolejnych bajtów z tablicy I2S */
char *i2s;
/* Ustawienie wskaźnika na początek tablicy SPI */
spi = (char *) &dane_spi;
/* Ustawienie wskaźnika na początek tablicy I2S */
i2s = (char *) &dane_i2s;
/* Odbiór danych z I2S, po 32 bity na kanał (AD1871) */
for(i=0; i<2; i++)
{
dane_i2s[i] = I2S_RX_FIFO / 4;
}
i=0;
56
/* Stan niski na P0.16, podłączonym do wejścia CNVST przetwornika AD7652
- rozpoczęcie konwersji A/C */
IOCLR0 = 0x10000;
/* Stan wysoki na P0.16 (CNVST) - wyłączenie konwersji */
IOSET0 = 0x10000;
/* Czekaj na koniec przetwarzania; P2.8 podłączony do linii BUSY */
while(FIO2PIN & 0x100);
S0SPDR = 0x00;
/* Czekaj na zakończenie transmisji */
while(!(S0SPSR & 0x80));
/* Odbiór danych z SPI (AD7652) */
dane_spi[0] = S0SPDR / 8;
/* Wysłanie 24 bitów przez UART3 (po 8 bitów), odebranych przez port I2S */
i2s++;
for (i=0; i<3; i++)
{
/* Czekaj, aż będzie można zapisać do bufora nadajnika */
while(!(U3LSR & 0x20));
/* Do rejestru nadawczego wpisywane są kolejne, 8-bitowe paczki danych */
U3RBR = *(i2s++);
}
i=0; i2s = 0;
/* Wysłanie 16 bitów przez UART3 (po 8 bitów), odebranych przez port SPI */
for (i=0; i<2; i++)
{
/* Czekaj, aż będzie można zapisać do bufora nadajnika */
while(!(U3LSR & 0x20));
/* Do rejestru nadawczego wpisywane są kolejne, 8-bitowe paczki danych */
U3RBR = *(spi++);
}
i = 0; spi = 0;
57
T0TC = 0;
/* Koniec procedury przerwania */
T0IR = 1;
VICVectAddr = 0;
}
Procedura rozpoczyna się od deklaracji dwóch wskaźników typu znakowego, które
służą do wysyłania 8 bitów danych z każdej tablicy (zadeklarowanych na początku
programu – listing 1). Następnie wskaźniki są ustawiane na początki tablic. Potem
następuje odbiór danych z przetwornika AD1871, poprzez wpisanie do tablicy dane_i2s
zawartości kolejki FIFO odbiornika I2S. Odbierane są po 32 bity na kanał, z czego tylko
24 są właściwymi danymi i są wyrównane do lewej.
Kolejny krok, to zainicjowanie konwersji w AD7652, co następuje poprzez
sprowadzenie wejścia CNVST przetwornika do stanu niskiego. Następnie wejście jest
ustawiane z powrotem w stan wysoki i jest oczekiwane zakończenie przetwarzania
analogowo-cyfrowego (sprawdzanie stanu linii BUSY przetwornika). Gdy linia BUSY
powróci do stanu niskiego, przetwarzanie jest zakończone i można odbierać rezultaty
konwersji. Następuje to poprzez port SPI. Do tablicy dane_spi jest wpisywana
zawartość rejestru S0SPDR, czyli 16 bitów.
Po odebraniu rezultatów przetwarzania z obu przetworników, funkcja wysyła je do
komputera PC. Jest to realizowane za pomocą inkrementacji wskaźników typu
znakowego (char), które wskazują kolejne bajty (8 bitów) z tablic danych. Z tablicy I2S
jest wysyłanych w sumie 24 bity (tylko rezultaty konwersji lewego kanału AD1871),
natomiast z SPI – 16 bitów.
Po wysłaniu ostatniej paczki danych, należy zakończyć procedurę obsługi przerwania,
poprzez wyzerowanie flagi przerwania od licznika, oraz wpisanie do rejestru
VICVectAddr wartości 0. Nie należy mylić tego rejestru z rejestrami VICVectAddr(x),
które są numerowane i odpowiadają slotom w wektoryzowanym kontrolerze przerwań.
Do rejestru VICVectAddr, po wystąpieniu przerwania, jest przepisywany adres
procedury obsługi (funkcje TIMER0_IRQ oraz UART3_RX_IRQ), która ma zostać
58
wykonana. Z tego powodu, przy wychodzeniu z niej, należy ten rejestr wyzerować. W
przeciwnym wypadku, mikrokontroler przebywałby cały czas w procedurze obsługi.
W ten sposób zakończona została konfiguracja mikrokontrolera oraz pisanie
programu sterującego. Do omówienia pozostały ustawienia przetworników, minimodułu
MMusbX232H oraz aplikacja działająca na komputerze PC.
3.6 Konfiguracja przetworników A/C
3.6.1 AD187121
Przetwornik AD1871 został osadzony na obwodzie drukowanym, gdzie
umieszczono potrzebne do jego działania elementy, natomiast sygnały zostały
wyprowadzone za pomocą łącz szpilkowych.
Masy oraz zasilania układu należy podłączyć zgodnie z opisami na schemacie z rysunku
30. Sposób połączenia z mikrokontrolerem jest pokazany na rysunku 22, w
podrozdziale 3.3.1.
Konfiguracja przetwornika wymaga podłączenia dwóch wyprowadzeń do stanu
niskiego (masy). Są to sygnały XCTRL oraz CASC. Pierwszy odpowiada za sposób
konfiguracji układu, natomiast drugi decyduje, czy przetwornik pracuje w połączeniu
kaskadowym czy pojedynczo. Tutaj pracuje pojedynczo, natomiast podłączenie XCTRL
do stanu niskiego, uaktywnia możliwość konfiguracji przetwornika przez jego rejestry
konfiguracyjne.
21 Na podstawie: AD1871 User's manual. Rev. 0 - Analog Devices, Inc., 2002
59
Rys.30 Schemat modułu z przetwornikiem AD1871
60
AD1871 posiada trzy rejestry, służące do ustawiania parametrów jego pracy. Każdy z
nich ma długość 16 bitów.
15-12
Adres
11
10
9 8 7 6 5 4 3 2 1 0
Zapis/Odczyt Zarezerwowany
Dane konfiguracyjne
Rys.31 Schemat rejestru konfiguracyjnego
Rejestr jest identyfikowany po czterech najstarszych bitach. Kolejny określa, czy będzie
on czytany (1) czy zapisywany (0). 10 jest bitem zarezerwowanym, natomiast pozycje
9-0 stanowią informację, która ustawia pożądane parametry pracy przetwornika.
Pierwszy rejestr konfiguracyjny
15-12
11
10
9 8 7 6 5 4 3 2 1 0
0000
0
0
0 0 0 1 0 0 0 0 0 0
Drugi rejestr konfiguracyjny
15-12
11
10
9 8 7 6 5 4 3 2 1 0
0001
0
0
0 0 0 0 0 0 0 0 0 0
Trzeci rejestr konfiguracyjny
15-12
11
10
9 8 7 6 5 4 3 2 1 0
0010
0
0
0 0 1 1 0 0 0 0 0 0
Przetwornik jest ustawiony do pracy z częstotliwością próbkowania 96 kHz oraz
rozdzielczością 24-bitów. Działa w trybie master, interfejs danych jest ustawiony w tryb
I2S. Zewnętrzny generator kwarcowy dostarcza sygnał o częstotliwości 24,576 MHz, z
którego jest uzyskiwany sygnał 6,144 MHz, taktujący wewnętrzny modulator sigmadelta.
Przetwornik działa, jako urządzenie nadrzędne, a więc sam dostarcza sygnały zegarowe,
potrzebne do pracy interfejsu I2S (zegar główny oraz wyboru słowa).
61
3.6.2 AD765222
Podobnie, jak AD1871, AD7652 został osadzony na obwodzie drukowanym.
Masy oraz zasilania należy podłączyć zgodnie ze schematem z rysunku 32, natomiast
połączenie z mikrokontrolerem LPC2368 ilustruje rysunek 22 (podrozdział 3.3.1).
Konfiguracja tego przetwornika odbywa się poprzez podłączenie odpowiednich
wyprowadzeń do stanów niskiego lub wysokiego. Nie posiada on rejestrów
konfiguracyjnych. W omawianym projekcie wyprowadzenia są podłączone w
następujący sposób:
•
BYTESWAP – stan wysoki,
•
OB/#2C – stan niski, co oznacza, że przetwornik wysyła dane w formacie
dopełnienia do dwóch (podobnie, jak AD1871),
•
SER/#PAR – stan wysoki; wybrany jest szeregowy interfejs danych,
•
EXT/#INT – stan wysoki; przetwornik przyjmuje zewnętrzny zegar, taktujący
szeregowy interfejs danych,
•
INVSYNC – stan niski,
•
INVSCLK – stan niski; nieodwrócony sygnał zegarowy,
•
RDC/SDIN – stan niski; gdy SER/#PAR wysoki oraz EXT/#INT wysoki,
RDC/SDIN, przy pracy przetworników w konfiguracji kaskadowej, może
służyć, jako wejście danych z innego przetwornika; w tym przypadku należy go
podłączyć do stanu niskiego,
•
SYNC – używany tylko w przypadku pracy z wewnętrznym zegarem
(EXT/#INT niski),
•
RDERROR – nieużywany,
•
#RD oraz #CS – stan niski; przesyłanie danych włączone,
•
PD, PDREF, PDBUF – stan niski.
22 Na podstawie: AD7652 User's manual. Rev. 0 - Analog Devices, Inc., 2003
62
Rys.32 Schemat modułu z przetwornikiem AD7652
63
3.7 Konfiguracja FT2232H (oraz minimodułu)23
Minimoduł należy podłączyć do mikrokontrolera zgodnie z rysunkiem 23
(podrozdział 3.3.2). Ponadto, należy zewrzeć następujące wyprowadzenia:
•
USBPWR z EXTPWR,
•
3V3 z IOPWR
W takiej konfiguracji minimoduł jest zasilany z portu USB komputera.
Rys.33 Wyprowadzenia minimodułu MmusbX232H
Układ FT2232H posiada dwa kanały (A i B). Każdy może być skonfigurowany
oddzielne, za pomocą programu MProg (rysunek 34), dostępnego na stronie producenta
układu, firmy FTDI. Do zaprogramowania układu potrzebna jest dodatkowa pamięć
EEPROM. Taka znajduje się na minimodule MMusbX232H.
Każdy z kanałów może być zaprogramowany tak, aby był widziany w systemie, jako
wirtualny port COM lub dostęp do niego może odbywać się bezpośrednio, z użyciem
sterownika D2XX. W pracy inżynierskiej, kanał A pozostaje wirtualnym COM-em,
23 Na podstawie: FT2232H User's manual – FTDI Limited, 2009
64
natomiast B jest skonfigurowany do pracy ze sterownikiem D2XX. Kanał A jest
wykorzystywany do programowania pamięci Flash mikrokontrolera LPC2368, co nie
wymaga dużych szybkości. Kanał B służy do przesyłu rezultatów konwersji analogowocyfrowych z mikrokontrolera do komputera, co wymaga przepustowości nieosiągalnych
dla sterownika wirtualnego COM-a.
Sekcja Hardware określa sposób komunikacji z urządzeniami podpiętymi do układu
FT2232H. Mikrokontroler LPC2368 łączy się z FT2232H przy wykorzystaniu
protokołu RS232 (na obu kanałach). Zatem konfiguracja powinna wyglądać, jak ta
zaprezentowana na rysunku 34. Należy ją najpierw zapisać na dysku twardym (File ->
Save As ...), a następnie wpisać do pamięci EEPROM (Device -> Program).
Rys.34 MProg
Do komunikacji z systemem Windows są potrzebne sterowniki, które można
pobrać ze strony FTDI – http://www.ftdichip.com. W jednym pakiecie znajdują się
zarówno sterowniki wirtualnego COM-a, jak i D2XX.
65
3.8 Aplikacja dla systemu Windows przechwytująca wyniki
przetwarzania A/C24
Program odczytuje dane z układu FT2232H, a następnie zapisuje na dysku
twardym komputera. Aplikacja została stworzona w języku C++, w środowisku Visual
Studio 2010. Do jego uruchomienia potrzebny jest pakiet .NET Framework w wersji 4.0
lub wyższej.
Rys.35 Okno główne aplikacji
Program, nazwany ADC Reader, jest prosty w obsłudze. Przyciski START oraz
STOP służą do kontroli układu czytającego przetworniki A/C. W prawym górnym rogu
znajduje się pole, w które można wpisać nazwę, pod jaką ma być zapisany plik WAVE.
Po naciśnięciu przycisku START, aplikacja rozpoczyna działanie. Klasa
PortHandler (listing 12), wykorzystując metodę Zacznij, komunikuje się z układem
FT2232H, który jest podłączony do portu USB. Ponadto, klasa ta obsługuje oraz
nadzoruje port. Za połączenie z układem odpowiada biblioteka ftd2xx.dll, natomiast
funkcje, dedykowane do komunikacji z układem, znajdują się w pliku ftd2xx.h. Ich opis
można znaleźć w dokumentacji D2XX Programmer's Guide Version 1.02, dostępnej na
stronie firmy FTDI.
Listing 12.
void ComReader::PortHandler::Zacznij(WavFile^ target)
{
cel = target;
FT_STATUS ftStatus = FT_OK;
pin_ptr<FT_HANDLE> ptr = &handle;
ftStatus = FT_Open(0, ptr);
24 Na podstawie: D2XX Programmer's Guide Version 1.02
Kent Reisdorph: C++ Builder 3. Gliwice, Helion 1998
66
readThread = gcnew Thread(gcnew
ThreadStart(ComReader::PortHandler::ReadData));
czytacDalej = true;
readThread -> Start();
while (!readThread -> IsAlive);
Thread::Sleep(1000);
}
Po nawiązaniu połączenia z FT2232H, program ADC Reader wysyła do
mikrokontrolera
LPC2368
liczbę
219,
która
rozpoczyna
procedurę
odczytu
przetworników analogowo-cyfrowych. Za odczyt buforów FT2232H odpowiedzialna
jest funkcja ReadData (listing 13). Dla każdej próbki, aplikacja odbiera 5 bajtów
danych, z czego trzy pierwsze, to rezultat przetwarzania lewego kanału przetwornika
AD1871, natomiast kolejne dwa – przetwornika AD7652.
Listing 13.
void ComReader::PortHandler::ReadData()
{
FT_STATUS status;
DWORD dwTXBytes;
Byte start = 219;
if(handle)
{
status = FT_SetBaudRate(handle, 4500000);
status = FT_Write(handle, &start, 1, &dwTXBytes);
}
while(czytacDalej) {
DWORD dwRead, dwRXBytes;
//array<unsigned char>^ bufor = gcnew array<unsigned char>(5);
unsigned char *bufor = new unsigned char[5];
if(handle) {
status = FT_GetQueueStatus(handle, &dwRead);
67
if(status != FT_OK) {
MessageBox::Show("Błąd odczytu kolejki");
continue;
}
while(dwRead && czytacDalej) {
status = FT_Read(handle, bufor, 5, &dwRXBytes);
if(status != FT_OK) {
MessageBox::Show("Błąd odczytu portu");
}
else {
unsigned int lewy = (bufor[0] << 16) + (bufor[1] <<
8) + bufor[2];
unsigned short prawy = (bufor[3] << 8) + bufor[4];
cel -> AppendData(lewy, prawy);
}
}
}
delete [] bufor;
Thread::Sleep(0);
}
if(handle) {
FT_Close(handle); } }
Zakończenie pracy następuje po naciśnięciu przycisku STOP. Program, wykorzystując
metodę StopReadding (listing 14), wysyła do mikrokontrolera liczbę 36, po której
następuje zakończenie transmisji oraz czytanie przetworników A/C.
Listing 14.
void ComReader::PortHandler::StopReading()
{
Byte stop = 36;
FT_STATUS status;
DWORD dwTXBytes;
czytacDalej = false;
68
status = FT_Write(handle, &stop, 1, &dwTXBytes);
if(readThread && readThread -> IsAlive) {
TimeSpan waitTime = TimeSpan(0, 0, 1);
if(readThread -> Join(waitTime) != true) {
readThread -> Abort(); } }
Po zakończeniu transmisji, program zapisuje dane otrzymane z przetworników
A/C. Odpowiada za to klasa WavFile (listing 15). Instrukcje leftChannel i rightChannel
przechowują informacje odebrane z mikrokontrolera, natomiast funkcja data zawiera
informacje potrzebne do zapisu pliku WAVE, oraz informacje o kolejności kanałów.
Listing 15.
WavFile::WavFile(void){
dataSize = 10;
data = gcnew array <Byte> (dataSize * 4);
leftChannel = gcnew array <unsigned int> (dataSize);
rightChannel = gcnew array <unsigned short> (dataSize);
numSamples = 0;
}
Ponieważ sygnały z obu przetworników mają różną długość słowa, przed zapisem do
pliku program musi je „wyrównać”. W tym celu, jest ignorowanych 8 najmniej
znaczących bitów danych z przetwornika AD1871. Ponieważ zapis do pliku następuje
dopiero po naciśnięciu przycisku STOP, podczas odbierania danych z FT2232H są one
przechowywane w tablicy, której rozmiar reguluje funkcja ResizeData (listing 16).
Dzięki funkcji AppendData (listing 16), która została wywołana w klasie PortHandler,
odbierane próbki są przekazywane do instrukcji leftChannel i rightChannel. Tworzenie
wynikowego pliku WAVE, to zadanie funkcji WriteFile (listing 16). W nagłówku pliku
WAVE są zapisywane dane przechowywane w funkcji data, a następnie są zapisywane,
naprzemiennie, kanały lewy i prawy, które mają w tym momencie wymaganą wielkość,
16 bitów (rysunek 36).
69
Rys.36 Schemat zapisu danych do pliku
Listing 16.
WavFile::~WavFile(void)
void WavFile::ResizeData()
{
unsigned int newDataSize = 2 * this -> dataSize;
array<Byte>^ newData = gcnew array <Byte> (newDataSize * 4);
for(unsigned int i = 0; i < dataSize * 4; newData[i] = data[i], i++);
data = newData;
array<unsigned int>^ newLeft = gcnew array <unsigned int> (newDataSize);
array<unsigned short>^ newRight = gcnew array <unsigned short>
(newDataSize);
for(unsigned int i = 0; i < dataSize; newLeft[i] = leftChannel[i], newRight[i] =
rightChannel[i], i++);
leftChannel = newLeft;
rightChannel = newRight;
dataSize = newDataSize;
}
void WavFile::AppendData(unsigned int leftData, unsigned short rightData)
{
70
if(numSamples == dataSize)
ResizeData();
leftChannel[numSamples] = leftData;
rightChannel[numSamples] = rightData;
unsigned int offset = 6 * numSamples;
data[offset] = Convert::ToByte(leftData % 256);
data[offset + 1] = Convert::ToByte((leftData >> 8) % 256);
data[offset + 2] = Convert::ToByte(rightData % 256);
data[offset + 3] = Convert::ToByte((rightData >> 8) % 256);
numSamples++;
}
void WavFile::SetFilename(String^ newFilename)
{
this -> filename = String::Concat(newFilename, ".wav");
}
void WavFile::WriteFile()
{
BinaryWriter^ binWriter = gcnew BinaryWriter( File::Open( this -> filename,
FileMode::Create ) );
/* ChunkID */
String ^tmp = "RIFF";
binWriter -> Write(tmp -> ToCharArray());
/* ChunkSize */
WavFile::WriteToWave(binWriter, numSamples * 4 + 36);
/* Format */
tmp = "WAVE";
binWriter -> Write(tmp-> ToCharArray());
/* SubChunk1ID */
tmp = "fmt ";
binWriter -> Write(tmp-> ToCharArray());
/* SubChunk1Size - 16 for PCM */
WavFile::WriteToWave(binWriter, (unsigned int) 16);
/* AudioFormat - 1 for PCM */
71
WavFile::WriteToWave(binWriter, (unsigned short) 1);
/* NumChannels - 1 for PCM */
WavFile::WriteToWave(binWriter, (unsigned short) 2);
/* Sample Rate - 96 kHz */
WavFile::WriteToWave(binWriter, (unsigned int) 96000);
/* ByteRate == SampleRate * NumChannels * BitsPerSample/8 */
WavFile::WriteToWave(binWriter, (unsigned int) 384000);
/* BlockAlign == NumChannels * BitsPerSample/8 */
WavFile::WriteToWave(binWriter, (unsigned short) 4);
/* BitsPerSample */
WavFile::WriteToWave(binWriter, (unsigned short) 16);
/* Subchunk2ID */
tmp = "data";
binWriter -> Write(tmp-> ToCharArray());
/* Subchunk2Size == NumSamples * NumChannels * BitsPerSample/8 */
WavFile::WriteToWave(binWriter, numSamples * 4);
binWriter -> Write(this -> data);
binWriter -> Close();
}
void WavFile::WriteToWave(BinaryWriter ^bw, unsigned int dataToWrite)
{
bw -> Write(Convert::ToByte(dataToWrite % 256));
bw -> Write(Convert::ToByte((dataToWrite >> 8) % 256));
bw -> Write(Convert::ToByte((dataToWrite >> 16) % 256));
bw -> Write(Convert::ToByte((dataToWrite >> 24) % 256));
}
void WavFile::WriteToWave(BinaryWriter ^bw, unsigned short dataToWrite)
{
bw -> Write(Convert::ToByte(dataToWrite % 256));
bw -> Write(Convert::ToByte((dataToWrite >> 8) % 256));
}
72
Utworzony plik WAVE ma następujące cechy:
•
rodzaj kompresji – brak,
•
liczba kanałów – 2,
•
częstotliwość próbkowania – 96 kHz,
•
16 bitów na kanał.
73
4. Działanie układu do badania przetworników
analogowo-cyfrowych
Aby uruchomić układ, należy:
•
podłączyć zasilanie (9 woltów),
•
podłączyć minimoduł MMusbX232H do portu USB komputera i poczekać, aż
system zainstaluje sterowniki; w Windows XP może być konieczne ich
ściągniecie ze strony http://www.ftdichip.com/,
•
podłączyć źródło sygnału analogowego do gniazda mini-jack,
•
uruchomić program ADC Reader.
Po wciśnięciu przycisku START, rozpocznie się odczytywanie przez mikrokontroler
LPC2368 przetworników A/C, i wysyłanie danych do komputera. Przycisk STOP
zakończy procedurę, a program zapisze wyniki jako plik dźwiękowy WAVE w katalogu
głównym aplikacji.
Poniżej są zaprezentowane przebiegi dwóch nagrań, pochodzących z mikrofonu o
następujących parametrach:
•
charakterystyka: kardioidalna,
•
impedancja: 600 Ohm,
•
poziom wyjściowy dla 1 kHz: -72 dB,
•
charakterystyka częstotliwości: 60-14000 Hz.
Mikrofon został podłączony bezpośrednio do przetworników, z pominięciem
przedwzmacniacza.
Pierwsze dwa przebiegi (rysunki 37 i 38) ilustrują sygnał mowy, a kolejne (39 i 40) –
puste nagrania, przy odłączonych od przetworników przewodach sygnałowych.
74
Rys.37 Mowa – przebieg
Rys.38 Mowa – spektrogram
Powyższe wykresy przedstawiają różnicę przetwarzania sygnału przez przetworniki A/C
wykonane w różnych technologiach – sigma-delta (lewy kanał - góra) oraz SAR (prawy
kanał - dół). W tle rejestrowanego sygnału widoczne są zakłócenia, nanoszące się na
stosunkowo długie, nieekranowane przewody sygnałowe. Celowo zostały zastosowane
nieekranowane przewody, aby pokazać różnicę we wrażliwości na zakłócenia obydwu
przetworników. Jak wynika z powyższych wykresów, przetwornik sigma-delta, z
wbudowanym filtrem decymującym, lepiej tłumi zakłócenia powstałe w przewodach
sygnałowych.
75
Rys.39 Puste nagranie przy odłączonych przewodach – przebieg
Rys.40 Puste nagranie przy odłączonych przewodach – spektgrogram
Dwa ostatnie wykresy przedstawiają wyniki przetwarzania samych przetworników, bez
dołączonych na wejścia przewodów sygnałowych. W przypadku przetwornika SAR,
moduł udało się zaprojektować tak, że szumy oraz zakłócenia są na poziomie niższym
od najmniej znaczącego bitu, natomiast w przypadku przetwornika sigma-delta powstały szum wynika ze specyfiki pracy układu modulatora oraz decymatora.
76
5. Podsumowanie
Założenia, wymienione we wstępie tego opracowania, zostały zrealizowane i
zaprojektowany układ działa poprawnie. Aby móc zapisywać na komputerze PC sygnał
analogowy, podany na wejścia przetworników, należało:
•
zaprojektować obwody drukowane, na których zostały osadzone układy
przetworników A/C (AD1871 oraz AD7652),
•
zaprojektować przedwzmacniacz mikrofonowy, aby sygnałem z mikrofonu
wysterować wejścia przetworników,
•
napisać program sterujący dla mikrokontrolera LPC2368, który pozwala
odczytać rezultaty konwersji analogowo-cyfrowej z przetworników, a następnie
wysyła je do komputera,
•
skonfigurować układ FT2232H, który łączy mikrokontroler LPC2368 z
komputerem,
•
zaprojektować płytę główną, na której zostały osadzone wszystkie moduły,
•
napisać aplikację dla PC-eta, która steruje układem i zapisuje wyniki otrzymane
z przetworników analogowo-cyfrowych na dysku twardym, w postaci pliku
dźwiękowego WAVE.
Stworzony układ do badania przetworników A/C ma charakter prototypowy,
ponieważ wnosi stosunkowo dużo zakłóceń na wejścia przetworników. Jest to
spowodowane długimi przewodami, którymi są doprowadzone sygnały analogowe.
Rozwiązaniem problemu może być osadzenie układów scalonych na jednym obwodzie
drukowanym, z krótkimi, odpowiednio prowadzonymi ścieżkami oraz ekranowaniem
płytki PCB. Jeżeli zajdzie potrzeba zastosowania przewodów, powinny być to przewody
ekranowane i możliwie jak najkrótsze.
77
6. Bibliografia
1) Lucjan Bryndza: LPC2000. Mikrokontrolery z rdzeniem ARM7. Warszawa,
BTC 2007
2) Tomasz P. Zieliński: Cyfrowe przetwarzanie sygnałów. Od teorii do zastosowań.
Warszawa, WKŁ 2007
3) Wojciech Głocki: Układy cyfrowe. Warszawa, WSiP
4) Stanisław Kuta: Elementy i układy elektroniczne. Część I. Kraków,
Wydawnictwa AGH 2000
5) Kent Reisdorph: C++ Builder 3. Gliwice, Helion 1998
6) LPC23XX User's manual. Rev. 02 - NXP B.V., 2009
7) AD1871 User's manual. Rev. 0 - Analog Devices, Inc., 2002
8) AD7652 User's manual. Rev. 0 - Analog Devices, Inc., 2003
9) OP275 User's manual. Rev. C - Analog Devices, Inc., 2004
10) FT2232H User's manual – FTDI Limited, 2009
11) Document Reference No.: FT_000071
D2XX Programmer's Guide Version 1.02
Clearance No.: FTDI# 60
12) Robert Bandyk: Dlaczego przetwornik 1-bitowy jest lepszy od 16-bitowego,
część 3. Elektronika dla wszystkich. Kwiecień 2003
http://www.elportal.pl/pdf/2003/edw_2003_04_s66.pdf
13) Piotr Górecki, Zbigniew Orłowski: Niskoszumny przedwzmacniacz
mikrofonowy. Elektronika dla wszystkich 10/96
http://sklep.avt.pl/photo/_pdf/AVT2017.pdf?
sess_id=48ff7a8324aa63306e15f29b86df18f0
78
7. Podział obowiązków
Krzysztof Wąsala:
•
Rozdziały:
•
•
•
3. Układ do badania przetworników A/C
•
3.1 Zastosowane układy scalone
•
3.2 Zasilanie układu
•
3.3 Połączenia modułów
•
3.4 Przedwzmacniacz mikrofonowy na układzie OP275
•
3.5 Konfiguracja mikrokontrolera LPC2368 (wraz z minimodułem)
•
3.6 Konfiguracja przetworników A/C
•
3.7 Konfiguracja FT2232H (oraz minimodułu)
4. Działanie układu do badania przetworników analogowo-cyfrowych
Część praktyczna:
•
Projekt przedwzmacniacza mikrofonowego
•
Konfiguracja oraz program sterujący dla mikrokontrolera LPC2368
•
Konfiguracja przetworników AD1871 oraz AD7652
•
Konfiguracja układu FT2232H
•
Montaż elementów na obwodach drukowanych
79
Jakub Seruś:
•
Rozdziały:
•
1. Wstęp
•
2. Przetwarzanie analogowo-cyfrowe
•
•
2.1 Teoria
•
2.2 Rodzaje współcześnie stosowanych przetworników
3. Układ do badania przetworników A/C
•
3.8 Aplikacja dla systemu Windows przechwytująca wyniki
przetwarzania A/C
•
•
4. Działanie układu do badania przetworników analogowo-cyfrowych
•
5. Podsumowanie
Część praktyczna:
•
Aplikacja dla komputera PC
•
Projekt obwodów drukowanych
•
Montaż elementów na obwodach drukowanych
80
DODATEK A: Projekty obwodów drukowanych
•
Moduł z przetwornikiem AD1871 (skala 2:1)
•
Moduł z przetwornikiem AD7652 (skala 2:1)
81
•
Przedwzmacniacz mikrofonowy (skala 2:1)
•
Płyta główna (skala 1:1,4)
82
Download