LABORATORIUM Komputery przemysłowe i systemy wbudowane ĆWICZENIE 4 System przetwarzania sygnałów w czasie rzeczywistym opartyna zmiennoprzecinkowym procesorze sygnałowym Prowadzący: Mariusz Rudnicki 2016
Spis treści 1. Wstęp.... 3 2. Praca z modułem uruchomieniowym... 5 2.1. Diagnostyka... 5 2.2. Zintegrowane środowisko programistyczne.... 6 3. Zadanie 1.... 12 4. Zadanie 2.... 13 5. Zadanie 3.... 14 6. Zadanie 4.... 15 7. Zadanie 5.... 17 8. Załącznik 1 Generowanie sygnałów okresowych... 18 9. Załącznik 2. Układ kodeka TLV320AIC23.... 20-2 -
1. Wstęp. Laboratorium będzie realizowane z wykorzystaniem zestawu uruchomieniowego firmy Spectrum Digital zawierający procesor sygnałowy firmy Texas Instruments. Płyta zestawu uruchomieniowego składa się z bloków funkcjonalnych jak przedstawia to poniższe zdjęcie: Rysunek 1. Rozmieszczenie elementów, wyprowadzeń oraz bloków funkcyjnych na płycie zestawu uruchomieniowego TMS320C6713 DSK Płyta zawiera zastępujące elementy: Procesor sygnałowy TMS320C6713, taktowny zegarem 225 MHz Pamięć dynamiczna 16MB SDRAM Układ kodeka AIC23 Pamięć Flash Kontroler emulacji JTAG Złącze kompatybilne ze złączem EVM do podłączania układów dodatkowych Głównym układem zestawu uruchomieniowego jest 32-bitowy zmiennoprzecinkowy procesor sygnałowy TMS320C6713. Zawiera on rdzeń C67xx+ który jest zoptymalizowany do realizacji złożonych operacji zmiennoprzecinkowych 1350 MFLOPS, 1800 MIPS. Obszerna, wewnętrzna pamięć procesora umożliwia uzyskanie maksymalnej wydajności i realizacji zadań czasu rzeczywistego. - 3 -
Procesor jest uzupełniony o liczne interfejsy które czynią go elastycznym elementem projektowanych systemów. Najważniejszymi interfejsami są: - wielokanałowy port szeregowy (McBSPs), - kontroler I2C, - dwa 64-bitowe zegary, - kontroler EDMA, - elastyczny interfejs do współpracy z układami zewnętrznymi EMIF (pamięć DDR2, Flash, SRAM,I/O) - interfejs Serial Rapid I/O Pamięć SDRAM służy do przechowywania programu i danych. Pamięć Flash jest używana do przechowywania programu z którego zostanie uruchomiony procesor po podaniu zasilania. Poprzez wyprowadzenie sygnałów interfejsu EMIF istnieje możliwość podłączenia karty rozszerzającej (daughtercard) dostarczanych przez różnych producentów lub własnoręcznie opracowanych. Procesory sygnałowe są często używane w aplikacjach przetwarzających dźwięk dlatego na płycie umieszczono kodek (AIC23). Kodek umożliwia kodowanie/dekodowanie, a jego działanie ogranicza się do przetwarzania sygnału z postaci analogowej na cyfrową dla późniejszej obróbki przez procesor i zamianę postaci cyfrowej sygnału na analogową. Do komunikacji z układem kodeka służy interfejs McBSP0. - 4 -
2. Praca z modułem uruchomieniowym 2.1. Diagnostyka Przystępując do realizacji zadań w ramach Laboratorium, należy w pierwszej kolejności dokonać kontroli poprawności podłączenia zestawu uruchomieniowego firmy Spectrum Digital. v3.1. Następnie należy uruchomić program diagnostyczny 6713 DSK Diagnostics Utility Ma on za zadanie przetestowanie połączenia pomiędzy komputerem PC (zintegrowanym środowiskiem programistycznym) a modułem uruchomieniowym i sprawdzić poprawność działania głównych układów płyty uruchomieniowej. Aby uruchomić program diagnostyczny należy skorzystać z ikony umieszczonej na pulpicie: Rysunek 2. Ikona programu diagnostycznego modułu uruchomieniowego Rysunek 3. Okno z poprawnym wynikiem diagnostyki modułu uruchomieniowego. - 5 -
2.2. Zintegrowane środowisko programistyczne. W celu uruchomienia zintegrowanego środowiska programistycznego należy skorzystać z ikony umieszczonej na pulpicie: Rysunek 4. Ikona zintegrowanego środowiska programistycznego. Rysunek 5. Okno główne Code Composer Studio. - 6 -
Pierwszą czynnością po uruchomieniu środowiska jest nawiązanie połączenia z modułem uruchomieniowym można tego dokonać poprzez wybranie opcji z menu Debug Connect (Alt+C). Rysunek 6. Nawiązanie połączenia z modułem. - 7 -
Aby wczytać wcześniej przygotowany projekt należy wybrać opcję Project Open Rysunek 7.Odczyt pliku projektowego. Po odczytaniu pliku projektowego z katalogu ProgramNr1 i wybraniu okna z plikiem źródłowym okno środowiska będzie wyglądało następująco. Rysunek 8. Okno środowiska po odczycie pliku projektowego. - 8 -
Tworzenie programu wykonywalnego (*.out) do odnalezienia w podkatalogu C:\CCStudio_v3.1\MyProjects\ProgramNr2\Debug - następuje poprzez: a. Realizację projektu: - opcja Rebuild All ikona Toolbar, - opcja Rebuild All z menu Project, Rysunek 9. Ikona Rebuild All. Rysunek 10. Menu Project zintegrowanego środowiska programistycznego. - 9 -
b. Weryfikacja tworzenia pliku wykonywalnego w oknie wyjściowym: oczekiwany wynik 0 errors,? warnings Rysunek 11. Okno wyniku kompilacji. Ładowanie programu do pamięci procesora sygnałowego dokonuje się przez wybranie opcji z menu File Load Program: Rysunek 12. Wybór polecenia Load Program z menu File. Plik wykonywalny (*.out) zwykle znajduje się w podkatalogu Debug tworzonego projektu. Rys.13. Rysunek 13. Okno wyboru pliku wykonywalnego. Aby uruchomić program lub śledzić jego (kod) krok po kroku należy skorzystać z opcji menu Debug, skrótów klawiszowych lub używając różnych ikon Toolbara - 10 -
Rysunek 14. Menu Debug oraz Toolbar Debug. - 11 -
3. Zadanie 1. Korzystając z szablonu programu (Katalog projektu C:\CCStudio_v3.1\MyProjects\ProgramNr1) zestawić program tak, aby odczytywał stan przełączników, zadanych przez prowadzącego, umieszczonych na płycie zestawu uruchomieniowego. W sprawozdaniu należy: 1. Umieścić zestawiony kod programu W tym celu należy wykorzystać dostępną funkcje odczytującą stan przełączników: Uint32 DSK6713_DIP_get(Uint32 dipnum) Parametr wejściowy: dipnum oznacza numer przełącznika, gdzie: dipnum = 0 przełącznik nr 0 dipnum = 1 przełącznik nr 1 dipnum = 2 przełącznik nr 2 dipnum = 3 przełącznik nr 3 Wartość zwracana: 0 przełącznik wciśnięty, 1 przełącznik wyciśnięty. Rysunek 15. Przełącznik umieszczony na płycie. Przykład: Zestawić program tak aby odczytywał stan przełącznika nr 3. if (DSK6713_DIP_get(3) == 0) { // Przełącznik nr 3 jest włączony printf("wcisnięty przełącznik DIP3 \n"); } else { // Przełącznik nr 3 jest wyłączony printf("wycisnięty przełącznik DIP3 \n"); } - 12 -
4. Zadanie 2. Korzystając z szablonu programu (Katalog projektu C:\CCStudio_v3.1\MyProjects\ProgramNr2) zestawić program tak, aby realizował zadany program włączania/wyłączania diód LED w odpowiedzi na odpowiedni stan przełączników. Program włączania/wyłączania podaje prowadzący. W sprawozdaniu należy: 1. Umieścić zestawiony kod programu W tym celu należy wykorzystać dostępną funkcje włączenia diody LED: void DSK6713_LED_on(Uint32 lednum) Parametr wejściowy: lednum oznacza numer diody LED do włączenia, gdzie: lednum = 0 dioda LED nr 0 lednum = 1 dioda LED nr 1 lednum = 2 dioda LED nr 2 lednum = 3 dioda LED nr 3 Rysunek 16. Diody LED umieszczone na płycie. Aby wyłączyć diodę LED należy użyć analogicznie działającej funkcji: void DSK6713_LED_off(Uint32 lednum) Przykład: Włącz diodę LED nr 0 a pozostałe ustaw w stan wyłączony, gdy przełącznik nr 0 jest wciśnięty, a pozostałe przełączniki są wyłączone. if ((DSK6713_DIP_get(3) == 1) && (DSK6713_DIP_get(2) == 1) && (DSK6713_DIP_get(1) == 1) && (DSK6713_DIP_get(0) == 0) ) { DSK6713_LED_off(3); // Zgaś diodę LED nr 3 DSK6713_LED_off(2); // Zgaś diodę LED nr 2 DSK6713_LED_off(1); // Zgaś diodę LED nr 1 DSK6713_LED_on(0); // Zapal diodę LED nr 0 } else { DSK6713_LED_off(3); //Zgaś diodę LED nr 3 DSK6713_LED_off(2); //Zgaś diodę LED nr 2 DSK6713_LED_off(1); //Zgaś diodę LED nr 1 DSK6713_LED_off(0); //Zgaś diodę LED nr 0 } - 13 -
5. Zadanie 3. Korzystając z szablonu programu (Katalog projektu C:\CCStudio_v3.1\MyProjects\ProgramNr3) zestawić program tak aby realizował zadaną sekwencje migania diód LED. Postać sekwencji podaje prowadzący. W sprawozdaniu należy: 1. Umieścić zestawiony kod programu W tym celu należy wykorzystać dostępną funkcje zmiany stanu diody LED, jak i wcześniej omawiane funkcje. void DSK6713_LED_toggle(Uint32 lednum) Parametr wejściowy: lednum oznacza numer diody LED Oraz funkcje opóźnienia czasowego z rozdzielczością mikrosekundową: void DSK6713_waitusec(Uint32 delay) Parametr wejściowy: delay opóźnienie podane w mikrosekundach Przykład: Włącz diodę LED nr 0 a pozostałe ustaw w stan wyłączony, gdy przełącznik nr 0 jest wciśnięty, a pozostałe przełączniki są wyłączone. DSK6713_LED_init() // inicjiuj diody LED DSK6713_LED_toggle(2); // Zmień stan diody LED nr 2 DSK6713_waitusec(500000); // Czekaj 0.5 sek DSK6713_LED_toggle(2); // Zmień stan diody LED nr 2 DSK6713_waitusec(1000000); // Czekaj 1 sek DSK6713_LED_toggle(1); // Zmień stan diody LED nr 1 DSK6713_waitusec(2000000); // Czekaj 2 sek DSK6713_LED_toggle(1); // Zmień stan diody LED nr 1 DSK6713_waitusec(1000000); // Czekaj 1 sek - 14 -
6. Zadanie 4. Korzystając z szablonu programu (Katalog projektu C:\CCStudio_v3.1\MyProjects\ProgramNr4) Zestawić program tak aby wygenerować sygnał sinusoidalny o zadanej częstotliwości i amplitudzie, podanych przez prowadzącego. Materiały pomocnicze zamieszczono w Załączniku 1 i Załączniku 2. W sprawozdaniu należy: 1. Zamieścić zarejestrowany sygnał generowany na wyjściu słuchawkowym i liniowym 2. Umieścić zestawiony kod programu Rysunek 17. Schemat połączeń dla zadania nr 4. Zestawiając program należy skorzystać z funkcji obsługi układu kodeka: void DSK6713_AIC23_setFreq(DSK6713_AIC23_CodecHandle hcodec, Uint32 freq) Parametr wejściowy: hcodec uchwyt kodeka freq częstotliwość próbkowania kodeka (domyślnie 48 khz) - 15 -
void DSK6713_AIC23_outGain(DSK6713_AIC23_CodecHandle hcodec, Uint16 outgain) Parametr wejściowy: hcodec uchwyt kodeka outgain wzmocnienie sygnału wyjściowego w torze słuchawkowym Wzmocnienie możemy regulować w 79 krokach w zakresie od +6dB do -73dB (wyciszenie) przy czym dla -73 db należy wpisać wartość 48 dec (0110000 bin), natomiast dla +6dB należy wpisać wartość 127 dec (1111111 bin). Przykład: Zestawić program tak aby wygenerować sygnał sinusoidalny o częstotliwości 200 Hz i amplitudzie 1,4V. 1. Określamy wielkość tablicy z wartościami sygnału zgodnie ze wzorem (1.2). Ustaw właściwą liczbę próbek przypadającą na jeden okres generowanego sygnału w linii jak poniżej przedstawiono: #define LICZBA_PROBEK_NA_OKRES 40 2. Odpowiednio modyfikujemy funkcje główną programu void main() { DSK6713_AIC23_CodecHandle hcodec; Int16 msec, sample; DSK6713_init(); // Otwarcie obsługi układu kodeka hcodec = DSK6713_AIC23_openCodec(0, &ConfigJhs); // Ustawienie wzmocnienia amplitudy wyjścia słuchawkowego DSK6713_AIC23_outGain(hCodec, 127); // Ustawienie częstotliwości próbkowania na 8 khz DSK6713_AIC23_setFreq(hCodec, DSK6713_AIC23_FREQ_8KHZ); // Tworzenie tablicy z próbkami sygnału generowanego GenerowanieSygnalu(LICZBA_PROBEK_NA_OKRES); while(1) { for (sample = 0; sample < LICZBA_PROBEK_NA_OKRES; sample++) { // Wyślij próbkę do lewego kanału while (!DSK6713_AIC23_write(hCodec, TablicaProbekSygnalu[sample])); // Wyślij próbkę do prawego kanału while (!DSK6713_AIC23_write(hCodec, TablicaProbekSygnalu[sample])); } } // Zamknięcie obsługi układu kodeka DSK6713_AIC23_closeCodec(hCodec); } - 16 -
7. Zadanie 5. Korzystając z szablonu programu (Katalog projektu C:\CCStudio_v3.1\MyProjects\ ProgramNr5), zestawić program tak aby przekazać sygnał z wejścia kodeka na wyjście kodeka po odpowiednim wzmocnieniu sygnału na wejściu i wyjściu., podanych przez prowadzącego. W sprawozdaniu należy: 1. Zamieścić wykres podawanego sygnału zarejestrowanego na wyjściu słuchawkowym 2. Umieścić zestawiony kod programu Rysunek 18. Schemat połączeń dla zadania nr 5. Przykład: Zestawić program tak aby przetworzony został sygnał z wejścia liniowego na wyjście słuchawkowe z następującymi parametrami: częstotliwość próbkowania 8 khz, wzmocnienie wejścia liniowego 0dB, wzmocnienie wyjścia słuchawkowego 0dB. W tym celu należy zmodyfikować ustawienia jak poniżej: // ============================================================== // Parametry do ustawienia // ============================================================== Uint32 fp=dsk6713_aic23_freq_8khz; // Częstotliwość próbkowania Uint32 AmpHeadphone=121; // Wzmocnienie wyjścia słuchawkowego (48..127) // (-73 db.. +6dB <== krok 1 db) 0dB 121 Uint32 InputLineVol=23; // Wzmocnienie wejścia liniowego (0..31) // (-34.5 db.. +12dB <== krok 1.5 db) 0dB 23-17 -
8. Załącznik 1 Generowanie sygnałów okresowych W celu wygenerowania sygnału o określonej częstotliwości i amplitudzie, dysponując przetwornikiem cyfrowo-analogowym o częstotliwości próbkowania fp należy przeprowadzić następującą analizę. Generowanie sygnału polega na podaniu wartości układowi kodeka, który generuje na wyjściu układu sygnał analogowy o odpowiedniej amplitudzie. Aby wygenerować sygnał zmienny w czasie, należy przygotować tablice z wartościami sygnału, które będą kolejno podawane do układu kodeka, a wystawiane przez kodek zgodnie z częstotliwością próbkowania. Przygotowanie tablicy z wartościami sygnału. Chcąc uzyskać sygnał generowany o określonej częstotliwości należy dobrać ilość próbek na okres sygnału generowanego odpowiednio do częstotliwości próbkowania (Czyli dobrać wielkość tablicy z wartościami sygnału). Aby generowanie sygnału przebiegało poprawnie w tablicy powinny być przechowywane wartości odwzorowujące pełen okres sygnału generowanego lub jego wielokrotność. Zależność ta jest opisana wzorem: gdzie:, (1.1) częstotliwość generowanego sygnału, częstotliwość próbkowania kodeka, ilość próbek sygnału na okres. Z powyższego wzoru otrzymujemy:, (1.2) Posiadając informacje o wielkości potrzebnej tablicy z wartościami funkcji, możemy przejść do jej wygenerowania. Należy to zrobić zgodnie ze wzorem: gdzie: amplituda generowanego sygnału, częstotliwość generowanego sygnału,, (1.3) stały odstęp pomiędzy kolejnymi próbkami na wyjściu kodeka, indeks generowanej próbki. Przekształcając powyższy wzór na nasze potrzeby otrzymujemy: (1.4) Powyższe równanie posłuży nam do wygenerowania generowanego. wartości tablicy sygnału Przykład: - 18 -
Dla wygenerować sygnał o częstotliwości. 1. Określamy wielkość tablicy z wartościami sygnału zgodnie ze wzorem (1.2). 2. Wyliczamy wartości tablicy sygnału generowanego zgodnie ze wzorem (1.4). dla czyli, - 19 -
9. Załącznik 2. Układ kodeka TLV320AIC23. Do realizacji zadań związanych z konwersją sygnału analogowego do postaci cyfrowej jaki konwersji sygnału cyfrowego go postaci analogowej jak już wcześniej wspomniano służy układ kodeka TLV320AIC23. Jest to wysoce zintegrowany układ scalony zawierający przetworniki A/C oraz C/A typu Sigma-Delta operujący z częstotliwościami próbkowania od 8 do 96 khz. Układ ten komunikuje się z procesorem sygnałowym przy użyciu interfejsu szeregowego McBSP. Schemat funkcjonalny układu przedstawiono poniżej. Rysunek 19. Układ funkcjonalny kodeka TLV320AIC23. Układ posiada stereofoniczne wejścia i wyjścia liniowe, wejście mikrofonowe oraz stereofoniczne wyjście słuchawkowe. Każde z nich zostało wyposażone we wzmacniacz programowalny przez co istnieje możliwość wzmocnienia sygnału jak i jego tłumienie a dla wejścia mikrofonowego całkowite jego wyciszenie. Szczegółowe informacje dostępne są w dokumentacji firmy Texas Instruments o symbolu SLWS106H. - 20 -