Znana tajwańska firma C-Media ma w swojej ofercie układy pozwalające na samodzielne zbudowanie karty audio z interfejsem USB. Układ CM119 pochodzący z rodziny USB2.0 FULL SPEED AUDIO charakteryzuje się wysokim stopniem integracji. Zawiera 16-bitowe przetworniki DAC i ADC, co pozwala zbudować w pełni funkcjonalną kartę 2.1 (wyjście stereo + wejście mikrofonowe). Wydajność prądowa wyjść jest wystarczająca do bezpośredniego połączenia słuchawek o niskiej impedancji rzędu 32 omów. Systemy operacyjne Windows automatycznie rozpoznają i instalują kartę jako urządzenie „C-Media USB Audio Device” oraz „Urządzenie interfejsu HID” (funkcja regulacji głośności).
Opis układu
Schemat karty audio pokazany jest na rysunku 1, a fotografie 1 i 2 przedstawiają wygląd obydwu stron płytki. Karta wykorzystuje zmodyfikowany fabryczny schemat aplikacyjny układu. Zasilanie karty pobierane jest z gniazda USB poprzez filtr ograniczający przenikanie zakłóceń. Zasilanie części analogowej od cyfrowej oddziela kolejny filtr LC. Karta wyposażona została w standardowe gniazda: JACK 3,5mm jako wyjście i JACK 2,5mm jako gniazdo mikrofonowe. Wejście mikrofonowe ma układ polaryzacji wymagany do zasilania najpopularniejszych mikrofonów elektretowych.
Wydajność prądową wejścia ustala rezystor R9, za pomocą którego wejście mikrofonowe podciągane jest do napięcia około 4,6V. Elementy L3 i C11 mają na celu uodpornić wejście na zakłócenia, które w pobliżu PC mogą indukować się w przewodzie mikrofonu.
Element S1 opisany jako „impulsator wychyłowy” wykorzystywany jest do regulacji głośności oraz szybkiego wyciszenia. System operacyjny rozpoznaje i instaluje układ CM119 dwojako: jako urządzenie audio oraz jako kontroler HID. Jest to bardzo wygodna funkcjonalność, dzięki której z „poziomu” karty możliwe jest sterowanie suwakiem głośności w komputerze. Karta ma dwie diody sygnalizujące stan pracy. Zielona dioda LED zaświeca się po podłączeniu karty do USB, a miga podczas odtwarzania audio. Czerwona dioda LED sygnalizuje stan wejścia mikrofonowego; świeci, gdy wejście jest aktywne i gaśnie w chwili wyciszenia wejścia.
Tabela 1 pokazuje inne możliwe konfiguracje układu, które wybiera się stanem logicznym na odpowiednich wyprowadzeniach.
Montaż i uruchomienie
Montaż karty należy rozpocząć od układu CM119. Jest to jedyny układ scalony karty. Przylutowanie tego układu wymaga dużej dokładności, ponieważ został zamknięty w obudowie LQFP48, która przy takich samych rozmiarach jakie ma np. ATmega8 ma dużo gęstszy raster wyprowadzeń. W zależności od praktykowanej szkoły, układ U1 zalutować można lutownicą na gorące powietrze lub grotem minifala, odciągając nadmiar cyny plecionką. Następnie należy przylutować drobne elementy SMD, a montaż zakończyć na gniazdach jack i USB. Płytka karty audio została przygotowana do zamknięcia w obudowie ABS-9. Jest to typowa obudowa pilotów do bram. W obudowie wymagane jest wypiłowanie otworów pod gniazda jack, po przeciwnej stronie na impulsator, a na jednym z krótszych boków obudowy prostokątnego otworu na gniazdo USB. Płytka powinna wchodzić do obudowy na wcisk.
Układ nie wymaga uruchamiania. Po zmontowaniu i przejrzeniu zwarć umieszczamy kartę w gnieździe USB. Poprawnie zmontowany układ zostanie automatycznie zainstalowany w systemie i zgłosi swoją gotowość do pracy poprzez zaświecenie się zielonej diody LED.
Historia projektu
Poza oczywistym wykorzystaniem karty do odtwarzania dźwięków systemowych, muzyki oraz rozmów np. na Skypie, elektronik może za jej pomocą wzbogacić swój warsztat. Nie było to wcale takie pewne, że elektronikowi przydadzą się aplikacje znalezione w sieci. Postanowiłem więc napisać własny program pomiarowy. W pierwszej kolejności w Visual Express. Niestety był to ślepy zaułek. Często pojawiający się komunikat z rysunku 2 sprawił, że projekt został mianowany do rangi półkownika – trafił na najwyższą półkę, czekając na lepsze czasy...
Z ratunkiem przyszedł Borland C++ Builder 6 oraz pakiet AudoLab dostępny na stronie https://mitov.com/products/audiolab#overview (dostępny też w Elportalu wśród materiałów dodatkowych do tego numeru). To genialny pakiet komponentów umożliwiający pisanie całkiem poważnych aplikacji. Modułowy trend, który aktualnie obserwujemy w elektronice, zagościł kilkanaście lat wcześniej w środowiskach programistycznych.
Wystarczy spojrzeć na rysunek 3 oraz dostępny w Elportalu wśród materiałów dodatkowych do tego numeru listing 1, aby przekonać się, jak niewiele kodu potrzeba do napisania generatora audio. Moja aplikacja (AudioGen) w rersji .EXE oraz w wersji z kodami źródłowymi dostępna jest w Elportalu.
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "ALAudioOut"
#pragma link "ALAudioToReal"
#pragma link "ALCommonGen"
#pragma link "ALSignalGen"
#pragma link "SLScope"
#pragma link "ALCommonSplitter"
#pragma link "SLCommonGen"
#pragma link "SLSignalGen"
#pragma link "SLRandomGen"
#pragma link "ALGaussGen"
#pragma link "ALRandomGen"
#pragma link "ALAudioMixer"
#pragma link "ALMultiInput"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RadioButton1Click(TObject *Sender)
{
ALRandomGen->Stop();
ALSignalGen->SignalType = atTone;
ALSignalGen->Start();
TrackBarFreq->Visible=1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RadioButton2Click(TObject *Sender)
{
ALRandomGen->Stop();
ALSignalGen->SignalType = atTriangle;
ALSignalGen->Start();
TrackBarFreq->Visible=1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RadioButton3Click(TObject *Sender)
{
ALRandomGen->Stop();
ALSignalGen->SignalType = atSquare;
ALSignalGen->Start();
TrackBarFreq->Visible=1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RadioButton4Click(TObject *Sender)
{
ALRandomGen->Stop();
ALSignalGen->SignalType = atSawToothUp;
ALSignalGen->Start();
TrackBarFreq->Visible=1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RadioButton5Click(TObject *Sender)
{
ALSignalGen->Stop();
ALRandomGen->Start();
TrackBarFreq->Visible=0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrackBarFreqChange(TObject *Sender)
{
ALSignalGen->Frequency = TrackBarFreq->Position;
LabeledEditHz->Text = TrackBarFreq->Position;
// ALRandomGen->Seed = TrackBarFreq->Position;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrackBarAmpChange(TObject *Sender)
{
ALSignalGen->Amplitude = TrackBarAmp->Position;
LabeledEditAmp->Text = TrackBarAmp->Position;
ALAudioMixer->Channels->Items[1]->Coeficient=(float)(TrackBarAmp->Position)/11000;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
ALSignalGen->Stop();
ALRandomGen->Stop();
LabeledEditHz->Text = TrackBarFreq->Position;
LabeledEditAmp->Text = TrackBarAmp->Position;
ALAudioOut1->Enabled=1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::LabeledEditHzKeyPress(TObject *Sender, char &Key)
{
TrackBarFreq->Position=LabeledEditHz->Text.ToInt();
}
//---------------------------------------------------------------------------
Niestety generator ten to jedyna aplikacja, która nadaje się do szerszego udostępnienia. Próba napisania charakterografu – wobuloskopu zakończyła się fiaskiem. Przebiegi generowane już dla prostych obwodów typu RC miały kształt daleki od oczekiwanych i co gorsza, zależały od systemu i jednostki, na której uruchamiany był program. To na dobre opóźniło prace nad projektem. Ostatecznie po konsultacjach z Redakcją i Czytelnikami zostało uzgodnione, że materiał będzie opublikowany w takiej właśnie postaci, ponieważ EdW to pismo dla elektroników, a nie programistów. Poza tym wszelkie funkcje, które miał mieć program, ma już pakiet REW (opisywany niedawno w EdW). Z mojego doświadczenia warto jednak wyciągnąć wnioski i pobrać aktualnie już darmowy kompilator C++ Builder np. ze strony: https://download.komputerswiat.pl/programowanie/srodowiska-programistyczne/borland-cplusplus-builder-6-personal.
W jednym z następnych planowanych projektów okaże się, jak prosto pisze się teraz obsługę portu szeregowego COM. (Szaleństwem może wydawać się proponowanie leciwego kompilatora, ale potrzebuje on zaledwie kilkaset MB, gdy np.VisualStudio 2019 zajmuje 32GB).
Testy
W celu sprawdzenia jakości dźwięku odtwarzanego przez samodzielnie zbudowaną kartę jej parametry zmierzone zostały programem RightMark 6. Układ CM119 zawiera „zaledwie” 16-bitowy DAC. Teoretycznie taka rozdzielczość powinna zapewnić dynamikę na poziomie 96dB. Parametry deklarowane przez producenta widzimy w tabeli 2.
W rzeczywistości karta okazała się nieco gorsza, co zresztą nie jest żadnym zaskoczeniem. Wynik z programu RightMark przedstawia tabela 3 (pełny raport zawarty jest w Elportalu).
Co to oznacza? Uzyskane wyniki na pewno nie dyskwalifikują karty. Nie przekreślają możliwości użycia jej do odtwarzania audio, ale oczywiście taka prosta karta DIY wyraźnie odstaje od np. SoundBlaster Live 24bit – tabela 4.
W tym momencie zachęcam do spojrzenia na fotografie 3 i 4, gdzie widzimy dwie inne karty USB audio własnej produkcji.
Po lewej poprzedniczkę opisywanej konstrukcji, również zawierającą układ C-Media. Konstrukcja ta okazała się kiepska.
Wyniki zawarte w tabeli 5 nie pokazują wszystkich szczegółów. W tej wersji chaotyczne rozłożenie elementów skutkowało przesłuchami transmisji cyfrowej do toru audio, które objawiało się np. terkotaniem w głośnikach podczas zmiany głośności. W widocznej na środku (tutaj opisywanej) karcie elementy zostały uporządkowane, dodano kilka kondensatorów odsprzęgających, a tor analogowy oblany został obszarem masy na wzór konstrukcji RF. Zmniejszyło to impedancję masy i zauważalnie poprawiło parametry karty.
W połowie roku 2020 otrzymałem karton z elektroniką do odzysku. Tam wyszukałem perełkę; oryginalny układ PCM2702 produkcji owianej legendą firmy Burr-Brown. Na bazie tak odzyskanego układu powstała karta widoczna po prawej stronie fotografii 3 i 4, której schemat pokazany jest na rysunku 4.
Karta ta bazuje na kicie AVT5088, którego schemat został dostosowany do mniejszej obudowy i elementów z serii E24. Różnice są niewielkie, można je prześledzić na rysunkach 5 i 6 lub po prostu załadować dostępną w Elportalu symulację „filtr_LP.TSC” do programu Tina. Oczekiwania wobec tej nowej karty były ogromne. Przede wszystkim związane z legendarną firmą.
Po drugie układ nie ma toru mikrofonowego, wbudowanych stabilizatorów, a charakterystykę wyjściową kształtuje zaprojektowany samodzielnie filtr LP. Do tego do odsłuchów wypożyczone zostały referencyjne słuchawki HD600 firmy Sennheiser. Niestety, po raz kolejny okazało się, że wyniki nie potwierdzają obiegowych opinii. Powiem tak: piana bita przez lata przez audiofilów jest...pusta w środku. Owszem karta zagrała czysto, ale jednocześnie zwyczajnie, żeby nie napisać przeciętnie. Zaczęło się poszukiwanie Yeti.
Na pierwszy ogień poszedł wzmacniacz operacyjny: zamiast TLC272 zamontowany został NJM4556A, chwalony za „ocieplanie dźwięku” i stosowany chociażby na wyjściu karty SB24bit Live. Układ NJM4556A ze względu na dużą wydajność prądową można uznać za mały wzmacniacz mocy klasy AB. Wymiana na ten układ poprawiła odtwarzanie basów i faktycznie nieco „ocieplił dźwięk”. Następnie zamontowany został OPA2350 – prawdziwy Hi-End. THD na poziomie 0,0006% oraz liczne zastosowania w konstrukcjach audio z najwyższej półki. Dźwięk faktycznie nabrał szczegółów i poprawiło się odtwarzanie sopranów, zapewne dzięki dużej szybkości wzmacniacza. Porównanie wspomnianych trzech wzmacniaczy zawiera tabela 6.
Zachęcam do podobnych eksperymentów!
A na koniec chciałbym podziękować Redakcji i Czytelnikom, który wspierali projekt.