Kurs DSP Audio, czyli SigmaDSP dla każdego (4). Interfejs użytkownika

Kurs DSP Audio, czyli SigmaDSP dla każdego (4). Interfejs użytkownika

W czwartej części kursu, na podstawie projektu przykładowego, pokazane zostaną metody zmiany parametrów bloków używanych w aplikacji.

Do przeprowadzenia testów, oprócz zapoznania się z poprzednimi odcinkami kursu, konieczne będzie przygotowanie części sprzętowej, tj. płytki bazowej DSP1701A_DSP_MK2, która zawiera wszystkie niezbędne do testów elementy manipulacyjne (takie jak przyciski, przełączniki i potencjometry – z wyjątkiem enkodera obrotowego, który trzeba przygotować oddzielnie). Wymienione elementy są niezbędne do zmiany parametrów aplikacji DSP z użyciem wbudowanych linii GPIO i przetwornika A/D. Oprócz tego oczywiście niezbędne będzie źródło sygnału analogowego, wzmacniacz z głośnikami oraz okablowanie mini jack stereo 3,5 mm/RCA (w zależności od standardu podłączonych urządzeń).

Do parametryzacji aplikacji (bo przecież niezmiernie rzadko zdarza się, by program nie wymagał dostrojenia, zmiany lub korekty parametrów) wykorzystywane są trzy metody. Pierwszą jest użycie środowiska SigmaStudio i bezpośrednie sterowanie aplikacją za pomocą elementów manipulacyjnych, w które wyposażone są bloki funkcjonalne – takich jak przyciski, przełączniki, pokrętła lub suwaki. Pozwala to w intuicyjny sposób wpływać na obrabiany sygnał audio. Drugą metodą jest zastosowanie kontrolek graficznego interfejsu użytkownika GUI, konfigurowanego podczas tworzenia aplikacji. Interfejs użytkownika może być ograniczony tylko do niezbędnych elementów manipulacyjnych. Takie rozwiązanie zmniejsza ryzyko błędnej konfiguracji i upraszcza obsługę w porównaniu z metodą pierwszą – szczególnie gdy aplikacja jest bardziej skomplikowana (hierarchiczna).

Obie metody wymagają stałej komunikacji płytki DSP1701A_DSP_MK2 ze środowiskiem SigmaStudio poprzez programator USBi, co w przypadku pracy samodzielnej procesora DSP jest niestety mało użyteczne. W tym przypadku niezbędne jest użycie metody trzeciej, czyli zmiany parametrów DSP poprzez wyprowadzenia GPIO i A/D za pomocą fizycznych przełączników, przycisków, potencjometrów lub enkoderów. W analogiczny sposób można sygnalizować wewnętrzny stan sygnału, np. za pomocą diod LED podłączonych do GPIO lub zastosować do sterowania układów zewnętrznych, takich jak multipleksery wejść, obwody stand-by, wyciszania itp.

Przykład użycia pierwszej, „podstawowej” metody parametryzacji opisany został w aplikacji testowej z części drugiej kursu, omawiającej środowisko SigmaStudio.

Przykładem praktycznego wykorzystania drugiej metody parametryzacji z zastosowaniem graficznego interfejsu użytkownika będzie projekt testowy ADAU1701_MK2_Cz4_ProjektTestowyGUI. Jest to prosty tor audio z regulacją poziomu, wyciszaniem oraz trójpasmowym regulatorem barwy dźwięku, zawierający generator sygnału testowego, którego schemat pokazano na rysunku 1. Schemat uzupełniono o mierniki poziomu sygnału oraz bloki Stimuls/Probe, umożliwiające wizualizację obliczonej charakterystyki przenoszenia, przydatnej do sprawdzenia działania manipulatorów.

Rysunek 1. Projekt testowy interfejsu GUI

W celu zwiększenia czytelności schematu regulator barwy Tone3Band narysowany został z użyciem schematu hierarchicznego. Schemat bloku wraz z konfiguracją zaprezentowano na rysunku 2. Korektory niskich i wysokich częstotliwości ustawione są jako „półkowe”, co odpowiada klasycznej regulacji barwy tonów niskich i wysokich, w której regulowany jest poziom pasma poniżej lub powyżej ustalonej częstotliwości. Regulator tonów średnich ma natomiast postać klasycznego regulatora podbijającego/osłabiającego wybraną częstotliwość.

Rysunek 2. Schemat regulatora barwy dźwięku

W tej postaci schemat należy skompilować i wgrać do pamięci procesora DSP. Oczywiście po uruchomieniu aplikacji, do jej parametryzacji możliwe jest zastosowanie pierwszej metody, polegającej na bezpośrednim użyciu manipulatorów bloków funkcjonalnych. Po sprawdzeniu ich działania przechodzimy do zakładki Hardware Configuration, gdzie do obszaru roboczego przeciągamy blok interfejsu użytkownika Control UI. Znajduje się on w bibliotece Processors (ICs/DSPs) zakładki Tree ToolBox, zgodnie z rysunkiem 3.


Rysunek 3. Blok interfejsu użytkownika Control UI

Możliwe jest użycie kilku bloków Control UI, co pozwala podzielić interfejs użytkownika zgodnie z realizowaną funkcją. Domyślnie blok nazwany jest (dość nieintuicyjnie) Control 1, ale nazwę – na bardziej czytelną dla użytkownika – można zmienić, klikając lewym klawiszem myszy w polu opisu, co pokazano na rysunku 4.

Rysunek 4. Bloki interfejsu użytkownika z wyedytowanymi nazwami

Po wybraniu pola Show otrzymujemy dostęp do ekranu konfiguracyjnego manipulatorów. Domyślnie możemy umieścić w nim do 2×5 manipulatorów, ale jeżeli ta liczba nie jest wystarczająca, to za pomocą menu Edit\Rows\Insert Row dodajemy dodatkowy rząd.

Analogicznie kolejny rząd manipulatorów można usunąć zgodnie z rysunkiem 5. Niestety nie można zmniejszyć liczby manipulatorów poniżej domyślnej 2×5, co w prostszych aplikacjach generuje niepotrzebne, puste miejsca na ekranie konfiguracyjnym.

Rysunek 5. Konfiguracja ekranu manipulatorów UI

Każde z pól może zostać przypisane do jednego z czterech elementów manipulacyjnych, takich jak: pokrętło (Knob), suwak (Slider), przełącznik (Switch), przycisk (Button), zgodnie z rysunkiem 6. W celu dodania manipulatora wybieramy menu podręczne, dostępne po naciśnięciu małego trójkącika w górnym lewym narożniku danego pola.

Rysunek 6. Konfiguracja elementów manipulacyjnych UI

Pola interfejsu użytkownika uzupełniamy, dodając następujące elementy:

  • pokrętło, które będzie służyć do regulacji poziomu sygnału testowego,
  • przycisk służący do wyłączenia generatora,
  • przełącznik wybierający sygnał z generatora testowego lub z wejścia audio A/D.

Po konfiguracji interfejs użytkownika powinien wyglądać jak na rysunku 7. Dla poprawy czytelności należy zmienić domyślne nazwy bloków, podobnie jak w przypadku Control UI.

Rysunek 7. Skonfigurowany interfejs z manipulatorami do generatora testowego

W następnej kolejności należy powiązać manipulator z regulowanym parametrem. Po przypisaniu elementu zostaje udostępnione menu: przypisania (Assign), właściwości (Properities) oraz usunięcia (Delete) elementu manipulacyjnego (rysunek 8).

Rysunek 8. Menu podręczne konfiguracji manipulatora

Kolejno musimy przypisać do elementu parametr, który będzie nim regulowany. W przypadku regulacji poziomu jest to parametr Gain z głównego schematu Main i elementu TestLevel. W przypadku schematów hierarchicznych każdy schemat ma parametry zgrupowane w rozwijanej liście o nawie zgodnej z nazwą schematu. Wybór parametru pokazano na rysunku 9. Pewnym problemem przy bardziej skomplikowanych blokach są braki w dokumentacji, zarówno jeżeli chodzi o opis parametrów, jak i ich regulowany zakres – wtedy niestety pozostaje metoda prób i błędów lub poszukiwanie w zasobach internetowych.

Rysunek 9. Powiązanie parametru z elementem manipulacyjnym

Po wyborze parametru automatycznie przechodzimy do okienka pokazanego na rysunku 10, w którym definiujemy zakres regulacji, określając liczbę kroków oraz wartość parametru w każdym z nich (dostępne także z menu podręcznego Properties).

Rysunek 10. Konfiguracja kroków regulacji

Przy mniejszej liczbie parametrów można zrobić to, wprowadzając odpowiednie nastawy i ręcznie edytując tablicę. Krok zerowy odpowiada najmniejszej wartości parametru. Przy powtarzalnych elementach manipulacyjnych, np. suwakach regulacji poziomu, możliwe jest jednorazowe zdefiniowanie parametrów, zapisanie ich na dysku opcją Export i ponowne przypisanie przygotowanego pliku opcją Import do pozostałych zdefiniowanych elementów. Zapisane pliki znajdują się w katalogu głównym projektu. Wartości zmiennych zapisywane są w pliku tekstowym (w formacie csv, ale z rozszerzeniem *.txt) i można je edytować dowolnym edytorem, przygotowując je wcześniej np. w arkuszu kalkulacyjnym. Jest to wygodne przy większej licznie kroków lub kilku zmienianych jednocześnie parametrach. W przypadku kilku parametrów w pliku kolejne kolumny zawierają się w nawiasach klamrowych. Jeżeli liczba kroków regulacji nie zgadza się z liczbą linii w pliku, jest automatycznie uzupełniana wartościami zerowymi, a jeżeli wartości jest więcej niż kroków, to nadmiarowe wpisy są ignorowane.

Jeżeli manipulator nie jest już potrzebny w interfejsie użytkownika, można usunąć go opcją Delete z menu podręcznego. Należy zwrócić uwagę na brak powiązania pomiędzy wartościami parametru w krokach regulacji a opisem w interfejsie użytkownika. Przykładowo poziom sygnału regulowany jest w zakresie od –55 dB do –9 dB w krokach 3 dB, a pokrętło ma domyślny opis w postaci numerów kroku 0...16. Należy to zmienić, klikając pokrętło lewym przyciskiem myszy i odpowiednio „synchronizując” zakres regulacji z opisem pokrętła – zgodnie z rysunkiem 11. W identyczny sposób definiowany jest element suwak (Slider), który stanowi po prostu zmienioną formę graficzną elementu pokrętła (Knob).

Rysunek 11. Konfiguracja opisu skali pokrętła regulacji

Kolejnym elementem jest przycisk ON/OFF generatora, który konfigurujemy zgodnie z rysunkiem 12. Za włącznie i wyłączenie generatora odpowiada parametr TestGEN: OnOff, który należy powiązać w przyciskiem. Parametr ten przyjmuje tylko dwie wartości: 0 – generator wyłączony, 1 – generator włączony.

Rysunek 12. Powiązanie parametru z przyciskiem

Ostatnią możliwością manipulacji parametrami generatora jest sterowanie multiplekserem przełączającym sygnał z wejścia analogowego lub z generatora. W tym celu do elementu typu przełącznik należy przypisać parametry: MUX:OnOff, MUX:Rep1 OnOff i określić „kroki” (stany) przełączania multipleksera, zgodnie z rysunkiem 13. Edytor Value Conversion Table editor umożliwia podstawową edycję zawartości komórek, dodawanie, usuwanie, kopiowanie i zmianę kolejności aktywnych kolumn. W celu aktywacji opcji edycji kolumn należy kliknąć prawym klawiszem myszki nagłówek z opisem kolumny.

Rysunek 13. Konfiguracja przełącznika sterującego multiplekserem

Po przypisaniu elementów można – a nawet należy – przetestować ich działanie. Każda modyfikacja wartości parametru w interfejsie użytkownika Control UI powinna zmieniać działanie układu oraz położenia odpowiadających manipulatorów na schemacie (w przeciwnym kierunku powiązanie nie działa).

Dodatkową opcją jest możliwość podglądu parametrów zapisywanych z interfejsu użytkownika do DSP. Po wyborze z menu Settings opcji Enable Data Capture – która w czasie rzeczywistym wyświetla w okienku Capture dane wysyłane do DSP (po zmianie ustawień elementów manipulacyjnych z bloku Control UI, analogicznie jak to ma miejsce w przypadku korzystania z manipulatorów w blokach funkcyjnych) – pojawia się automatycznie komunikat o możliwym spowolnieniu działania środowiska w trybie Capture.

Aplikacja z przygotowanym interfejsem użytkownika może w razie potrzeby zostać zabezpieczona przed nieautoryzowaną modyfikacją przy użyciu opcji Freeze z Menu Action\Freeze Schematic (CTRL+F). Można też ukryć zawartość bloków funkcjonalnych, klikając blok prawym klawiszem myszy i wybierając opcję Disable This Control, a następnie podając hasło odblokowujące. Po ukryciu wszystkich bloków i ochronie hasłem, użytkownikowi pozostaje „pusty” schemat i możliwość korzystania tylko ze zdefiniowanych elementów z GUI, co po pierwsze chroni nasze pomysły, a po drugie zapobiega modyfikacji parametrów krytycznych, których użytkownik nie powinien zmieniać. Odblokowanie elementu do ponownej edycji wykonujemy, klikając prawym klawiszem myszy w obrębie bloku, co wywołuje menu podręczne Enable This Control. Po wybraniu tej opcji poproszeni zostaniemy o podanie hasła odblokowującego element. Należy pamiętać, że interfejs użytkownika nie zmienia schematu aplikacji DSP, która musi zostać przygotowana i przetestowana przed konfiguracją interfejsu UI, będącego tylko dodatkową nakładką służąca do zmiany parametrów.

W identyczny sposób należy skonfigurować drugi interfejs, odpowiedzialny za regulację toru analogowego, w skład którego wchodzą trzy suwaki regulatora barwy tonu, przycisk wyciszania i suwak regulacji głośności. Sterowaniu podlegają parametry Boost bloków Main.Tone3Band LowShelf, MidPeak, HighShelf oraz Mute bloku Mute i Gain bloku Level. W przypadku tego ostatniego bloku, w celu uzyskania precyzyjnej regulacji, liczba kroków zwiększona została do 91, a dane dla pliku Volume.txt wygenerowane zostały w arkuszu kalkulacyjnym. Po zmianie opisów oraz skali elementów interfejs jest gotowy do użycia (rysunek 14). Poprawne działanie regulacji barwy tonu można sprawdzić za pomocą bloków Stimuls/Probe.

Rysunek 14. Skonfigurowany interfejs użytkownika toru audio

Po zapisaniu, kompilacji i załadowaniu projektu mamy możliwość obsługi aplikacji zarówno z poziomu elementów schematu, jak i z okna interfejsu użytkownika. Okienko interfejsu może zostać zamknięte przyciskiem na belce tytułowej, ponowne jego wywołanie następuje po naciśnięciu klawisza Show bloku Control UI. Konfiguracja okienka UI może zostać zapisana w pliku *.xml – wraz z parametrami – po wyborze opcji Save/SaveAs z menu okna interfejsu.

Trzecią metodą wpływania na aplikację DSP jest użycie interfejsu GPIO. Procesor ADAU1701, którego schemat blokowy przypominamy na rysunku 15, wyposażony jest w programowalny interfejs GPIO, przeznaczony do współpracy z zewnętrznymi elementami manipulacyjnymi, takimi jak przełączniki, przyciski czy enkodery oraz elementami sygnalizującymi lub sterującymi. Wbudowany przetwornik A/D GPIO przeznaczony jest do obsługi potencjometrów lub analogowego sygnału sterującego. Umożliwia to prostą realizację interfejsów użytkownika w trybie pracy samodzielnej DSP, bez konieczności zastosowania zewnętrznego procesora sterującego.

Rysunek 15. Interfejs GPIO ADU1701

Interfejs GPIO składa się z dwunastu wyprowadzeń MP0...11, w tym czterech wejść analogowych MP2,3,7,8 o 8-bitowej rozdzielczości. Wyprowadzenia GPIO współdzielone są z cyfrowymi interfejsami szeregowymi audio, na co należy zwrócić uwagę podczas projektowania układu. Dla ułatwienia prototypowania płytka DSP1701A_DSP_MK2 wyposażona została w podstawowe elementy manipulacyjne podłączone do GPIO, zgodnie ze schematem z rysunku 16. Na płytce umieszczono dwa potencjometry, interfejs enkodera, dwa przyciski i przełącznik DIP oraz dwie buforowane diody LED. Każdy z elementów ma odpowiadającą zworę umożliwiającą odłączenie od wyprowadzenia GPIO, jeżeli jest ono używane do realizacji innej funkcji. Złącze GPIO umożliwia wyprowadzenie sygnałów MP1,2,3,7,8,9 wraz z zasilaniem 3,3 V do zewnętrznych układów współpracujących z DSP. Pozostałe wyprowadzenia GPIO, realizujące w DSP1701A_DSP_MK2 funkcję interfejsów cyfrowych audio, dostępne są na złączach I2SI, I2SO.

Rysunek 16. Schemat podłączenia wbudowanych elementów interfejsu GPIO

Obsługa interfejsu GPIO wspierana jest przez elementy biblioteczne SigmaStudio z biblioteki GPIO Conditioning. W pierwszej kolejności należy jednak skonfigurować część sprzętową DSP w zakładce Hardware Configuration. Listę dostępnych opcji pokazano na rysunku 17. Wbudowany przetwornik A/D musi przed użyciem zostać załączony opcją Enable, a ponadto trzeba określić sposób filtrowania sygnału wejściowego Input Filter – do wyboru jest histereza 4/5 bitów lub brak histerezy i wyłączenie filtru.


Rysunek 17. Konfiguracja sprzętowa GPIO

Wyprowadzenia GPIO, w trybie pracy w roli wejścia cyfrowego Input GPIO, mają wbudowany wewnętrzny rezystor podciągający o wartości około 15 kΩ. Podczas konfiguracji można aktywować wbudowany filtr eliminujący drgania styków Input GPIO Debounce, o czterech ustawianych czasach uśredniania (5, 10, 20, 40 ms) dla grupy wejść GPIO. Warto dodać, że wyprowadzenie MP8 ma błąd w implementacji sprzętowej i może zachowywać się nieprawidłowo (brak odczytu stanu wyprowadzenia), jeżeli skonfigurowane jest jako wejście z eliminacją drgań styku – niestety, nie ma możliwości rozwiązania problemu, więc linii tej należy używać w innej konfiguracji (np. do obsługi potencjometru). W trybie wyjścia cyfrowego możliwy jest wybór konfiguracji przeciwsobnej (Push-Pull Output GPIO) lub otwartego kolektora (OC Output GPIO Open Collector). Wydajność prądowa wyprowadzeń jest niewielka (do 2 mA), dlatego na płytce DSP1701A_DSP_MK2 – w roli buforów LED – zastosowano bramki z serii 1G06. Szeregowe rezystory 470 Ω, podłączone do elementów manipulacyjnych, chronią przed skutkami błędnej konfiguracji GPIO. Przy wykorzystaniu większej liczby wyjść należy pamiętać o sumarycznym pobieranym prądzie i każdorazowo zalecane jest użycie buforów lub pośredniego tranzystora sterującego. Napięcie doprowadzone do GPIO nie może przekraczać 3,3 V, także w przypadku wyjść OC (w ich przypadku może być jednak niższe, co ułatwia sprzęganie z układami zasilanymi np. napięciem 1,8 V czy 2,5 V, oczywiście z zewnętrznym rezystorem podciągającym).

UWAGA: GPIO pracują w standardzie napięciowym 3,3 V, przekroczenie tego napięcia trwale uszkodzi procesor DSP.

Wbudowany, pomocniczy przetwornik A/D ma 4 kanały o rozdzielczości 8 bitów, zakres napięć wejściowych to 0...3,0 V, co w przybliżeniu daje krok 12 mV/bit, przy rezystancji wejścia ok. 30 kΩ. Wejście ma charakterystykę liniową, najlepiej współpracuje z potencjometrem lub źródłem napięcia o liniowej charakterystyce zmian. Jeżeli wymagana jest zmiana charakterystyki regulacji, to powinna być ona realizowana na drodze programowej w DSP, np. przez tablice wartości LUT. Zapewni to najwyższą dokładność regulacji i pełne wykorzystanie rozdzielczości A/D. Interfejs GPIO domyślnie taktowany jest sygnałem fs, co nie znaczy, że należy używać go w roli przetwornika sygnału audio (uniemożliwia to zbyt mała rozdzielczość, a także brak połączenia z rdzeniem audio DSP). Jest to często spotykany błąd przy pierwszych projektach – A/D GPIO służy tylko i wyłącznie do podłączenia elementów manipulacyjnych, w żadnym przypadku do obsługi sygnału audio. Podczas projektowania własnego systemu istotne jest ponadto odpowiednie przyporządkowanie wyprowadzeń, szczególnie interfejsów cyfrowych, które „blokują” sporą część pinów GPIO – w tym AD – możliwą do wykorzystania przez interfejs użytkownika. Gdy aplikacja używa wszystkich pinów wyprowadzonych na złącze GPIO, nie ma przeciwwskazań do zastosowania pozostałych MPxx (wyprowadzonych na złącza I2SI, I2SO). Kompletne zestawienie funkcjonalności GPIO zebrano w tabeli 1.

Do przetestowania obsługi interfejsu GPIO przygotowane zostały dwie aplikacje:

  • ADAU1701_MK2_Cz4_ProjektTestowyGPIO_ENC.dspproj
  • ADAU1701_MK2_Cz4_ProjektTestowyGPIO_POT.dspproj

Pierwsza prezentuje podstawową obsługę GPIO i interfejs enkodera obrotowego do zmiany poziomu sygnału. Schemat aplikacji widać na rysunku 18.

Rysunek 18. Schemat aplikacji ADAU1701_MK2_Cz4_ProjektTestowyGPIO_ENC.dspproj

Jak wspominano wcześniej, SigmaStudio ma przygotowane bloki funkcjonalne współpracujące z interfejsem GPIO/A/D. W bibliotece IO\GPIO znajdują się bloki wejścia General Purpose Input, Auxiliary ADC Input, General Purpose Output, służące do obsługi wyprowadzeń GPIO. W odróżnieniu od bloków Input/Output dla wejść/wyjść audio, punkt połączeniowy bloku zaznaczony jest kolorem czerwonym, co wskazuje jednoznacznie na sygnał sterujący/kontrolny, który nie powinien był łączony z sygnałami toru audio. Także pozostałe bloki funkcjonalne, m.in. regulatory poziomu, multipleksery itp., które przeznaczone są do pracy z zewnętrznym sygnałem sterującym, mają wejścia sterujące wyróżnione kolorem czerwonym. Przykładowa aplikacja ADAU1701_MK2_Cz4_ProjektTestowyGPIO_ENC.dspproj realizuje bardzo prosty tor sygnału audio – to tylko regulator poziomu i obwód wyciszania. Sygnał audio z wejść analogowych doprowadzony jest do bloku regulatora poziomu SW Vol1, a stąd do multiplekserów Slew Mux1,2 i następnie do wyjść audio. Dobrą praktyką podczas tworzenia aplikacji jest wysterowanie diody LED, sygnalizującej pracę DSP. W tym celu użyto bloku generatora sygnału o zmiennym wypełnieniu Pulse1, w którym zadana jest częstotliwość 1 Hz i wypełnienie sygnału 90% – sygnał z wyjścia generatora doprowadzono do komparatora ZeroComp1. Komparator ten porównuje dane wejściowe w dowolnym formacie do wartości 0, sygnalizując stanem „1” każdy sygnał wejściowy różny od 0. W naszym przypadku służy to do uzyskania wartości binarnej bezpośrednio sterującej wyprowadzeniem cyfrowym GPIO1, do którego podłączona jest dioda LED MP1. Drugą dobrą praktyką jest wskazywanie obecności sygnału audio w torze. W tym celu sygnały obu kanałów są sumowane w bloku Add i doprowadzone do bloku detektora sygnału Signal Detection1. Ten zaś poprzedzony jest filtrem DC Blocking DCB1, odcinającym składową stałą z wyjścia przetwornika A/D audio. Zadaniem bloku detektora sygnału jest ustawienie wyjścia na czas określony na 2 sekundy, po detekcji sygnału o poziomie szczytowym przekraczającym –60 dB. Wartości można oczywiście dobrać do własnych wymogów. Wyjście detektora steruje diodą MP7. Aby uzyskać negację stanu wyjścia MP7, by dioda sygnalizowała obecność, a nie brak sygnału audio, wykorzystano możliwość sprzętowej inwersji stanu w konfiguracji sprzętowej, zgodnie z rysunkiem 19. W taki nieskomplikowany sposób można sterować wyjściami GPIO.

Rysunek 19. Konfiguracja GPIO aplikacji ADAU1701_MK2_Cz4_ProjektTestowyGPIO_ENC.dspproj

Do obsługi enkodera zastosowano blok funkcjonalny Rotary Encoder z biblioteki GPIO Conditioning, konwertujący sygnał dwufazowy A/B styków enkodera na sygnał indeksu Up/Down sterujący regulatorem poziomu. Dodatkowe bloki Interface Read/Write służą do zapisu/odczytu aktualnych parametrów do pamięci EEPROM, zapewniając „podtrzymanie” parametru po wyłączeniu (Interface write) i ponownym włączeniu zasilania (Interface read). Kroki regulacji określone zostają tablicą regulatora. Podobnie jak poprzednio, tablica może zostać stworzona w zewnętrznym programie i wczytana do bloku (rysunek 20). Po każdej zmianie należy zaktualizować wartość przyciskiem Update. Regulacja za pomocą tablicy pozwala na uzyskanie różnych charakterystyk regulacji w zależności od wartości poszczególnych kroków.

Rysunek 20. Tablica sterująca regulatorem poziomu

Ostatnim elementem toru audio jest blok wyciszania. Ze względu na brak odpowiedniego bloku przystosowanego do sterowania sygnałem zewnętrznym, trzeba wspomagać się różnymi równoważnymi rozwiązaniami, np. mnożeniem sygnału przez wartość 0 lub użyciem multiplekserów, jak to zaproponowano w przykładzie. Oba multipleksery (z uwagi na brak multipleksera stereo z płynnym narastaniem sygnału) Slew Mux1,2 sterowane są wspólnym sygnałem pochodzącym z MP2. Podobnie jak w poprzednim przypadku, sygnał sterujący podany jest przez komparator zera i negowany sprzętowo. Przy zwolnionym przycisku MP2 wybierane są wejścia audio, zaś po naciśnięciu wybierane są wejścia multipleksera, do których doprowadzono sygnał 0 z bloku stałej DC1. Taka operacja wycisza wyjścia audio.

Realizacja z użyciem multiplekserów zapewnia też mechanizm powolnego narastania sygnału podczas przełączania wejść (Slew).

Przed przetestowaniem aplikacji należy założyć zwory MP1,2,7, zaś MP3,8 przełożyć w położenie ENC. Do złącza ENC trzeba podłączyć typowy enkoder obrotowy (wyprowadzenia EA, EB, GND), np. typu ECW1J-B24.

Druga aplikacja ADAU1701_MK2_Cz4_ProjektTestowyGPIO_POT.dspproj do zmiany poziomu sygnału używa potencjometru, a dwa przyciski pozwalają na wybór charakterystyk przenoszenia filtra. Schemat aplikacji pokazano na rysunku 21.

Rysunek 21. Schemat aplikacji ADAU1701_MK2_Cz4_ProjektTestowyGPIO_POT.dspproj

Tor sygnałowy – podobnie jak w poprzedniej aplikacji – jest bardzo prosty. Sygnał z wejścia trafia do bloku konfigurowalnych filtrów General 2nd Order Index Selectable z biblioteki Filters, o wybieranej indeksem charakterystyce przenoszenia. Filtr skonfigurowany jest do wyboru czterech charakterystyk, zgodnie z rysunkiem 22. Następnie sygnał trafia do bloku regulacji poziomu, a stąd do wyjść przetwornika D/A. Pozostałe bloki pełnią funkcje identyczne jak w projekcie z enkoderem: dioda MP1 sygnalizuje aktywność DSP, dioda MP7 – obecność sygnału audio.

Rysunek 22. Konfiguracja filtru ISF1

Do wyboru charakterystyki filtru służą przyciski połączone do wyprowadzeń MP2,9. Ich naciśnięcia indeksują tablicę bloku UpDownLUT. Przyciski działają w trybie Up/Down, bez cykliczności, tzn. niezależnie od liczby naciśnięć indeksowanie zatrzyma się na minimalnej (0) lub maksymalnej wartości (3). Wybór aktualnej charakterystyki filtru indeksowany w przykładzie liczbami od 0...3 określa wartość liczbowa całkowita w formacie (28.0), jednakże w tabeli bloku Up/DownLUT1 z rysunku 23 należy wpisać wartości w formacie dziesiętnym (5.23), co wymaga przeliczenia: n5.23=n28.0×2–23.

Rysunek 23. Tablica sterowania wyborem filtru ISF1

Stąd nieco nieintuicyjne – na pierwszy rzut oka – wartości. Wszystkie dane audio i większość parametrów są reprezentowane w DSP przy użyciu formatu dziesiętnego (5.23), zaś przeważająca liczba sygnałów związanych z interfejsem GPIO jest reprezentowana w formacie całkowitym (28.0), co podyktowane jest większym zakresem dopuszczalnych przyjmowanych wartości. W tabeli wartość indeksu jest reprezentowana w formacie całkowitym 28.0, podczas gdy dane wyjściowe mają format dziesiętny 5.23. Wprowadza to nieco zamieszania i na początku pracy z DSP jest częstą przyczyną problemów przy uruchamianiu aplikacji, gdyż część sterowanych zewnętrznie bloków akceptuje dane bezpośrednio w formacie 28.0 z interfejsu GPIO, a część wymaga przeliczenia do formatu 5.23. Dla „ułatwienia” kompilator nie ostrzega o niezgodnych formatach danych sterujących, więc poszukiwanie przyczyny nieprawidłowego (lub całkowitego braku) działania aplikacji bywa czasochłonne. W przypadku generowania danych w arkuszu kalkulacyjnym należy zwrócić szczególną uwagę na separator dziesiętny, który musi być kropką, a nie przecinkiem – inaczej dane zostaną zaimportowane bez ostrzeżenia, ale wartości nie będą prawidłowo sterowały blokami. Zawsze przy wczytywaniu danych z pliku do tabeli warto zweryfikować jej zawartość.

Blok regulatora poziomu sterowany jest bezpośrednio danymi z przetwornika A/D (ADC3) skojarzonego z wyprowadzeniem MP8. Po skompilowaniu i załadowaniu aplikacji, przyciskami MP2,9 wybieramy charakterystykę filtru, a potencjometrem RV2 regulujemy poziom sygnału.

Obie opisane w tym odcinku kursu aplikacje są wprowadzeniem do samodzielnego wykorzystania możliwości sterowania pracą DSP za pomocą interfejsu GPIO. Podczas tworzenia własnej aplikacji każdy z bloków sterowanych sygnałem zewnętrznym wymaga sprawdzenia zakresu i typu zmiennej sterującej. Po sprawdzeniu formatu należy opracować element pośredni, odpowiadający za prawidłowe sterowanie z GPIO.

Warto zapoznać się z notą aplikacyjną AN-951, opisującą w szerszym zakresie typowe aplikacje implementujące sterowanie GPIO oraz sięgać do pomocy programu i opisu bloków dostępnych pod adresami:

Procesor ADAU1701 używa znormalizowanego formatu liczb A,B, gdzie A liczba bitów części całkowitej po lewej stronie przecinka, B liczba bitów części ułamkowej po prawej stronie. Wymiana danych z rdzeniem DSP jest 24-bitowa, a 4 dodatkowe bity są dodawane dla zwiększenia marginesu przesterowania (headroom). Kolejne 4 bity służą do utworzenia pełnych 4 bajtów (32 bity). W DSP 28 bitów może być wykorzystane w różny sposób, np. sygnał audio jest praktycznie zawsze reprezentowany w formacie dziesiętnym 5.23 (czasem okrojonym do 5.19), a sygnały sterujące w formacie całkowitym 28.0.

Przykładowa reprezentacja liczb dziesiętnych (ujemne są przedstawiane w kodzie U2) w formacie 5.23, odpowiadającym reprezentacji binarnej:

dla liczb dodatnich:

0000 0000 0000 0000 0000 0000 0000 = 0.0
0000 0100 0000 0000 0000 0000 0000 = 0.5
0000 1000 0000 0000 0000 0000 0000 = 1.0 (0 dBfs)
..
0111 1111 1111 1111 1111 1111 1111 = (16.0 – 1 LSB)

dla liczb ujemnych (U2):

1000 0000 0000 0000 0000 0000 0000 = -16.0
..
1111 1000 0000 0000 0000 0000 0000 = -1.0
1111 1100 0000 0000 0000 0000 0000 = -0.5
1111 1111 1111 1111 1111 1111 1111 = (1 LSB poniżej 0.0)

W przypadku zapisu liczby w formacie 5.23 do portów szeregowych audio lub bezpośrednio do przetwornika DAC liczba zostanie obcięta do wartości 0 dBfs.

Przykładowa reprezentacja liczb całkowitych dodatnich (ujemne są przedstawiane w kodzie U2, ale DSP i Sigma Studio ich nie wykorzystuje) w formacie 28.0, odpowiadającym reprezentacji binarnej:

0000 0000 0000 0000 0000 0000 0000 = 0
0000 0000 0000 0000 0000 0000 0001 = 1
...
0000 1000 0000 0000 0000 0000 0000 = 8388608
0111 1111 1111 1111 1111 1111 1111 = 134217727 (227 – 1)

(maksymalna liczba dodatnia 28.0)

Gdy konieczne jest przeliczenie pomiędzy formatami, można zastosować wzory:

n5.23 = n28.0×2–23, n28.0 = n5.23×223

Po tych drobnych kwestiach formalnych, niezbędnych przy tworzeniu własnych aplikacji, zapraszamy już teraz do lektury kolejnej części kursu.

Adam Tatuś, EP

Artykuł ukazał się w
Elektronika Praktyczna
czerwiec 2025
DO POBRANIA
Materiały dodatkowe
Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik listopad 2025

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio listopad - grudzień 2025

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka, Podzespoły, Aplikacje listopad - grudzień 2025

Automatyka, Podzespoły, Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna listopad 2025

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich grudzień 2025

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów