Fyzikální kabinet FyzKAB
Články Pár postřehů z elektroniky AD převodníky pro drobné hrátky

A/D převodníky pro drobné hrátky

Načtení kterékoliv fyzikální veličiny do PC se zpravidla neobejde bez převodu analogové elektrické veličiny (napětí, proud) na hodnotu binární – zpracovatelnou počítačem. Následující příspěvek by měl představit tři jednoduché 8-bitové A/D převodníky, které postačí pro řadu našich aplikací. Jako ukázku použití každého převodníku zde předvedu řešení stejného problému a to, jak zkonstruovat převodník analogového napětí 0–2,5 V na binární podobu.

ADC  0831

Prvním převodníkem je obvod ADC 0831. Jedná se o 8-bitový sériový převodník, převádějící metodou postupné aproximace. Obvod má jeden analogový vstup, na který můžeme přivádět napětí v rozmezí 0 V až napájecí napětí (zpravidla +5V). Mezi vstupy Ref- a Ref+ připojujeme zdroj vnějšího referenčního napětí, takže převodník může pracovat i s diferenciální referencí. Digitální vstupy a výstup dat jsou úrovně TTL – jedná se o vstup CS (výběr obvodu), CLK (časování převodu a čtení dat), výstup DATA OUT je sériový výstup převedené hodnoty.

U většiny A/D převodníků se setkáváme s metodou převodu, kdy převodník odstartujeme, ten určitou dobu převádí, což zpravidla „oznámí“ nějakým stavovým výstupem a po úspěšném převodu je výstupní hodnota držena ve výstupním bufferu, odkud již můžeme do startu nového převodu kdykoliv přečíst.

Převodník ADC je však od této metody trochu odlišný. Důvodem toho je fakt, že tento obvod není „plnohodnotný“ A/D převodník, ale je to jen aproximační registr s komparátorem a řídicí logikou (bez zdroje taktování a více bitového výstupního bufferu). Řízení převodníku je spojeno s průběžným čtením bitů převedené hodnoty. Postup převodu tedy probíhá následujícím způsobem (viz časové schéma):

časový průběh signálů

Obvod aktivujeme log. 0 na vstupu CS. Po první sestupné hraně na CLK se převede nejvyšší bit hodnoty a okamžitě se připraví na výstup DATA OUT, kde ho musíme načíst. Při druhé sestupné hraně se nastaví druhý nejvyšší bit na datový výstup atd. - přesně podle metody postupné aproximace. Po každé sestupné hraně tedy musíme číst výstup DATA OUT. Problémem je pro nás to, že pokud chceme převodník řídit pomocí tiskárnového portu PC, probíhá toto řízení poměrně pomalu a výsledný čas převodu nebude lepší než cca 40 µs. Z tohoto důvodu je dobré tento převodník používat spíše pro „pomalejší“ měření. S ohledem na většinu „bastlířškých“ zapojení používaných při počítačovém řízení čehokoliv (od regulace teploty v akváriu až po stavbu vlastního scanneru), je rychlost převodníku zcela dostačující a není třeba si jeho rychlostí příliš lámat hlavu.

Následující schéma a tabulka ukazuje zapojení převodníku k paralelnímu portu pro převod elektrického napětí v rozmezí 0–l2,5 V. Převodník je zapojen k paralelnímu portu počítače dle následující tabulky:

ADC 0831LPT - CANON 25
CSDATA1
CLKDATA0
DATA OUT BUSY
GNDGND

popis pinů obvodu

Funkce pro čtení AD převodníku (psáno v Turbo Pascal)

FUNCTION READAD: Byte;
Var Hod :Byte;
BEGIN
   Port[AdrLPT]:=0;    {CS=0, CLK=0 - zapnuti prevodniku}
   Port[AdrLPT]:=1;    {CLK=1 priprava na sestupnou hranu}
   Port[AdrLPT]:=0;    {CLK=0 vytvoreni 1.sestupne hrany, priprava na prevod}
   Hod:=0;
   For i:=1 to 9 do    {ted budeme prevadet a cist bity}
     Begin
       Port[AdrLPT]:=1;    {CLK=1 priprava na sestupnou hranu}
       Port[AdrLPT]:=0;    {CLK=0 vytvoreni sestupne hrany}
       If i<>8 Then
         begin    {kdyz 8.bit, tak jej nacti jeste jednou}
           Hod:=Hod*2;
           If (Port[AdrLPT+1]AND128)=0 Then Hod:=Hod+1
         end
     End;
   ReadAD:=Hod;
   Port[AdrLPT]:=2
END;


TLC 549

Druhým převodníkem (velice podobným předchozímu obvodu) je obvod TLC 549, který je opět 8-bitovým A/D převodníkem pracujícím metodou postupné aproximace. Výraznější odlišností pro nás je jen postup při převádění. Tento obvod pracuje dle obvyklého způsobu řízení A/D převodníku, jak již jsme se zmínili - po startu převodníku obvod cca 17 µs převádí (dáno vnitřní taktovací frekvencí), a pak již můžeme téměř libovolnou frekvencí přečíst výstupní hodnotu z výstupního bufferu. Ale ani u tohoto obvodu to není tak lehké, jak bychom očekávali. Problém je se startem převodníku, který se automaticky startuje po přečtení posledního bitu minulé hodnoty (viz časové schéma).

časový průběh signálů

Budeme-li chtít v určitý okamžik naměřit aktuální hodnotu analogového vstupu, budeme muset nejdříve načíst hodnotu z minulého měření (ta pro nás nebude mít žádný význam), jediným důvodem je to, aby se po dočtení odstartoval převodník. Po uplynutí času delšího než je čas převodu můžeme konečně načíst požadovanou hodnotu. Zní to složitě? Myslím, že časový diagram a ukázkový program vše objasní. (Zde bych jen upozornil, že v některé literatuře je chybně uváděn start převodníku sestupnou hranou na CS – zkuste to a uvidíte).

Náš ukázkový případ tj. převod napětí 0-2,5 V na binární hodnotu 0-255 nyní vyřešíme následujícím způsobem. Obvod je zapojen dle následujícího schématu a je připojen k paralelnímu portu stejným způsobem jako převodník předešlý.

popis pinů


Podobné schéma tomu minulému? Pozor však na prohozené piny 1 a 5.

TLC 549LPT - CANON 25
CSDATA1
CLKDATA0
DATA OUT BUSY
GNDGND

Programová funkce:

Function AD: Byte;    {funkce vracejici prevedenou hodnotu}
var n, Hod : Byte;
Begin
   Port[AdrLPT]:=0;    {CS=0, CLK=0 - zapnuti prevodniku}
   Wait(799);
   Port[BA+2]:=Port[BA+2] OR 2;    {CS na log.0}
   For n:=0 To 7 do
     begin    {cteni "falesnych " dat, po 8. bude start}
       Port[AdrLPT]:=1;    {CLK=1}
       Port[AdrLPT]:=0;    {CLK=0}
     end;
   Hod:=0;    {az ted se odstartoval prevod}
   Port[AdrLPT]:=2;    {CS=1}
   Port[AdrLPT]:=0;    {CS=0}
   For n:=0 To 7 do
     begin    {cteni dat}
       Port[AdrLPT]:=1;    {CLK=1}
       Port[AdrLPT]:=0;    {CLK=0}
       Hod:=Hod*2;
       If (Port[AdrLPT+1] AND 128) = 0 Then Hod:=Hod+1
     end;
  AD:=Hod
End;


ZN 449

I následující odvod ZN 449 (resp. ZN 448) je 8-bitový převodník pracující metodou postupné aproximace. Nyní se však jedná o převodník paralelní. Obvod je napájen napětím +5V. Všechny jeho vstupně/výstupní signály jsou TTL kompatibilní, což je předurčuje pro připojení k paralelnímu portu počítače. Obvod má vlastní zdroj referenčního napětí 2.55 V, ale lze i použít vnější zdroj referenčního napětí. Zdroj hodinové frekvence lze také použít vnitřní nebo vnější. Obvod se velmi podobá staršímu obvodu ZN 427 nebo i ještě staršímu hybridnímu převodníku WSH 570. Všechny parametry včetně rychlosti převodu (9 µs) a ceny (nižší než 200 Kč) z něho činí obvod, který si zaslouží pozornost.

Převodník ZN 449 má dva vstupní řídicí signály (RD a WR) a jeden výstupní stavový (BUSY). Osm výstupních datových linek je zakončeno třístavovým bufferem. Je-li signál RD na úrovni logické 1, jsou datové výstupy ve třetím stavu, při logické 0 představují převedenou hodnotu v binární podobě. Převod je startován sestupným pulzem na vstupu WR. V průběhu převodu nastaví převodník signál BUSY na log. 0, po ukončení převodu zpět na hodnotu na log. 1. Převedená hodnota zůstává na výstupech do startu dalšího převodu. Což je konečně postup, který bychom u „slušně vychovaného“ převodníku o čekávali. Průběhy řídicích signálů, tak jak budeme převodník dále používat, vidíme následujícím časovém schématu.

časový průběh signálů

Budeme-li chtít opět realizovat stejný převodník jako u předešlých dvou obvodů, využijeme vnitřní referenci (UREF=2.55 V) a vnitřní zdroj hodinové frekvence, která je stanovena kondenzátorem C1 (v našem případě 120 pF odpovídá frekvenci 0,8 MHz). Rezistor R1 stanovuje proud 6.4 mA protékající Zenerovou diodou vnitřního zdroje referenčního napětí. (Doufám, že odpustíte, že nyní je reference 2,55 V, zatímco před tím byla 2,5 V – pokud ne, nezapojujte R1 a použijte vnější referenci 2,5V, kterou zavedete do vstupu 7.) Paralelně ke zdroji referenčního napětí je připojen stabilizační kondenzátor C2 (cca 5 µF). Rezistor R2 (180 kΩ), připojený k zápornému napětí a vývodu 5, určuje proud 25–150 µA pro komparátor převodníku. Napětí –12V zde není podmínkou, lze použít jakékoliv záporné napětí s odpovídajícím rezistorem R2. Rezistor R3 mezi napájecím napětím a vývodem 2 (RD) slouží k držení tohoto vstupu na úrovni log. 1, tím jsou drženy datové výstupy ve třetím stavu, dokud si počítač data nevyžádá.

zapojení pinů

Jedinou hardwarovou podmínkou připojení převodníku k paralelnímu portu je to, aby paralelní port počítače umožňoval oboustrannou komunikaci po datových linkách (to se začalo objevovat až s nástupem laserových tiskáren). Z hlediska nastavení počítače se jedná o volbu „Bi-directional parallel port“ v SETUPu počítače (pokud je paralelní port přímo zaintegrován v základní desce počítače) nebo o nastavení této volby na desce příslušného řadiče (pokud to lze – musí být na desce k tomu určený swich či jumper). Z hlediska programové obsluhy se tato modifikace projevuje jen jediným bitem v řídicím registru paralelního portu (pátý bit), který v původním programovém modelu nebyl využit. Je-li tento bit nastaven na log. 0, datové linky jsou jen výstupní, při opačné hodnotě jsou obousměrné.

Datové výstupy A/D převodníku jsou připojeny k datovým vodičům obousměrného paralelního portu, řídicí signály převodníku k řídicím vodičům portu (viz tabulka)

ZN 449LPT (CANON 25)
DATA 0–7 DATA 0–7
RDAUTOFEED
WRSTROBE
BUSYBUSY
GNDGND

Softwarové ovládání rozhraní – „handshake“

Softwarové ovládání převodníku bude díky již popsanému elektrickému propojení počítače a převodníku zcela jednoduché, přesně podle časového sledu, který je zachycen na příslušném obrázku.

Softwarově potvrdíme obousměrný režim paralelního rozhraní. Toho docílíme nastavením pátého bitu řídícího registru (37Ah) na úroveň log. 1.

(V jazyce Turbo Pascal to provedeme následujícím způsobem:)

Port[$37A]:= Port[$37A] OR 32;

Převedeme datové výstupy A/D převodníku z třetího stavu a tím je připojíme k datovým vodičům obousměrně nastaveného paralelního rozhraní počítače. To provedeme nastavením log. 0 na vodič AUTOFEED paralelního rozhraní. Tento signál je však invertovaný, proto na příslušný bit řídicího registru (druhý bit adr. 37Ah) uložíme log. 1.

Port[$37A]:= Port[$37A] OR 2;

Vytvoříme startovací sestupný signál na vodiči STROBE. Nejdříve jej nastavíme na hodnotu log. 1, poté na log. 0 a opět na hodnotu log. 1. Signál STROBE je řízen prvním bitem řídicího registru 37Ah a je také invertovaný.

Port[$37A]:= Port[$37A] AND 254;
Port[$37A]:= Port[$37A] OR 1;
Port[$37A]:= Port[$37A] AND 254;

Vyčkáme až úspěšně proběhne převod (buď testujeme příznak BUSY), nebo počkáme tak dlouhou dobu, kdy již určitě bude převod ukončen (max. čas převodu použitého převodníku je 10 μs). Zde si ukážeme čekání na příznak BUSY. Příznak BUSY testujeme na osmém bitu stavového registru rozhraní (adr. 379h).

Repeat
Until Port[$379] AND 128 = 0;

Načteme naměřenou hodnotu z datového registru rozhraní (adr. 378h).

WriteLn(‘Hodnota je: ’, Port[$378]);

Převedeme datové výstupy převodníku do třetího stavu, tedy nastavíme na vodič AUTOFEED hodnotu log. 1 (na řídicí bit log. 0).

Port[$37A]:= Port[$37A] AND 253;

UPOZORNĚNÍ:
Nesouhlasíme s vyřazením Newtonových zákonů, Ohmova zákona a zákona zachování energie z učiva fyziky základních škol v České republice!