Solid state R2R attenuator using analog switches or multiplying DAC

For the encoder I found this bit of code. It's really fast but you need both interrupt lines free. I got an optical 128 pulse/rot. encoder. And I just got an Arduino board recently, I'm really liking it.

#define encoder0PinA 2
#define encoder0PinB 3

volatile char encoderChange = 0;
int volumeMain = 0;

boolean Aold = 0;
boolean Bnew = 0;

void setup() {
pinMode(encoder0PinA, INPUT);
pinMode(encoder0PinB, INPUT);
attachInterrupt(0, doEncoderA, CHANGE);
attachInterrupt(1, doEncoderB, CHANGE);

Serial.begin (115200);
}

void loop(){

if (encoderChange != 0) {

volumeMain += encoderChange;
encoderChange = 0;
volumeMain = constrain(volumeMain, 0, 1280);

Serial.println(volumeMain, DEC);
}

}



// Interrupt on A changing state
void doEncoderA(){
encoderChange += ( Bnew ^ Aold ) ? 1 : -1 ;
Aold = (PIND & B0000100) >> 2;
}

// Interrupt on B changing state
void doEncoderB(){
Bnew=(PIND & B0001000) >> 3;
encoderChange += ( Bnew ^ Aold ) ? 1 : -1;
}
 
Yes interrupts for both the A and B channels is one improvement in this code. Also there is a 10x reduction in execution time bypassing the Arduino standard port io functions (put in for portability so this is UNO code only), everybody bypasses these when they need speed. The function call is the costly bit, because the jump back address needs to be pushed on the stack.

But this is all old hat. What I was actually pointing out was this XOR (exclusive or (^)) method of decoding which is only essentially one operation and a non pipeline blocking operation at that. Though the ternary operation (a=?b:c) is blocking. This to my mind was not intuitive I would have had to do it with a bunch of if statements.

And I have just realized a method to reduce this by one more instruction. The bus PIND is read in and masked then to do the XOR I shift to the first position (LSB), however they just have to be aligned so one of the shifts is not really needed. So instead of:

Bnew=(PIND & B0001000) >> 3;
Aold = (PIND & B0000100) >> 2;

It could be like:

Bnew=(PIND & B0001000) >> 1;
Aold = (PIND & B0000100);

I’ll need to test that out. Another interesting method (the runner up) involves a 16 long array lookup table for the increment decrement value. I can post that if you wish I think I still have it somewhere this compiles smaller though. But I have not done proper benchmark between the two.
 
Actually if the array lookup is faster than the ternary operation (a=?b:c), and I am not sure if it is, the two methods can be combined. If we use the trick of avoiding the one shift. The outcome of the XOR would be B0000100
which is 4 or B0000000 or zero. So you could go:


static int myArray[] = {-1,0,0,0,1};
encoderChange += [ Bnew ^ Aold ]myArray;

Does anyone know if array lookup is faster than a=?b:c;
 
I've been thinking about controlling a project like this one and the first method that I'm going to attempt will be a little different.
I personally don't like the quality or tracking of classic pots which is why I'm joining in here, however my ears find the taper of a sensible pot like an ALPS RK27 or RK09 to be 'log' enough that the volume changes don't feel jarring. The ATMegaxx8 that I'll probably be using or an ATtinyx4 if I can dig one out, both have integrated 10bit ADCs giving 1024 steps. I could then just connect the pot up so that the wiper is a voltage divider and use the value from the ADC.

I'd reduce the input sensitivity slightly, say only update the DAC volume control setting if the ADC value changes by 2 or 3 to avoid the volume being to twitchy. I'll have to experiment to find out if this is necessary.

The software would essentially be very simple the ADC would read the voltage on the wiper and convert it to digital, then the arduino would multiply this number by 4 and clock it out to the multiplying DAC.

You can even get single taper RK09s very cheap (for example: 20x ALPS RK09 Poti Automotive 50K log Mono | eBay ). This is cheaper than a decent linear encoder and personally I don't like volume controls that turn more than a standard pot.

Looking forward to trying this out :)
 
I was looking at the Muses72320 schematic and had the idea that two dacs could be put in series maybe with a buffer between to get more range. Still armchair-engineering this I wrote a little 100 line java program to find the most linear (logarithmic) steps.

idealDBs = ideal decibel attenuation
idealAttens = ideal attenuation
trueDB = the best real decibel attenuation value found
trueAtten = the best real attenuation value found
err = The err in attenuation
D1= value of dac one
D2= value of dac two

idealDBs=-1.00 idealAttens=0.89125094 trueDB=-1.001 trueAtten=0.89119212 err=0.00 D1=4091 D2=3653
idealDBs=-2.00 idealAttens=0.79432823 trueDB=-2.000 trueAtten=0.79428947 err=0.00 D1=4092 D2=3255
idealDBs=-3.00 idealAttens=0.70794578 trueDB=-3.000 trueAtten=0.70793651 err=0.00 D1=4095 D2=2899
idealDBs=-4.00 idealAttens=0.63095734 trueDB=-4.000 trueAtten=0.63094932 err=0.00 D1=4093 D2=2585
idealDBs=-5.00 idealAttens=0.56234133 trueDB=-5.000 trueAtten=0.56233174 err=0.00 D1=4091 D2=2305
idealDBs=-6.00 idealAttens=0.50118723 trueDB=-6.002 trueAtten=0.50109890 err=0.00 D1=4095 D2=2052
idealDBs=-7.00 idealAttens=0.44668359 trueDB=-7.001 trueAtten=0.44664225 err=0.00 D1=4095 D2=1829
idealDBs=-8.00 idealAttens=0.39810717 trueDB=-8.001 trueAtten=0.39804640 err=0.00 D1=4095 D2=1630
idealDBs=-9.00 idealAttens=0.35481339 trueDB=-9.000 trueAtten=0.35480703 err=0.00 D1=4092 D2=1454
idealDBs=-10.00 idealAttens=0.31622777 trueDB=-10.000 trueAtten=0.31621994 err=0.00 D1=4079 D2=1300
idealDBs=-11.00 idealAttens=0.28183829 trueDB=-11.001 trueAtten=0.28180708 err=0.00 D1=4095 D2=1154
idealDBs=-12.00 idealAttens=0.25118864 trueDB=-12.001 trueAtten=0.25115933 err=0.00 D1=4093 D2=1029
idealDBs=-13.00 idealAttens=0.22387211 trueDB=-13.000 trueAtten=0.22387199 err=0.00 D1=4085 D2=919
idealDBs=-14.00 idealAttens=0.19952623 trueDB=-14.001 trueAtten=0.19951160 err=0.00 D1=4095 D2=817
idealDBs=-15.00 idealAttens=0.17782794 trueDB=-15.002 trueAtten=0.17777778 err=0.00 D1=4095 D2=728
idealDBs=-16.00 idealAttens=0.15848932 trueDB=-16.000 trueAtten=0.15848596 err=0.00 D1=4095 D2=649
idealDBs=-17.00 idealAttens=0.14125375 trueDB=-17.007 trueAtten=0.14114774 err=0.01 D1=4095 D2=578
idealDBs=-18.00 idealAttens=0.12589254 trueDB=-18.001 trueAtten=0.12588424 err=0.00 D1=4091 D2=516
idealDBs=-19.00 idealAttens=0.11220185 trueDB=-19.009 trueAtten=0.11208791 err=0.01 D1=4095 D2=459
idealDBs=-20.00 idealAttens=0.10000000 trueDB=-20.000 trueAtten=0.09999985 err=0.00 D1=4090 D2=410
idealDBs=-21.00 idealAttens=0.08912509 trueDB=-21.001 trueAtten=0.08911812 err=0.00 D1=4072 D2=367
idealDBs=-22.00 idealAttens=0.07943282 trueDB=-22.007 trueAtten=0.07936508 err=0.01 D1=4095 D2=325
idealDBs=-23.00 idealAttens=0.07079458 trueDB=-23.000 trueAtten=0.07079386 err=0.00 D1=3944 D2=301
idealDBs=-24.00 idealAttens=0.06309573 trueDB=-24.013 trueAtten=0.06300366 err=0.01 D1=4095 D2=258
idealDBs=-25.00 idealAttens=0.05623413 trueDB=-25.011 trueAtten=0.05616606 err=0.01 D1=4095 D2=230
idealDBs=-26.00 idealAttens=0.05011872 trueDB=-26.010 trueAtten=0.05006105 err=0.01 D1=4095 D2=205
idealDBs=-27.00 idealAttens=0.04466836 trueDB=-27.000 trueAtten=0.04466682 err=0.00 D1=4093 D2=183
idealDBs=-28.00 idealAttens=0.03981072 trueDB=-28.001 trueAtten=0.03980464 err=0.00 D1=4095 D2=163
idealDBs=-29.00 idealAttens=0.03548134 trueDB=-29.018 trueAtten=0.03540904 err=0.02 D1=4095 D2=145
idealDBs=-30.00 idealAttens=0.03162278 trueDB=-30.033 trueAtten=0.03150183 err=0.03 D1=4095 D2=129
idealDBs=-31.00 idealAttens=0.02818383 trueDB=-31.031 trueAtten=0.02808303 err=0.03 D1=4095 D2=115
idealDBs=-32.00 idealAttens=0.02511886 trueDB=-32.000 trueAtten=0.02511774 err=0.00 D1=4050 D2=104
idealDBs=-33.00 idealAttens=0.02238721 trueDB=-33.001 trueAtten=0.02238592 err=0.00 D1=3870 D2=97
idealDBs=-34.00 idealAttens=0.01995262 trueDB=-34.001 trueAtten=0.01995107 err=0.00 D1=4080 D2=82
idealDBs=-35.00 idealAttens=0.01778279 trueDB=-35.000 trueAtten=0.01778279 err=0.00 D1=3976 D2=75
idealDBs=-36.00 idealAttens=0.01584893 trueDB=-36.000 trueAtten=0.01584892 err=0.00 D1=653 D2=407
idealDBs=-37.00 idealAttens=0.01412538 trueDB=-37.000 trueAtten=0.01412551 err=0.00 D1=2547 D2=93
idealDBs=-38.00 idealAttens=0.01258925 trueDB=-38.000 trueAtten=0.01258881 err=0.00 D1=3578 D2=59
idealDBs=-39.00 idealAttens=0.01122018 trueDB=-39.001 trueAtten=0.01121950 err=0.00 D1=4090 D2=46
idealDBs=-40.00 idealAttens=0.01000000 trueDB=-40.000 trueAtten=0.00999999 err=0.00 D1=4090 D2=41
idealDBs=-41.00 idealAttens=0.00891251 trueDB=-41.001 trueAtten=0.00891185 err=0.00 D1=4039 D2=37
idealDBs=-42.00 idealAttens=0.00794328 trueDB=-42.001 trueAtten=0.00794250 err=0.00 D1=4036 D2=33
idealDBs=-43.00 idealAttens=0.00707946 trueDB=-43.000 trueAtten=0.00707912 err=0.00 D1=3957 D2=30
idealDBs=-44.00 idealAttens=0.00630957 trueDB=-44.001 trueAtten=0.00630889 err=0.00 D1=4069 D2=26
idealDBs=-45.00 idealAttens=0.00562341 trueDB=-45.011 trueAtten=0.00561661 err=0.01 D1=4095 D2=23
idealDBs=-46.00 idealAttens=0.00501187 trueDB=-46.000 trueAtten=0.00501174 err=0.00 D1=4002 D2=21
idealDBs=-47.00 idealAttens=0.00446684 trueDB=-47.140 trueAtten=0.00439560 err=0.14 D1=4095 D2=18
idealDBs=-48.00 idealAttens=0.00398107 trueDB=-48.163 trueAtten=0.00390720 err=0.16 D1=4095 D2=16
idealDBs=-49.00 idealAttens=0.00354813 trueDB=-49.000 trueAtten=0.00354815 err=0.00 D1=1803 D2=33
idealDBs=-50.00 idealAttens=0.00316228 trueDB=-50.000 trueAtten=0.00316220 err=0.00 D1=4079 D2=13
idealDBs=-51.00 idealAttens=0.00281838 trueDB=-51.001 trueAtten=0.00281805 err=0.00 D1=3938 D2=12
idealDBs=-52.00 idealAttens=0.00251189 trueDB=-52.245 trueAtten=0.00244200 err=0.25 D1=4095 D2=10
idealDBs=-53.00 idealAttens=0.00223872 trueDB=-53.160 trueAtten=0.00219780 err=0.16 D1=4095 D2=9
idealDBs=-54.00 idealAttens=0.00199526 trueDB=-54.183 trueAtten=0.00195360 err=0.18 D1=4095 D2=8
idealDBs=-55.00 idealAttens=0.00177828 trueDB=-55.343 trueAtten=0.00170940 err=0.34 D1=4095 D2=7
idealDBs=-56.00 idealAttens=0.00158489 trueDB=-56.000 trueAtten=0.00158483 err=0.00 D1=3322 D2=8
idealDBs=-57.00 idealAttens=0.00141254 trueDB=-57.000 trueAtten=0.00141249 err=0.00 D1=1822 D2=13
idealDBs=-58.00 idealAttens=0.00125893 trueDB=-58.266 trueAtten=0.00122100 err=0.27 D1=4095 D2=5
idealDBs=-59.00 idealAttens=0.00112202 trueDB=-59.000 trueAtten=0.00112201 err=0.00 D1=3763 D2=5
idealDBs=-60.00 idealAttens=0.00100000 trueDB=-60.204 trueAtten=0.00097680 err=0.20 D1=4095 D2=4
idealDBs=-61.00 idealAttens=0.00089125 trueDB=-61.001 trueAtten=0.00089117 err=0.00 D1=3736 D2=4
idealDBs=-62.00 idealAttens=0.00079433 trueDB=-62.703 trueAtten=0.00073260 err=0.70 D1=4095 D2=3
idealDBs=-63.00 idealAttens=0.00070795 trueDB=-63.000 trueAtten=0.00070791 err=0.00 D1=3957 D2=3
idealDBs=-64.00 idealAttens=0.00063096 trueDB=-64.000 trueAtten=0.00063098 err=0.00 D1=3527 D2=3
idealDBs=-65.00 idealAttens=0.00056234 trueDB=-66.224 trueAtten=0.00048840 err=1.22 D1=4095 D2=2
idealDBs=-66.00 idealAttens=0.00050119 trueDB=-66.224 trueAtten=0.00048840 err=0.22 D1=4095 D2=2 << - Repeat
idealDBs=-67.00 idealAttens=0.00044668 trueDB=-67.001 trueAtten=0.00044666 err=0.00 D1=3745 D2=2
idealDBs=-68.00 idealAttens=0.00039811 trueDB=-68.000 trueAtten=0.00039811 err=0.00 D1=3338 D2=2
idealDBs=-69.00 idealAttens=0.00035481 trueDB=-69.000 trueAtten=0.00035482 err=0.00 D1=2975 D2=2
idealDBs=-70.00 idealAttens=0.00031623 trueDB=-72.245 trueAtten=0.00024420 err=2.25 D1=4095 D2=1
idealDBs=-71.00 idealAttens=0.00028184 trueDB=-72.245 trueAtten=0.00024420 err=1.25 D1=4095 D2=1 << - Repeat
idealDBs=-72.00 idealAttens=0.00025119 trueDB=-72.245 trueAtten=0.00024420 err=0.25 D1=4095 D2=1 << - Repeat
idealDBs=-73.00 idealAttens=0.00022387 trueDB=-73.000 trueAtten=0.00022387 err=0.00 D1=3754 D2=1
idealDBs=-74.00 idealAttens=0.00019953 trueDB=-74.000 trueAtten=0.00019953 err=0.00 D1=3346 D2=1
idealDBs=-75.00 idealAttens=0.00017783 trueDB=-75.000 trueAtten=0.00017783 err=0.00 D1=2982 D2=1
idealDBs=-76.00 idealAttens=0.00015849 trueDB=-75.999 trueAtten=0.00015851 err=0.00 D1=2658 D2=1
idealDBs=-77.00 idealAttens=0.00014125 trueDB=-76.999 trueAtten=0.00014127 err=0.00 D1=2369 D2=1
idealDBs=-78.00 idealAttens=0.00012589 trueDB=-78.000 trueAtten=0.00012589 err=0.00 D1=2111 D2=1
idealDBs=-79.00 idealAttens=0.00011220 trueDB=-78.998 trueAtten=0.00011223 err=0.00 D1=1882 D2=1
idealDBs=-80.00 idealAttens=0.00010000 trueDB=-79.999 trueAtten=0.00010001 err=0.00 D1=1677 D2=1
idealDBs=-81.00 idealAttens=0.00008913 trueDB=-80.997 trueAtten=0.00008915 err=0.00 D1=1495 D2=1
idealDBs=-82.00 idealAttens=0.00007943 trueDB=-82.000 trueAtten=0.00007943 err=0.00 D1=1332 D2=1
idealDBs=-83.00 idealAttens=0.00007079 trueDB=-83.001 trueAtten=0.00007079 err=0.00 D1=1187 D2=1
idealDBs=-84.00 idealAttens=0.00006310 trueDB=-84.000 trueAtten=0.00006309 err=0.00 D1=1058 D2=1
idealDBs=-85.00 idealAttens=0.00005623 trueDB=-85.000 trueAtten=0.00005623 err=0.00 D1=943 D2=1
idealDBs=-86.00 idealAttens=0.00005012 trueDB=-86.005 trueAtten=0.00005009 err=0.00 D1=840 D2=1
idealDBs=-87.00 idealAttens=0.00004467 trueDB=-87.001 trueAtten=0.00004467 err=0.00 D1=749 D2=1
idealDBs=-88.00 idealAttens=0.00003981 trueDB=-87.995 trueAtten=0.00003984 err=0.01 D1=668 D2=1
idealDBs=-89.00 idealAttens=0.00003548 trueDB=-89.000 trueAtten=0.00003548 err=0.00 D1=595 D2=1
idealDBs=-90.00 idealAttens=0.00003162 trueDB=-90.005 trueAtten=0.00003161 err=0.00 D1=530 D2=1
idealDBs=-91.00 idealAttens=0.00002818 trueDB=-90.993 trueAtten=0.00002821 err=0.01 D1=473 D2=1
idealDBs=-92.00 idealAttens=0.00002512 trueDB=-92.005 trueAtten=0.00002511 err=0.00 D1=421 D2=1
idealDBs=-93.00 idealAttens=0.00002239 trueDB=-93.010 trueAtten=0.00002236 err=0.01 D1=375 D2=1
idealDBs=-94.00 idealAttens=0.00001995 trueDB=-93.989 trueAtten=0.00001998 err=0.01 D1=335 D2=1
idealDBs=-95.00 idealAttens=0.00001778 trueDB=-95.006 trueAtten=0.00001777 err=0.01 D1=298 D2=1
idealDBs=-96.00 idealAttens=0.00001585 trueDB=-95.993 trueAtten=0.00001586 err=0.01 D1=266 D2=1
idealDBs=-97.00 idealAttens=0.00001413 trueDB=-96.995 trueAtten=0.00001413 err=0.00 D1=237 D2=1
idealDBs=-98.00 idealAttens=0.00001259 trueDB=-98.005 trueAtten=0.00001258 err=0.00 D1=211 D2=1
idealDBs=-99.00 idealAttens=0.00001122 trueDB=-99.007 trueAtten=0.00001121 err=0.01 D1=188 D2=1
idealDBs=-100.00 idealAttens=0.00001000 trueDB=-99.984 trueAtten=0.00001002 err=0.02 D1=168 D2=1
idealDBs=-101.00 idealAttens=0.00000891 trueDB=-101.026 trueAtten=0.00000889 err=0.03 D1=149 D2=1
idealDBs=-102.00 idealAttens=0.00000794 trueDB=-102.013 trueAtten=0.00000793 err=0.01 D1=133 D2=1
idealDBs=-103.00 idealAttens=0.00000708 trueDB=-102.979 trueAtten=0.00000710 err=0.02 D1=119 D2=1
idealDBs=-104.00 idealAttens=0.00000631 trueDB=-103.984 trueAtten=0.00000632 err=0.02 D1=106 D2=1
idealDBs=-105.00 idealAttens=0.00000562 trueDB=-105.028 trueAtten=0.00000561 err=0.03 D1=94 D2=1
idealDBs=-106.00 idealAttens=0.00000501 trueDB=-106.005 trueAtten=0.00000501 err=0.00 D1=84 D2=1
idealDBs=-107.00 idealAttens=0.00000447 trueDB=-106.989 trueAtten=0.00000447 err=0.01 D1=75 D2=1
idealDBs=-108.00 idealAttens=0.00000398 trueDB=-107.969 trueAtten=0.00000400 err=0.03 D1=67 D2=1
idealDBs=-109.00 idealAttens=0.00000355 trueDB=-108.927 trueAtten=0.00000358 err=0.07 D1=60 D2=1
idealDBs=-110.00 idealAttens=0.00000316 trueDB=-110.005 trueAtten=0.00000316 err=0.00 D1=53 D2=1
idealDBs=-111.00 idealAttens=0.00000282 trueDB=-111.048 trueAtten=0.00000280 err=0.05 D1=47 D2=1
idealDBs=-112.00 idealAttens=0.00000251 trueDB=-112.025 trueAtten=0.00000250 err=0.03 D1=42 D2=1
idealDBs=-113.00 idealAttens=0.00000224 trueDB=-112.894 trueAtten=0.00000227 err=0.11 D1=38 D2=1
idealDBs=-114.00 idealAttens=0.00000200 trueDB=-114.120 trueAtten=0.00000197 err=0.12 D1=33 D2=1
idealDBs=-115.00 idealAttens=0.00000178 trueDB=-114.948 trueAtten=0.00000179 err=0.05 D1=30 D2=1
idealDBs=-116.00 idealAttens=0.00000158 trueDB=-115.863 trueAtten=0.00000161 err=0.14 D1=27 D2=1
idealDBs=-117.00 idealAttens=0.00000141 trueDB=-116.886 trueAtten=0.00000143 err=0.11 D1=24 D2=1
idealDBs=-118.00 idealAttens=0.00000126 trueDB=-118.046 trueAtten=0.00000125 err=0.05 D1=21 D2=1
idealDBs=-119.00 idealAttens=0.00000112 trueDB=-118.915 trueAtten=0.00000113 err=0.08 D1=19 D2=1
idealDBs=-120.00 idealAttens=0.00000100 trueDB=-119.881 trueAtten=0.00000101 err=0.12 D1=17 D2=1
idealDBs=-121.00 idealAttens=0.00000089 trueDB=-120.968 trueAtten=0.00000089 err=0.03 D1=15 D2=1
idealDBs=-122.00 idealAttens=0.00000079 trueDB=-122.211 trueAtten=0.00000078 err=0.21 D1=13 D2=1
idealDBs=-123.00 idealAttens=0.00000071 trueDB=-122.907 trueAtten=0.00000072 err=0.09 D1=12 D2=1
idealDBs=-124.00 idealAttens=0.00000063 trueDB=-123.662 trueAtten=0.00000066 err=0.34 D1=11 D2=1
idealDBs=-125.00 idealAttens=0.00000056 trueDB=-125.405 trueAtten=0.00000054 err=0.41 D1=9 D2=1
idealDBs=-126.00 idealAttens=0.00000050 trueDB=-126.428 trueAtten=0.00000048 err=0.43 D1=8 D2=1
idealDBs=-127.00 idealAttens=0.00000045 trueDB=-126.428 trueAtten=0.00000048 err=0.57 D1=8 D2=1 << - Repeat
idealDBs=-128.00 idealAttens=0.00000040 trueDB=-127.588 trueAtten=0.00000042 err=0.41 D1=7 D2=1
idealDBs=-129.00 idealAttens=0.00000035 trueDB=-128.927 trueAtten=0.00000036 err=0.07 D1=6 D2=1
 
I'd reduce the input sensitivity slightly, say only update the DAC volume control setting if the ADC value changes by 2 or 3 to avoid the volume being to twitchy. I'll have to experiment to find out if this is necessary.

In my experience, you can have quite stable 7 bit resolution out of 10. that's 128 levels. Depending on the wire length, and other interferences, it may slip a little.
Write a window comparator, that checks if the pot was moved "N" values.
Then program a timer to set "N", the window of the comparator higher when in standby (N = 3 for example). So when You move the pot, you have to move 3 values, to verify the turn. If it verified, set "N" to 1 then you can use every value. If it is stable for a while (until the timer runs out) sets the window "N" higher again. It prevents accidental slips. I hope it was clear.

I tested this with cheap plastic pots, and worked fine.
Also do not forget to solder a filter capacitor to the ADC input. It helps the value keep stable. With better shielding and pots you may get more than 7 bit out.
 
I accidentally damaged my AD5439 after slipping with the multimeter and shorting some pins. Before this is was working great. I tested it with a pair of Hypex UCD180s and it sounded good. No noise and click/pop free.

I was about to order a replacement before I found the DAC8812 which is a dual 16bit multiplying DAC with serial control. I might order one of these instead and test that :)
 
From the datasheet:
"The degree of attenuation across the DAC is determined by an
8-bit word applied to the onboard decode logic. This 8-bit word
is decoded into a 17-bit word which is then applied to a 17-bit
R-2R ladder. The very fine step resolution, which is available
over the entire dynamic range, is due to the use of this 17-bit
DAC."


So does this mean it is really a 17bit DAC that is reduced to 8bit due to being a LOG scale? Strange wording but I think this is what it means. Given that, I think I'd rather just have a 16bit DAC and do the LOG function myself.
 
Bit of an update...

So I had a go with the AD5439 but after a period of time the IC would just stop responding to serial control. Strange, it would work for a while and then just stop. Not sure why though.

Anyway, so I moved on and made a design using the DAC8812, which is a 16 bit DAC and gives 65536 steps. I designed the PCB in eagle and then used OSH Park to get it fabricated. I can't recommend OSH Park enough! They are really cheap, pretty quick, really good quality and super easy as you don't have to generate gerber files.
 

Attachments

  • Clipboard01.jpg
    Clipboard01.jpg
    154.7 KB · Views: 1,268
  • IMG_0844.JPG
    IMG_0844.JPG
    174.5 KB · Views: 1,269