Scaling the adc – Rainbow Electronics DS1852 User Manual
Page 23

DS1852
23 of 25
SCALING THE ADC
procedure writeTrimValue(trim :integer); (* write trim to part *)
procedure forceReference(Vin: real); (* applies reference voltage to input pin*)
procedure waitForNewConversion(); (* writes update byte to zero and waits for
update
of new conversion with present trim *)
function readValue():integer; (* reads converted digital answer *)
procedure ProgramTrim(trim :integer);(*enables EE for table3 & programs trim*)
Procedure calVad(maxInput :real)
var
Bit
:integer; (* counter - represents bininary bit 15-0*)
trim
:integer; (* present trim values *)
lsb
:real; (* the lsb value of the voltage reading *)
Vin
:real; (* the reference input voltage *)
Dec_in :integer; (* decimal representation of voltage input *)
Dec_out :integer; (* voltage reading in decimal *)
delta
:integer; (* present error of voltage reading *)
bestDelta
:integer; (* the error closest to zero *)
bestTrim
:integer; (* the trim that gave the best delta *)
Begin
bestDelta := 1000000;
bestTrim := 0;
trim := 4095; (* 0FFFh *)
lsb := maxInput / 65535;
Dec_in := 63888; (* input is ~97.5% of full scale *)
Vin := lsb * Dec_in;
forceReference(Vin);
(*Use SAR approach to trim course adjust on VAD scale bits 15-12*)
for Bit := 15 downto 11 do (* must go 1 bit too far so that zero is
possible solution *)
begin
if (Bit > 11) then
begin
trim := trim + lshft(1,Bit);
end;
writeTrimValue(trim);
waitForNewConversion;
Dec_out := readVoltage;
delta := Dec_out - Dec_in;
if ( delta >= 0 ) then