Minimig Video d/a resistor ladder

From OpenCircuits
Revision as of 21:54, 22 August 2007 by Freqmax (talk | contribs) (simulation results)
Jump to navigation Jump to search

Model:

D/A resistor ladder electrical model


Equations:

Defining constants:
U_vga = 0.7 V
R_vga = 75 Ω
U_vcc = 3.3 V
Total resistance = 1/(1/4000+1/2000+1/1000+1/560)+75 = 357.8282.. Ω
Common current through resistor ladder plus vga impedance (75Ω) = 3.3V / 357.8282.. = 0.009222 A
Current * VGA impedance = 0.6917V (specification says 0.7 p-p)
Output voltage = 75 * (3.3/(1/(1/4000+1/2000+1/1000+1/560)+75)) = 0.6917V
Simplification:
U = (75*3.3)/(1/(1/4000+1/2000+1/1000+1/560)+75) = 0.6917V
Base resistor value = (1/8+1/4+1/2+1/1)/(1/((R_vga*U_vcc)/U_vga-R_vga)) = 522.3214Ω
Deviation summary:
0523/523 = 1.0000
1050/523 = 2.0076
2100/523 = 4.0153
4220/523 = 8.0688
As can be seen no more than 1% is useful with digikey resistors. Resistor combinations will add tolerances and use valuable pcb space.
Maximum output voltage if VGA impedance is 75Ω is: (75*3.3)/(1/(1/4220+1/2100+1/1050+1/523)+75) = 0.6981 V

Useful links:

Wikipedia: Resistor
Wikipedia: Preferred number
Digikey: Resistors
Value vs output signal originaly


The original 4000Ω 2000Ω 1000Ω 560Ω resistors, Gives this curve for desired vs actual signal:
Note the dent in the middle of the curve!

0 0.000002
1 0.060736
2 0.119277
3 0.175740
4 0.230233
5 0.282857
6 0.333708
7 0.382873
8 0.389764
9 0.437103
10 0.482927
11 0.527307
12 0.570310
13 0.612000
14 0.652436
15 0.691673
Value vs output signal modified


The modification with 4220Ω 2100Ω 1050Ω 523Ω resistors, Gives this curve for desired vs actual signal:

0 0.000002
1 0.057625
2 0.113793
3 0.167545
4 0.220000
5 0.270256
6 0.319355
7 0.366446
8 0.413880
9 0.458053
10 0.501297
11 0.542855
12 0.583575
13 0.622742
14 0.661153
15 0.698131

Simulation program (perl):

#!/usr/bin/perl
#
# Created:  2007-08-23 05:25.32
# Purpose:  Minimig Video D/A resistor ladder simulation
#-----------------------------------------------------------------------------
$map[$n++]=0;
$map[$n++]=8;
$map[$n++]=4;
$map[$n++]=12;
$map[$n++]=2;
$map[$n++]=10;
$map[$n++]=6;
$map[$n++]=14;
$map[$n++]=1;
$map[$n++]=9;
$map[$n++]=5;
$map[$n++]=13;
$map[$n++]=3;
$map[$n++]=11;
$map[$n++]=7;
$map[$n++]=15;

for($v=0; $v<=15; $v++) {
  $d=$map[$v];

  $d3 = ($d & 8)?1:0;
  $d2 = ($d & 4)?1:0;
  $d1 = ($d & 2)?1:0;
  $d0 = ($d & 1)?1:0;

  if(  !($d3==0 && $d2==0 && $d1==0 && $d0==0)   ) {
    $r_dac=1/( 
#      ${d3}/4000+ ${d2}/2000+ ${d1}/1000+ ${d0}/560
      ${d3}/4220+ ${d2}/2100+ ${d1}/1050+ ${d0}/523
      );
    } else { $r_dac=100*1000*1000; }

  $u = (75*3.3)/($r_dac+75);

  printf("%d %f\n",$v,$u);
  }

#-----------------------------------------------------------------------------

Gnuplot command: gnuplot> plot "dac_sim.txt" using ($1):($2) smooth csplines