Stereofoniczne sygnał analogowy w mikrokomputerze Raspberry Pi jest pobierany bezpośrednio z wyjść PWM0 i PWM1 procesora BCM2835. Zastosowanie karty USB Audio DAC znacznie poprawia jakość wyjściowego analogowego sygnału dźwięku i umożliwia jego transmisję w standardzie S/PDIF.
W ofercie układów audio produkowanych przez firmę Texsas Instruments jest grupa "Stereo Audio DAC with USB Interface". Są to układy typu PCM2704C, PCM2705C, PCM2706C oraz PCM2707C.
Układy PCM2704C i PCM2705C są kompatybilne pod względem rozmieszczenia wyprowadzeń. Podobnie jest w przypadku układów PCM2706C i PCM2707C. Na mojej płytce drukowanej można wlutować układ PCM2706C albo PCM2707C. Układy te są obsługiwane za pomocą klasy HID (Human Interface Device). Klasa urządzeń HID obejmuje takie urządzenia jak: klawiatury, myszki, przełączniki, joysticki, czytniki kodów kreskowych, termometry i wiele innych układów wejściowych i wyjściowych.
Układ PCM2706C umożliwia wykorzystanie trzech (opcjonalnie nawet siedmiu) należących do klasy HID przycisków: Volume+, Volume oraz Mute (ewentualnie również: Next Track, Previous Track, Stop oraz Play). Systemy Windows powinny rozpoznać podłączone urządzenie klasy HID i automatycznie zainstalować potrzebne sterowniki.
Bez potrzeby instalacji dodatkowego oprogramowania w systemach Windows (sprawdziłem w XP, 7) automatycznie jest instalowane oprogramowanie dla przetwornika DAC (odsługujące S/PDIF Out). Układ PCM2706C jest również rozpoznawany w systemach Linux. Układ ten znajduje się także na liście kompatybilnych z Raspberry Pi przetworników DAC.
Jakość dźwięku dostępnego na wyjściu Raspberry Pi nie jest najlepsza. Napięcie zasilania procesora jest jednocześnie napięciem odniesienia dla wytwarzanych sygnałów audio, więc w pewnych okolicznościach może występować słyszalny przydźwięk sieciowy i/lub dodatkowe "brzęczenie" spowodowane zmianami napięcia podczas odczytu danych z pamięci USB. Wyjścia PWM0 i PWM1 wyposażone są tylko w proste filtry dolnoprzepustowe pierwszego rzędu. Raspberry Pi nie ma też cyfrowego interfejsu S/PDIF.
Opisywany moduł można również dołączyć do laptopa lub komputera stacjonarnego w charakterze "lepszej" karty dźwiękowej. Jej dodatkową zaletą jest możliwość pozbycia się różnych zaburzeń na wyjściach analogowych często występujących na płytach głównych komputerów ze zintegrowanymi kartami.
Układy scalone PCM2706C i PCM2707C
Schemat blokowy układów PCM2706/ PCM2707 pokazano na rysunku 1. Są one wyposażone w wewnętrzny stabilizator napięcia 3,3 V, który zasila wewnętrzne bloki funkcjonalne układów PCM2706C/07C. Linie D+ i D- przez interfejs USB SIE komunikują się z blokiem USB Protocol Controller.
Jest on odpowiedzialny za transmisję danych do przetwornika C/A i enkodera S/PDIF oraz opcjonalnie do bloku I²S. W strukturze układu scalonego umieszczono również blok generatora kwarcowego 12 MHz. Jego sygnał jest mnożony przez 8 przy użyciu pętli PLL i następnie taktuje blok interfejsu USB oraz generator PLL przetwornika C/A.
Na schemacie blokowym układów PCM2706/PCM2707 (rys. 1) elementy występujące tyko w układzie typu PCM2706C oznaczono (1), a elementy występujące tylko w układzie typu PCM2707C oznaczono (2). W układzie typu PCM2706C jest możliwy odczyt trzech (opcjonalnie siedmiu) przycisków - wejścia HID0, HID1 i HID2 (opcjonalnie również FUNC0...3).
Mogą one pracować jako przyciski Volume+, Volume- i Mute (opcjonalnie FUNC0...3 mogą pracować jako Next Track, Previous Track, Stop, Play). W prototypie nie zamontowałem żadnych przycisków, ale jest to możliwe. Układ typu PCM2707C nie pozwala na dołączenie przycisków sterujących, ma natomiast szeregowy interfejs do sterowania przez zewnętrzny procesor. Układ PCM2706C jest wytwarzany w obudowie TQFP32.
Dodatkowego omówienia wymaga blok interfejsu I²S. Używa on 5 sygnałów: DIN, SYSCK (MCLK), BCK (BCLK), LRCK (LRCLK) oraz DOUT. Interfejs ten pracuje w formacie 16-bitowym I²S (MSB danych opóźniony o 1 bit).
Blok interfejsu I²S jest uruchamiany jeśli na wejściu FSEL zostanie podane logiczne "0". Wtedy na wyjściu DOUT pojawiają się dane (16-bitowe próbki audio), a na wyjściach FUNC0...2 sygnały taktujące, odpowiednio: LRCK (LRCLK), BCK (BCLK), SYSCK (MCLK). Wewnętrzny przetwornik C/A zostaje odłączony od strumienia danych z interfejsu USB, a dane (16-bitowe próbki audio) dla przetwornika C/A są czytane z wejścia DIN (wyprowadzenie FUNC3).
Umożliwia to współpracę przez interfejs I²S z zewnętrznym procesorem DSP np. typu TAS300x. Możliwe jest również dołączenie do interfejsu I²S zewnętrznego przetwornika C/A o jeszcze lepszych parametrach, niż wbudowany w układ. Dołączając zewnętrzny przetwornik C/A najlepiej wyjście DOUT połączyć z wejściem DIN - zapewnimy sobie w ten sposób obsługę również wewnętrznego przetwornika C/A.
Jeśli na wejście FSEL zostanie podana logiczna "1", to na wyjściu DOUT pojawi się przebieg cyfrowy S/PDIF. W tym trybie pracy układów PCM2706C/07C wyprowadzenia HID0...2 i FUNC0...3 pełnią funkcje opisane wcześniej.
Karta USB Audio DAC
Po dołączeniu przez kabel USB do komputera moduł bez problemu instaluje się jako "USB Audio DAC" (rysunek 3). Po zainstalowaniu karta ma (Windows XP, Linux) jedno wyjście "Głośniki USB Audio DAC" z możliwością programowej regulacji poziomu głośności, jednak fizycznie układ PCM2706C (względnie PCM2707C) ma dwa wyjścia - stereofoniczne analogowe oraz cyfrowe S/PDIF.
Regulacja poziomu wyjściowego dotyczy tylko wyjścia analogowego. Wyjście SPDIF pracuje zawsze z pełnym wysterowaniem. Przez wyjście S/PDIF mojej karty nie można przesyłać danych skompresowanych (AC3 lub DTS). W systemach Windows sygnały wyjściowe pojawiają się jednocześnie na wyjściach analogowych i cyfrowym. W systemach Linux nie zawsze tak jest. W "Raspbmc" jest obsługiwane tylko wyjście analogowe układu PCM2706C (PCM2707C).
Karta USB AUDIO DAC jest wykrywana również przez Raspberry Pi. W systemie "Raspbian" może być potrzebna modyfikacja zbioru /etc/modprobe.d/alsa-base.conf. Poniżej podaje ostatnie linie zbioru /etc/ modprobe.d/alsa-base.conf zmodyfikowane tak aby aby karta USB miała wyższy priorytet niż "karta" procesora BCM2835. Niezbędne modyfikacje pokazano na listingu 1. Najważniejsze są zmiany wykonane w liniach 2, 4 oraz ostatniej.
Po zmianach w zbiorze konfiguracyjnym karta jest obsługiwana przez programy "play", "mplayer", "mocp" itd. W systemie "Raspbian" zainstalowanym na "Raspberry Pi" pojawia się cyfrowy dźwięk na wyjściu S/PDIF. Udało mi się również włączyć moją kartę w systemie "Raspbmc". W "Raspbmc" należy w ustawieniach System/Audio output zaznaczyć opcję Dual audio output (rysunek 4). Wyjście Audio output najlepiej ustawić wtedy na HDMI a Speaker Cofiguration na 2.0.
Schemat ideowy karty pokazano na rysunku 5. Głównym elementem karty dźwiękowej jest układ scalony U1 typu PCM2706C (lub PCM2707C). Aby uzyskać lepszą funkcjonalność karty dodałem kilka dodatkowych elementów. Układ scalony PCM2706C pracuje w typowej konfiguracji Bus Powered. Wyjściowe sygnały audio VOUTL i VOUTR zostały doprowadzone wprost do gniazda wyjściowego JOUT typu Jack stereofoniczny 3,5 mm.
Dla obciążenia równego lub większego od 10 kV zniekształcenia nieliniowe na tych wyjściach nie powinny przekraczać 0,006%. Aby zmniejszyć ewentualne zafalowania charakterystyki przenoszenia związane z obciążeniem pojemnościowym (pojemność dołączonych kabli) dodałem szeregowo w wyjściami rezystory RML i RMR o wartości 56 Ω. Wartość ich rezystancji można ewentualnie zmniejszyć do 33 Ω.
Kondensatory ceramiczne C9L i C9R odcinają składową stałą występującą na wyjściach VOUTR i VOUTL. Jeśli przewidujemy podłączenie do gniazda JOUT słuchawek o impedancji 30 Ω, można zwiększyć pojemność tych kondensatorów do 100 µF. Elementy CL1, CR1, RL1...RL4 oraz RR1...RR4 zostały dodane zgodnie z notą katalogową układu scalonego PCM2706C.
Układ scalony PCM2706C ma wyprowadzenie SSPND (nóżka 11). Po podłączeniu karty do portu USB (przez złącze J2) napięcie magistrali USB VBUS zasila tylko układ U1(PCM2706C), a na wyjściu SSPND występuje logiczne "0". Komputer nadrzędny (Host) inicjuje proces enumeracji urządzenia USB. Gdy proces ten zakończy się pomyślnie na nóżce SSPND zostaje ustawiona.
Powoduje to wysterowanie tranzystora T1 i uruchomienie prostego stabilizatora zbudowanego na tranzystorach T2 i T3. Na kolektorze tranzystora T3 pojawi się napięcie VCC zasilające pozostałe bloki karty. Dioda L1 święci się dopiero po prawidłowym rozpoznaniu karty przez komputer nadrzędny. Port USB może mieć podłączoną pojemność nie większą niż 2,2 µF. Dlatego kondensator CU2 ma pojemność tylko 1 µF, a kondensator C22 - 470 nF. Kondensatory CU1..CU4 o pojemności 1 µF filtrują wewnętrzne napięcia zasilania układu PCM2706C.
Na karcie zamontowano cyfrowe wyjścia sygnału S/PDIF. Wyjście optyczne obsługuje nadajnik TOO (TOTX147PL). Wejściowy sygnał dla tego elementu to SPDIF_DO. Wyjście SPDIF COAXIAL jest buforowane przez 2 bramki U9C i U9D. Wyjście z bramki U6C zawiera rezystory RO1 (120 V) i R114 (200 V). Zapewniają one impedancję wyjściową zbliżoną do 75 omów.
Poziomy na wyjściach sygnalizują diody LED (tabela 1). Sygnały S/PDIF mają częstotliwość od 2 do 3 MHz (zależnie od liczby transmitowanych "1" w sygnale). Dioda L1 sygnalizuje obecność przebiegu S/PDIF na wyjściu DOUT układu PCM2706C. Dioda ta jest sterowana z wyjścia uniwibratora zbudowanego na bramkach U9A i U9B. Uniwibrator zwiększa szerokość impulsów sterujących diodą L2 do około 1 ms.
Dla wyjść analogowych zbudowałem na tranzystorach T4 i T5 proste źródła prądowe sterowane ujemnymi połówkami sygnałów sinusoidalnych. Pary tranzystorów sterują dwukolorową diodę LED (L3). Dla sygnału z lewego kanału świeci się dioda zielona, dla sygnału z prawego kanału świeci się dioda czerwona. Jeśli obecne są sygnały w obydwu kanałach diody te świecą kolorem wypadkowym zbliżonym do żółtego.
Na płytce drukowaniej umiesciłem otwory pod goldpiny KEY i dla ewentualnych przycisków Volume+, Volume- oraz Mute. Podanie logicznej "1" na dane wejście odczytywane jest jako naciśniecie przycisku. Podobnie można wykorzystać otwory pod goldpiny I²S. Dla zwartych pinów 1 i 2 zworki Z2 (FS) przyciski Next Track, Previous Track, Stop oraz Play dołączamy odpowiednio do pinów LRCK, BCLK, MCLK, DIN. Przyciski obsługiwane są tylko przez układ scalony typu PCM2706C.
Dla zwartych pinów 2 i 3 zworki Z2 (FS) układy scalone PCM2706C/07C wykorzystują piny SPDIF_DO, MCLK, BCLK, LRCK, DIN jako magistrali I²S. Sposób wykorzystania tej magistrali może być różny (wspominałem o tym wcześniej). Po szczegóły odsyłam do noty katalogowej PCM2704C_2705C_2706C_2707C.pdf. Osobiście sprawdziłem, że w tym trybie pracy połączenie wyjścia SPDIF_DO z wejściem DIN powoduje odtwarzanie dźwięku na wyjściach analogowych (przez wewnętrzny przetwornik DAC układów PCM2706C/07C).
Wykaz elementówRezystory: (SMD 0805) Kondensatory: (SMD 0805) Półprzewodniki: Inne: |
Montaż i uruchomienie
Schemat montażowy karty muzycznej pokazano na rysunku 6. Montaż elementów najlepiej rozpocząć od wlutowania układu U1 typu PCM2706C. Układ ten umieszczono w obudowie TQFP32 o rozstawie nóżek równym 0.8 mm. Po wlutowaniu tego elementu należy sprawdzić czy nie wystąpiły zwarcia miedzy wyprowadzeniami. W miejsce układu U1 można ewentualnie wlutować układ typu PCM2907C.
Układy te maja identyczne rozmieszczenie wyprowadzeń i mają takie same bloki funkcjonalne. Po wlutowaniu układu U1 proponuję wlutować kondensatory CU1...CU4 oraz C22, rezystory R20...R22 oraz złącze micro USB (J2). Należy również wlutować kwarc 12 MHz, kondensatory C96 i C97 (12 pF) oraz rezystor RX1 (1 MV). Po wlutowaniu tych elementów można dołączyć płytkę za pomocą kabla USB do komputera.
Komputer powinien wykryć kartę i zainstalować sterowniki dla USB Audio DAC. Jeśli karta zostanie wykryta, to proponuję wlutować tranzystory T1...T3 wraz z elementami bezpośrednio z nimi związanymi. Warto również wlutować diodę LED L1. Po ich zamontowaniu każde dołączenie karty do komputera powinno spowodować zaświecenie się diody L1.
Następnie montujemy elementy kondensatory CL1, CR1, rezystory RL1...RL4, RR1...RR4 oraz złącze JOUT. Należy połączyć piny 1 i 2 zworki Z2 (FS) ustawiając w ten sposób "normalny" tryb pracy układu PCM2706C/07C. Po wlutowaniu tych elementów można dołączyć do złącza JOUT słuchawki. Pozwolą one na sprawdzenie poprawność działania wyjścia analogowego karty.
Odsłuchiwany dźwięk powinien być czysty, bez zniekształceń. W następnym kroku przylutowujemy układ scalony U9 (74LV00 lub 74LVC00), rezystory i kondensatorami wokół niego. Teraz montujemy elementy interfejsów cyfrowych S/PDIF: złącze JO i nadajnik TOO (TOTX-147PL). Interfejsy te najłatwiej sprawdzić przez dołączenie ich do wejść amplitunera kina domowego. W kolejnym kroku należy wlutować podwójną diodę LED L3 i tranzystory T4, T5 oraz elementy bierne współpracujące z nimi.
Płytkę drukowaną umieściłem w czarnej plastikowej obudowie (po elementach elektronicznych) o wymiarach około 58 mm×41 mm×17,5 mm (fotografia 6 i fotografia 7). Rysunek, na którym zwymiarowano otworowanie obudowy pokazano na rysunku 8.
Zbyszko Przybył
zbyszekjob@interia.pl