back to
www.audiodesignguide.com

To get more information contact me at: webmaster@audiodesignguide.com


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:

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:

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.

 

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