Jste zde

Jednoduchý a levný AD převodník na PC neboli za málo peněz užitečná hračka

Kdysi jsem viděl prodávat jednoduchý 8 kanálový osciloskop z PC. Jednalo se o jednu disketu s programem a krabičku velikosti redukce datového kabelu PC nebo hardwareového klíče. Začal jsem zkoumat co to umí a co v tom je. Nakonec jsem měl doma obvod LTC1290 od Linear Technology a začal jsem si hrát.

LTC1290 je AD sériový převodník. Vstupní část definuje 4 dvojice vstupů. Každou dvojici je možné použít buď jako 2 vstupy proti společné zemi nebo jako diferenciální vstupy. Ke své činnosti potřebuje externí hodinový signál o maximální frekvenci 4MHz.

Uvedené zapojení je varianta s nejmenším rozumným počtem součástek. Zapojení používá externího oscilátoru tvořeného obvodem NE555. Při stávajících hodnotách součástek je frekvence oscilátoru asi 1MHz, což je mezní hodnota běžného obvodu. Datové vstupy AD převodníku jsou připojeny k paralelnímu portu. Referneční napětí je tvořeno zenerovou diodou.

Vstupy AD převodníku jsou cháněny odpory a snesou napětí 15V.

Program: 

{ Ovladani AD prevodniku LTC1290 pripojenemu na paralelni port }
uses Crt;

{ konstanty programu }
const
  { uzivatelem definovatelne }
  adc_nlpt = 1; { pripojeni na LPT1 }
  vref = 2.4;   { referencni napeti }
  { masky bitu paralelniho portu }
  sclk = 1;     { SCLK }
  din  = 2;     { DIN }
  dout = 64;    { DOUT }
  cs   = 4;     { CS }

var
   lpt_addrlist: array[1..3] of Word absolute $40:08; { BIOS RAM }
   aout, ain: Word; { adresa vstupniho a vystupniho portu }

procedure SDelay;
var I: Integer;
begin
  { na pomalejsich pocitacich neni nutne }
  for I := 0 to 1000 do begin end;
end;

{ Cteni napeti kanalu proti zemi.
  Kanaly jsou cislovany 1 az 8 }
function ADC(ch: Integer): Real;
const
     wconst = 1 + 32 + 64; { single-ended, bipolar, MSB first }
     chconst: array[1..8] of Byte = (0,2,8,10,4,6,12,14); { kanaly }
var
   I: Integer;   { citac }
   win: Word;    { ridici slovo LTC1290 }
   result: Word; { vystup z ADC }
begin
  for I := 0 to 1000 do SDelay; { zpozdeni mezi jednotlivymi merenimi }
  Win := wconst + chconst[ch];
  { odesli ridici slovo }
  Port[aout] := 0; { drop CS }
  SDelay;
  for I := 1 to 8 do begin
    SDelay;
    Port[aout] := (win and 1) * din; { nastaveni bitu ridiciho slova }
    SDelay;
    Port[aout] := (win and 1) * din + sclk; { hodiny }
    win := win div 2; { posun bitu }
    SDelay;
    Port[aout] := 0; { hodiny }
  end;
  SDelay;
  Port[aout] := cs; { CS }
  for I := 0 to 1000 do SDelay; { zpozdeni mezi jednotlivymi merenimi }
  { prijmi vysledek mereni }
  Port[aout] := 0; { drop CS }
  SDelay;
  result := 0;
  win := wconst + chconst[ch]; { jeste jednou ridici slovo }
  for I := 1 to 12 do begin
    SDelay;
    Port[aout] := (win and 1) * din; { nastaveni bitu ridiciho slova }
    SDelay;
    Port[aout] := (win and 1) * din + sclk; { hodiny }
    win := win div 2; { posun bitu }
    result := result * 2; { posun bitu }
    if Port[ain] and dout <> 0 then result := result + 1;
    SDelay;
    Port[aout] := 0; { hodiny }
  end;
  Port[aout] := cs; { CS }
  { prevod na skutecnou hodnotu, zmeny na LTC1090 zde }
  ADC := vref * ((result + 2048) and $0FFF) / 2048 - vref ;
end;

{ program pro vypis vsech 8 kanalu }

var
  I: Integer;

begin
  aout := lpt_addrlist[adc_nlpt]; { adresa portu }
  ain  := aout + 1;               { adresa portu }
  Port[aout] := cs;               { CS }
  ADC(1); { precist LTC1290 pro nastaveni vychoziho stavu }
  WriteLn('Stiskni svou oblibenou klavesu.');
  repeat
    for I := 1 to 8 do Write(ADC(I):4:4,' ');
    WriteLn('V');
    Delay(1000);
  until KeyPressed;
  if ReadKey = #0 then ReadKey;
end.
Při vynechání oscilátoru je nutné spojit ACLK a SCLK a po každém čtení ještě vygenerovat 56 taktů hodin pro dokončení převodu.


Tomáš Kouba - 06 / 1999
Hodnocení článku: