back to
www.audiodesignguide.com

To get more information contact me at:
[email-masked]

USB DAC 2 - first
tests
April
1
st , 2012 - working in progress ......

INTRODUCTION

The high resolution PCM
at 96-192KHz 24bit offer the possibility to have a good quality digital signal
near to the analog.
The first problem to create a DAC to play 96-192KHz 24bit
tracks is find a good USB to I2S converter.
I have tested these USB-I2S
interfaces and I have found very big differences in the
sound:

M2Tech module by
AckoDAC (Ackodac)

XMOS by Lucian (XMOS-based
Asynchronous USB to I2S interface)

Open Source by Qnktc
(Q N K T C)

After 3 tests in 2
different rooms, 3 different systems, with 3 my friends I can affirm that XMOS
module by Lorien is the best. There are many differences in the listening and
only the XMOS has an open sound, full of details and never tiring. With the
XMOS all musical instruments are easily recognizable in the sound
stage.

In my first test I
have used the Wolfson WM8740 DAC chip with an internal active I/V stage but to
increase the sonic performances I have decided to use the AD1955 and PCM1794
with passive I/V.

I consider the resistors the best method to create a
passive I/V because using the transformers the result is not good for many
parameters.

I have tested 2 different output
stages:

My differential hybrid design created with ECC82,
2N5449
and IRF720

(I have design this for the Monrio Top
Loader 3 value 10000$)

Raleigh
Audio Line Stage using 5687,
K & K
Audio CCS modules and Lundahl
LL1674 transformers.

The second is more
expensive but it sound a little better than my hybrid, as details and
soundstage there are no differences but playing some audio tracks you can
prefer it.

To get the best sonic
performances is necessary to use a pair of 2.2uF Jantzen
Audio Superior Z-cap in both output stages and 39uF 400V Solen
MKP in the power supply.

The quality of vacuum tubes is a condition
necessary to get a good sound so I have used 5687WA
by Jan Philips and
E82CC by original Mullard but there are many other new
production tubes to use.

AD1955 DAC
SCHEMATIC

The AD1955 analog
outputs are not current source like the most of DAC chips but it has a current
sink outputs so the I/V resistors are connected to the analog positive power
supply instead of the ground (TI
doc.).

Using this DAC chip is
necessary set some registers to play audio tracks at different sample rate so I
have used a little 16F684
Microchip PIC with a my custom firmware.

Others DAC chips like
the TI PCM1794 and
Wolfson WM8740 has a
master clock detection circuit that automatically determines the relationship
between the master clock frequency and the sampling rate.

In a direct
comparison the AD1955 sound much better than PM1794 and WM8740 but I would
like to do a new test with these DAC chips.

The AD1955 have an
on-chip click less analog volume control without lost in resolution and I have
implemented this in the PIC firmware so we can save the money necessary to buy
a DACT stepper attenuator.

There are very few
components to create a complete DAC so you can assemble this in few minutes on
a strip board.

The main problem is
solder the AD1955 in SSOP package but you can find on Ebay
stores some chips on DIP adapter.

PCM1794 DAC
SCHEMATIC

PCM1794
DAC borad need very few components so you can assemble this in few minutes on a
strip board.

OUTPUT STAGE SCHEMATIC
1

The Raleigh
Audio Line Stage clone is a Differential parafeed line stage push-pull with
a pair of CCS (constant current source)  to isolate  the power supply
from the signal.
A 2.2uF parafeed capacitor isolating the output transformer
from the power supply current so is possible to use little output transformers
with amorphous core.

The CCS
are  K&K
Audio modules with large heat sink kit, two for each
channel.

I have used the normal type CCS but it is possible to
use the cascode type.

OUTPUT STAGE SCHEMATIC
2

My Hybrid output stage
with the power supply used to test both output stages, IRF840 are 4 x IRF720
and 2 x IRF740.
The power supply use a 3A adjustable regulator with soft
start for the filaments at 12.6V DC and a dual mono Virtual Battery for the
high voltage about 270V DC.
It is necessary an output relay to prevent the
output of the voltage peaks during the switching on and off.
In the PCB are
present the components to create a version with balanced and unbalanced outputs
but if you don't need balanced output simply do not fit some components (Q4-5,
R66-67, R72-73, R35-38, R39-42, R43-44. R45-46, 2 x 2.2uF).

PHOTOS

AD1955 PIC
FIRMWARE

Using this DAC chip is
necessary set some registers to play audio tracks at different sample rate so I
have used a little 16F684
Microchip PIC with a my custom firmware.

The PICkit™ 2
Development Programmer/Debugger (PG164120) is a low-cost development tool with
an easy to use interface for programming and debugging.

There are also some
cheaper clones on Ebay stores.

HEX
firmware

Folllows the complete source to compile with the
command:

picl.exe
-16F684 AD1955_16F684_v2_volume_sampler.c

#include <pic.h>
#include <stdio.h>

__CONFIG(WDTDIS & INTIO & UNPROTECT & MCLRDIS & PWRTEN );

#ifndef XTAL_FREQ
#define XTAL_FREQ 4MHZ /* Crystal frequency in MHz */
#endif

#define MHZ *1000L /* number of kHz in a MHz */
#define KHZ *1 /* number of kHz in a kHz */

#if XTAL_FREQ >= 12MHZ
#define DelayUs(x) { unsigned char _dcnt; \
_dcnt = (x)*((XTAL_FREQ)/(12MHZ)); \
while(--_dcnt != 0) \
continue; }
#else
#define DelayUs(x) { unsigned char _dcnt; \
_dcnt = (x)/((12MHZ)/(XTAL_FREQ))|1; \
while(--_dcnt != 0) \
continue; }
#endif

#define PORTBIT(adr, bit) ((unsigned)(&adr)*8+(bit))

static bit RST @ PORTBIT(PORTA, 5);
static bit VOD @ PORTBIT(PORTA, 4);
static bit VOU @ PORTBIT(PORTA, 3);
static bit CLK @ PORTBIT(PORTA, 2);
static bit CSL @ PORTBIT(PORTA, 1);
static bit DAT @ PORTBIT(PORTA, 0);

static bit F192 @ PORTBIT(PORTC, 5);
static bit F176 @ PORTBIT(PORTC, 4);
static bit F96 @ PORTBIT(PORTC, 3);
static bit F88 @ PORTBIT(PORTC, 0);
static bit F48 @ PORTBIT(PORTC, 1);
static bit F44 @ PORTBIT(PORTC, 2);

void write_SPI(unsigned int data, unsigned int len);
void DelayMs(unsigned char cnt);
void SetVolume(int);
int Check_sampler(int sampler, int level);

const int values[32] = { 1,3,5,8,12,16,20,25,31,37,45,54,64,75,88,103,120,139,162,187,217,250,288,322,382,440,506,581,667,766,879,1008 };

void main()
{
int level = 5;
int sampler = 0;

PORTA = 0b00000000;
PORTC = 0b00000000;
ANSEL = 0b00000000;
CMCON0 = 0b00000111; // All comparator disabled
TRISA = 0b00011000; // only RA3 & RA4 are input
TRISC = 0b00111111; // all RC ports are input
C2IE = 0; // disable comparator 2
C1IE = 0; // disable comparator 1
CCP1IE = 0; // Disables the CCP1 interrupt

CSL = 1;
CLK = 0;
DAT = 0;
RST = 0;

DelayMs(250);

RST = 1;

DelayMs(250);
DelayMs(250);
DelayMs(250);
DelayMs(250);

SetVolume(level);

DelayMs(250);
DelayMs(250);
DelayMs(250);
DelayMs(250);

SetVolume(level);

while (1)
{
sampler = Check_sampler(sampler, level);

if (VOU == 0)
{
if (level < 31)
level += 1;

SetVolume(level);
}
else if (VOD == 0)
{
if (level > 0)
level -= 1;

SetVolume(level);

}

DelayMs(50);
}
}

int Check_sampler(int sampler, int level)
{
int test = 0;

if ( F44 ) test = 44;
else if ( F48 ) test = 48;
else if ( F88 ) test = 88;
else if ( F96 ) test = 96;
else if ( F176 ) test = 176;
else if ( F192 ) test = 192;
else test = 192;

if ( sampler == test )
return sampler;

sampler = test;

switch (sampler)
{
case 44: // Interpolation = 8x MCLK mode = 512 x Fs
case 48:
CSL = 0;
write_SPI(0b00000000, 8);
write_SPI(0b00000000, 8);
CSL = 1;
CLK = 0;
DAT = 0;
DelayMs(50);
CSL = 0;
write_SPI(0b01000000, 8);
write_SPI(0b00000001, 8);
CSL = 1;
CLK = 0;
DAT = 0;
break;

case 88: // Interpolation = 4x MCLK mode = 256 x Fs
case 96:
CSL = 0;
write_SPI(0b00000001, 8);
write_SPI(0b00000000, 8);
CSL = 1;
CLK = 0;
DAT = 0;
DelayMs(50);
CSL = 0;
write_SPI(0b01000000, 8);
write_SPI(0b00000001, 8);
CSL = 1;
CLK = 0;
DAT = 0;
break;

case 176: // Interpolation = 2x MCLK mode = 256 x Fs
case 192:
CSL = 0;
write_SPI(0b00000010, 8);
write_SPI(0b00000000, 8);
CSL = 1;
CLK = 0;
DAT = 0;
DelayMs(50);
CSL = 0;
write_SPI(0b01000000, 8);
write_SPI(0b00000001, 8);
CSL = 1;
CLK = 0;
DAT = 0;
break;
}
return sampler;
}

void SetVolume(int l)
{
int vol = values[l];

CSL = 0;
write_SPI(vol, 10);
write_SPI(0b1111, 4);
write_SPI(0b10, 2);
CSL = 1;

DelayMs(50);

CSL = 0;
write_SPI(vol, 10);
write_SPI(0b1111, 4);
write_SPI(0b11, 2);
CSL = 1;

DelayMs(50);

CLK = 0;
DAT = 0;
}

void DelayMs(unsigned char cnt)
{
unsigned char i;

do {
i = 4;

do {
DelayUs(250);
} while(--i);
} while(--cnt);
}

void write_SPI(unsigned int data, unsigned int n_bit)
{
unsigned int bit_mask;
int i;

bit_mask = 1 << (n_bit - 1);

for (i = 0; i < n_bit; i++)
{
if ((data & bit_mask) == 0)
{
CLK = 0;
DAT = 0;
}
else
{
CLK = 0;
DAT = 1;
}
DelayUs(100);

CLK = 1;

DelayUs(100);

data <<= 1;
}
}

AD1955 MEASUREMENTS

DAC with my Hybrid output stage, 3.6Vrms
at 0dB

DAC with Raleigh
Audio Line Stage clone output stage, 2.8Vrms at 0dB

PARTS

These lists are still not complete
.............

DAC module

item

description

cost in euro

1

XMOS USB-to-I2s module by Lucian

99

2

3300uF 25V

6

1

diode bridge 1A

1

1

220uF 6.3 OS-CON

2

1

47uF 6.3V OS-CON

2

3

10UF 6.3V OS-CON

6

4

Caddock MK132 200ohm

15

2

0.1uF MKP

4

1

AD1955

10

1

SSOP-to-DIP 28pim

3

1

socket 28pin

2

1

socket 16[in

1

1

Microprocessor

3

1

Heatsink

2

1

multi use pcb

4

1

LT1085

5

1

LT1086

5

total

170

Hybrid output stage

item

description

cost in euro

1

pcb

60

7

heatsink

10

7

mosfet

18

1

LM350

3

2

2200uF 25V

6

1

400V 150uF

5

1

2N2905

2

3

220uF 25V

6

1

200ohm multi turn trimmer

2

1

33UF 400V

3

4

tube socket

12

2

ECC82

40

2

39UF 400V Solen

40

2

2.2UF Z-Cap

36

20

resistors

20

2

2N5449

3

1

custom transformer

60

1

chassie

70

2

RCA connectors

5

total

401

Raleigh output stage

item

description

cost in euro

1

pcb

30

2

heatsink

3

2

mosfet

5

1

LM350

3

2

2200uF 25V

6

1

400V 150uF

5

1

2N2905

2

3

220uF 25V

6

1

200ohm multi turn trimmer

2

1

33UF 400V

3

4

tube socket

12

2

5687

40

2

39UF 400V Solen

40

2

2.2UF Z-Cap

36

20

resistors

20

4

CCS

32

2

LL1674

230

1

custom transformer

60

1

chassie

70

2

RCA connectors

5

total

610