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