- regulator poziomu zrealizowany na znanym i od wielu lat produkowanym układzie PGA2320 firmy Texas Instruments,
- aktywny układ regulacji tonów niskich i tonów wysokich z możliwością jego całkowitego ominięcia (bypass),
- selektor wejść z 3 wejściami stereofonicznymi przełączanymi miniaturowymi przekaźnikami sygnałowymi,
- zbudowany na bazie wzmacniaczy operacyjnych zoptymalizowanych do zastosowań audio,
- zawiera przetwornik cyfrowo-analogowy na bazie stosunkowo taniego i bardzo dobrego układu PCM1794A.
Obsługa i program sterujący
Obsługa przedwzmacniacza jest bardzo prosta. Wszystkie niezbędne informacje są wyświetlane na ekranie sterownika - fotografia tytułowa. Ekran został podzielony na 2 obszary: pierwszy większy zawiera informacje o tłumieniu/wzmocnieniu sygnału - Volume (w dB), przez układ PGA2320. Drugi obszar wyświetla informacje o stanie układu pomijania filtra barwy tonu - Bypass (włączony/wyłączony), oraz o aktywnym wejściu analogowym InputA.
Kręcenie osią enkodera w prawo powoduje zmniejszanie tłumienia, a po przejściu przez zero - zwiększanie wzmocnienia. Kręcenie w lewo powoduje zwiększanie tłumienia lub zmniejszanie wzmocnienia. Krótkie przyciśnięcie i puszczenie osi enkodera sekwencyjnie zmienia aktywne wejście selektora IN1 -> IN2 -> DAC. Dłuższe przyciśnięcie i puszczenie osi enkodera (kilka sekund) sekwencyjnie włącza i wyłącza układ Bypass. Kiedy Bypass jest w pozycji ON, to filtr barwy tonu jest wyłączony z toru sygnałowego.
W obecnej wersji programu nie ma zaimplementowanej obsługi zdalnego sterowania. Jednak układ jest na to przygotowany sprzętowo i w planach jest wykonanie takiej wersji.
Program sterujący
Program sterujący został napisany w języku C w środowisku MPLAB X IDE. Użyłem bezpłatnej wersji kompilatora MPLAB XC8 przeznaczonego dla 8-bitowych mikrokontrolerów firmy Microchip rodzin PIC16, PIC18 i AT. Bezpłatna wersja ma tylko ograniczenie optymalizacji rozmiaru kodu. Poza tym jest to w pełni funkcjonalny kompilator. W naszym przypadku nie ma to znaczenia, bo w użytym mikrokontrolerze pozostaje i tak prawie połowa dostępnej pamięci.
Do konfiguracji tych interfejsów, ale też portów i systemu taktowania użyłem wtyczki - konfiguratora do programu MPLAB X IDE o nawie MCC. Program używa dwu interfejsów sprzętowych: modułu transmisji szeregowej SPI (rysunek 17) do komunikacji z wyświetlaczem i modułu timera TCB1 (rysunek 18).
TCB1 zgłasza przerwanie co 1 ms. W procedurze przerwania od tego timera jest uruchamiany pracujący w tle program obsługujący odczytywanie obrotu enkodera.
Mikrokontroler jest taktowany częstotliwością 20 MHz (rysunek 19), pomimo że przy zasilaniu napięciem +3,3 V według specyfikacji producenta powinno to być maksymalnie 15 MHz. Przeprowadzone testy wykazały, że w temperaturze pokojowej mikrokontroler pracuje stabilnie przy 20 MHz. Pozwala to na płynniejsze wyświetlanie informacji na ekranie. Na pozostałe funkcje programu nie ma to wpływu.
Komunikacja z układem PGA2320 jest realizowana przez interfejs SPI z 16-bitowym słowem danych. Działanie tego interfejsu jest emulowane programowo. Maksymalna katalogowa częstotliwość zegara CLK może sięgać nieco ponad 6 MHz. Jednak pamiętamy, że w celu wyeliminowania zakłóceń generowanych przez mikrokontroler i wyświetlacz została zastosowana izolacja galwaniczna mas wykonana na transoptorach. Takie rozwiązanie znacząco ogranicza częstotliwości prawidłowo przenoszonych sygnałów cyfrowych. W praktyce zegar nie może mieć częstotliwości większej niż kilka kHz. Ponieważ ilość przesyłanych danych w czasie jest bardzo mała, to nie jest to istotne ograniczenie. W trakcie pojedynczego przestawienia tłumienia PGA2320 jest przesyłanych tylko 16 bitów - rysunek 20 (R0...R7 ustawienie kanału prawego, L0...L7 ustawienie kanału lewego).
Na listingu 1 pokazano procedurę wysyłania 16-bitowego słowa do PGA2320, a na listingu 2 przykład programowego sterowania linią SDO dla mikrokontrolera ATmega. Sterowanie pozostałymi liniami CS i SCK przebiega analogicznie.
void PGA_Ctrl (uint8_t volL, uint8_t volR) {
uint8_t i;
uint16_t volu
//16 bit do przesłania
volu = volR;
volu = (volu << 8);
volu = volu |volR;
PGA_Ctrl_SCK (LO); //SCK = 0;
PGA_Ctrl_CS (LO); //CS = 0
for(i = 0; i < 16; i++) {
PGA_Ctrl_SCK (LO); //SCK =0
//wysłanie bitu
if((volu & 0x8000) == 0)
PGA_Ctrl_SDO (LO);
else
PGA_Ctrl_SDO (HI); //SCK = 1
//kolejny bit
volu = (volu << 1);
PGA_Ctrl_SCK (HI);
}
PGA_Ctrl_CS (HI); //CS=1
PGA_Ctrl_SCK (HI); //SCK=0
PGA_Ctrl_SDO (HI); //SDO=0
}
/*sterowanie linia danych magistrali PGA*/
void PGA_Ctrl_SDO(uint8_t cmd) {
if(cmd == LO) {
PORTD.OUTCLR =(1 << SDOP);
}
else
if(cmd == HI)
PORTD.OUTSET =(1 << SDOP);
_delay_ms(1);//opóźnienie - izolacja transoptora
}
Na rysunku 21 pokazano oscylogramy rzeczywistych przebiegów na liniach - kolejno od góry: CS, SDO i SCK. Cykl przesyłania danych zaczyna się od aktywowania interfejsu przez wystawienie stanu niskiego na linii CS. W czasie, kiedy na linii SCK jest stan niski, na linii SDO jest ustawiany bit danych. Ten bit jest przesyłany do PGA2320 przy narastającym zboczu sygnału SCK.
Tłumienie/wzmocnienie układu PGA2320 jest określane według zależności:
Gain(dB)=3,15-[0,5·(255-N)]
gdzie N jest 8-bitową wartością przesyłaną do układu dla każdego z kanałów (zostało to pokazane na rysunku 20). Program operuje na wartości N z powyższej zależności, ale do wyświetlania wartości w decybelach jest wyliczana wartość Gain(dB) zapisywana w zmiennej typu float. Potem ta wartość jest konwertowana na ciąg znaków przez standardową funkcję sprintf - listing 3.
// wartość N zapisana w zmiennej vol
char txt[5];
float gain;
gain = 31.5 -(0.5*(255-vol));
sprintf(txt,”%2.1f”,gain);
Program sterujący w obecnej wersji wpisuje w trakcie regulacji do obu kanałów PGA2320 takie same wartości. Nie ma zatem możliwości realizacji funkcji balansu. W poprzednich moich przedwzmacniaczach sterowanych cyfrowo funkcja balansu był wbudowana, ale nigdy jej nie używałem. Dlatego teraz z niej zrezygnowałem. W pętli regulacji jest inkrementowana lub dekrementowana 8-bitowa zmienna odpowiadająca tłumieniu dla obu kanałów. Nowo ustawiona wartość jest zapisywana w pamięci eeprom, wyświetlana i wysyłana do układu PGA2320 - listing 4.
//volume DOWN zwiększ tłumienie
if(key == KOD_IMP_DWN) {
++vol;
if(vol == 255)
vol = 254;
//wyświetl wartość tłumienia w dB
HMI_DispVol( 5,25,vol);
//utwórz 16 bitowa wartość z dwu takich samych bajtów
volume = vol;
volume = ((vol <<8)|vol);
//zapamiętaj wartość tłumienia w eeprom
HMI_PutVolume(volume);
PGA_Ctrl (vol,vol);//wyslij do PGA
}
//volume UP zmniejsz tłumienie
if(key == KOD_IMP_UP) {
if(vol != 0) {//korekta dla wartości maksymalnej
--vol ;
if(vol == 0)
vol = 1;
}
HMI_DispVol( 5,25,vol);
volume = vol;
volume = ((vol <<8)|vol);
HMI_PutVolume(volume);
PGA_Ctrl (vol,vol);//wyslij do PGA
}
W obecnej wersji oprogramowania jest używany sygnał wyciszenia MUTE - listing 5.
void HMI_Set_Audio_Input(uint8_t input) {
PGA_Ctrl_MUTE(1);//mute on
_delay_ms(5);
if(input == 0 ) {// wybranie wejścia IN1
PORTD.OUT |= (1 << SEL1); //aktywny
PORTD.OUT &= ~(1 << SEL2);
PORTD.OUT &= ~(1 << SEL3);
}
if(input == 1 ) {// wybranie wejścia IN2
PORTD.OUT |= (1 << SEL2); //aktywny
PORTD.OUT &= ~(1 << SEL1);
PORTD.OUT &= ~(1 << SEL3);
}
if(input == 2 ) {//wybranie wyjścia DAC
PORTD.OUT |= (1 << SEL3); //aktywny
PORTD.OUT &= ~(1 << SEL1);
PORTD.OUT &= ~(1 << SEL2);
}
PGA_Ctrl_MUTE(0);//mute off
_delay_ms(50);
}
Tak jak linie interfejsu SPI również MUTE jest izolowany galwanicznie. Sterowanie wyciszaniem jest używane do eliminacji zakłóceń (stuków) w trakcie działania selektora wejść i przełączania układu BYPASS - listing 6.
void HMI_Set_Audio_Bypass(uint8_t bypass) {
PGA_Ctrl_MUTE(1);//mute on
_delay_ms(5);
if(bypass == 0)
//włącz BYPASS
PORTA.OUT |= (1 << BYPAS);
if(bypass == 1)
//wyłącz BYPASS
PORTA.OUT &= ~(1 << BYPAS);
PGA_Ctrl_MUTE(0);//mute off
_delay_ms(50);
}
Podsumowanie
Zaprezentowany przedwzmacniacz jest z założenia układem, który ma spełniać funkcję poprawnie skonstruowanego toru audio. Nie ma tu jakichś specjalnych układów: wymyślnego zasilania, lampowego konwertera w układzie przetwornika, drabinkowych "potencjometrów" czy buforów na tranzystorach FET. Za to szczególną uwagę zwrócono na poprawne dopasowanie impedancji pomiędzy poszczególnymi stopniami.
Prawidłowe działanie toru regulacji barwy wymaga, by impedancja źródła sygnału na wejściu miała niską wartość, a jego wyjście było obciążone stopniem o wysokiej impedancji wejściowej. Również układ PGA2320 wymaga, by jego wejścia były sterowane źródłem sygnału o niskiej impedancji wyjściowej. Redukuje to szumy układu i zniekształcenia nieliniowe.
Wszystkie te wymogi najłatwiej jest spełnić, korzystając z dobrych wzmacniaczy operacyjnych. W prototypie zastosowałem podwójne wzmacniacze OPA1612 zoptymalizowane do pracy w wysokiej klasy torach audio. Również w filtrze regulacji barwy pracuje układ OPA1612. W sumie w torze audio pracują trzy podwójne wzmacniacze operacyjne. Żeby wydajnie poprawić uniwersalność przedwzmacniacza, zdecydowałem się umieścić w nim kompletny przetwornik analogowo-cyfrowy z bardzo dobrym układem PCM1794A z konwerterem prąd/napięcie i filtrem analogowym, również zbudowanym na wzmacniaczach operacyjnych OPA1611 i OPA1611.
Źródłem danych przetwornika może być sygnał S/PDIF z odtwarzacza CD lub dane przesyłane po USB z komputera. Wymaga to zamontowania dodatkowego modułu USB/I²S z wyjściami zgodnymi ze standardem Amanero. Opcjonalnie można tu zamontować moduł Bluetooth 5.x audio z wyjściem I²S i używać smartfonu jako źródło sygnału. Smartfony używające kodeków Aptx_HD, LDAC itp. w połączeniu z platformami oferującymi niską kompresję danych audio potrafią być źródłem dźwięku zaskakująco dobrej jakości. Przetwornik charakteryzuje się bardzo dobrą jakością dźwięku.
Tor audio przy włączonym układzie Bypass jest raczej neutralny. Dotyczy to zarówno wejść analogowych, jak i wyjścia przetwornika cyfrowo-analogowego. Sytuacja zmienia się po wyłączeniu funkcji Bypass i tym samym włączeniu w tor regulatorów barwy. Jak wspominałem przy opisie układu filtrów, układ regulacji barwy charakteryzuje się świetnymi parametrami elektrycznymi, szczególnie jeżeli chodzi o charakterystykę fazową. Układ działa subtelnie, ale w krańcowych położeniach potencjometrów jest wyraźnie słyszalny. Jednak, jeżeli ktoś oczekuje efektów rodem ze wzmacniaczy starej PRL-owskiej Unitry, w której oprócz agresywnie działających filtrów barwy jest wbudowany niewyłączalny filtr Kontur, to być może będzie zawiedziony.
Zastosowany regulator barwy jest bardzo dobrym wyborem przy cichym słuchaniu materiału muzycznego bardzo dobrej jakości. Przyznam, że użytkuję ten przedwzmacniacz głównie z wyłączona funkcją Bypass. W połączeniu z lampowym wzmacniaczem mocy Sansuix daje to rewelacyjny efekt przy cichym słuchaniu. Audiofile od wielu lat raczej nie używają regulatorów barwy, mimo że w złotych czasach audio (lata 70. i 80. XX wieku) każdy wzmacniacz taki regulator miał. Tu mamy wybór. Można układ filtrów całkowicie ominąć poprzez styki przekaźnika i być w zgodzie z audiofilskim sumieniem. Jeżeli ktoś jednak nie traktuje słuchania muzyki ortodoksyjnie, to być może doceni nowe możliwości. W końcu chodzi o to, aby przy tym czerpać jak najwięcej przyjemności.
Tomasz Jabłoński, EP
- R1, R3, R25, R27: 3,3 kΩ
- R2, R6, R7, R30, R31, R39, R42, R94: 47 kΩ
- R4, R10, R11, R16, R20, R21, R24, R28, R33, R35, R41, R44, R54, R55, R56, R57, R58, R59, R69, R74, R75, R76, R77, R78, R83, R84, R86, R90: 1 kΩ
- R5, R14, R29, R37: 6,8 kΩ
- R8, R12, R36: 910 Ω
- R9: 1,5 kΩ
- R13, R17, R22, R23, R48, R63, R66, R82, R87: 620 Ω
- R15, R38: 560 Ω
- R19, R40: 12 kΩ
- R26: 100 kΩ
- R34: 1,5 kΩ
- R43, R61, R73, R80, R92: 330 Ω
- R45, R50: 91 Ω
- R46, R52, R53: 150 Ω
- R47, R49, R60, R67, R79, R89: 820 Ω
- R51: 60 Ω
- R62, R72, R81, R88, R91: 680 Ω
- R64, R85: 100 Ω
- R65, R68, R70, R71: 27 Ω
- R93: 75 Ω
- R95: 2,2 kΩ
- C1, C2, C18, C19, C23, C24, C27, C31: 100 μF/16 V tantalowy SMD
- C3, C7, C14, C16: 1000 μF/35 V THT
- C4, C5, C9, C20, C21, C25, C26, C28, C32, C37, C40, C41, C48, C51, C52, C53, C60, C61, C65, C66, C67, C72, C77, C79, C80, C82, C86, C88, C90, C94, C98, C103: 100 nF ceramiczny (SMD1206)
- C6, C38, C39, C42, C43, C44, C45, C46, C47, C102, C104: 10 μF/16 V tantalowy SMD
- C8, C11, C29, C33: 10 nF
- C10, C30, C100: 47 nF
- C12, C17, C34, C36: 470 nF
- C13, C22: 100 pF ceramiczny
- C15, C35: 330 nF
- C49, C50: 2,2 μF
- C54, C55, C56, C62, C63, C68, C74, C78, C81, C83, C87, C89, C92, C99: 10 μF/16 V elektrolityczny SMD
- C57, C58, C59, C69, C70: 47 μF/16 V elektrolityczny SMD
- C64, C76, C84, C96: 2,2 nF ceramiczny (SMD1206)
- C71, C75, C85, C95: 2,7 nF ceramiczny (SMD1206)
- C73, C91: 8,2 nF ceramiczny (SMD1206)
- C93: 4,7 nF ceramiczny (SMD1206)
- C97: 68 nF ceramiczny (SMD1206)
- C101: 10 nF ceramiczny (SMD1206)
- D1, D2, D3, D4, D6, D7, D8, D9, D11, D12, D14, D15, D16, D17, D19, D20: 1N4007
- D5, D10, D13, D18, D21: 1N4148
- Q1, Q2, Q3, Q4, Q5, Q6: BC237
- U1, U2, U3, U12, U14, U16, U17: OPA1612
- U4: PGA2320IDW
- U5, U6, U7: LM317
- U8: LM337
- U9, U10, U11: TL431 (SOT23)
- U13: PCM1794A (SMD)
- U15: DIR9001PW (SMD)
- U18: stabilizator 3,3 V (SO8)
- U19: SN74HCU04D (SO14)
- F1, F2: bezpiecznik kubełkowy
- J2: goldpin kątowy 1×18
- P5, P6: potencjometr 2×10 kΩ
- P7, P8, P11, P12: goldpin
- ZZAC: ARK2/500
- K1, K2, K3, K4, K5: TE V23079 cewka 5 V
- IN1R, IN2R, IN1L, IN2L, OUTL, OUTR, SPDIF: gniazdo cinch kątowe do PCB
- T1: transformator 2×12 V TSZZ 12/008M
- T2: transformator 2×6 V TSZZ 7/004M
- R1, R2, R4, R6, R7, R8, R9, R13: 10 kΩ
- R5: 150 Ω
- R10, R11, R12, R14: 150 Ω
- C1, C9, C13: 100 nF (SMD0805)
- C3, C4, C7, C11, C12, C14, C15, C16: 10 μF/16 V tantalowy SMD
- C8, C10, C17: 100 nF (SMD1206)
- U1: ATmega4808 (TSSOP28)
- U2: SPX1117-3.3 (TO252)
- U3: odbiornik IR
- U4: TLP281-4 (SO16)
- U5: 7805
- J1: wyświetlacz 1,8 cala, rozdzielczość 160×128 pikseli, sterownik ST7735
- IMP1: impulsator z przyciskiem
- J5: goldpin 1×2