Vše je založeno na vlastnostech aktivního optočlenu PC900V. Ten má na vstupu svítivou diodu. Výstupní tranzistor NPN má vyveden kolektor a je řízen aktivním obvodem s hysterezí, který potřebuje napájení. Na následujícím obrázku je schéma připojení optočlenu k sériovému rozhraní PC.
Napájení je zajištěno přímo ze sériového rozhraní. Trochu
netypické zapojení optočlenu na sériový port je zvoleno proto, že při nulovém
proudu LED musí být na signálu TXD záporné napětí (log.1 pro RS232), což
je klidový stav tohoto rozhraní. Hodnoty rezistorů jsou zvoleny tak, aby rozkmit napětí na TXD
byl +-5V. Optočlen si tedy vlastně mění napájecí napětí z 15V v klidu na 5V při
sepnutí výstupního tranzistoru. Nevím jestli výrobce PC900V něco takového
předpokládal, ale mně to funguje bez problémů na rychlosti 115200 Bd. Tato rychlost se nastavuje na
straně počítače hodnotou dělitele (viz ukázka programu dále).
Oznaceni TXD a RXD je z pohledu periferie! Na konektoru PC se tedy tyto signaly pripoji na jejich protejsky.
Při měřeních optočlenu při napájecím napětí 5V, kolektorovém rezistoru 1k2 a
budicím proudu LED asi 1.6mA (sériový rezistor 2k2) bylo zpoždění hran H>L a L>H
shodné a činilo asi 2us. Optočlen pracoval do kmitočtu 300kHz. Vyšší kmitočty už neměly
stejnou střídu jako na vstupu a při 450kHz signál neprošel vůbec.
Zapojení jsem použil ke spojení počítače s osmibitovým A/D převodníkem
řízeným procesorem PIC16C84. Převodník posílá 10k vzorků za sekundu.
Galvanické oddělení dovoluje "kouknout" se i na exotičtější místa, jako
třeba na telefonní linku a podobně.
Ukázka části programu v PASCALu k ovládání a čtení ze sériového portu :
{ Umisteni promenne COM na vektory seriovych portu } var COM : array [0..1] of word absolute $0000:$0400; { Nastaveni serioveho portu } procedure SETCOM; begin NUM:=0; {natvrdo se vybere COM1 (pro COM2 je NUM:=1) DATA:=COM[NUM]; {ziskani ridich adres registru serioveho rozhrani} INTE:=COM[NUM]+1; INTF:=COM[NUM]+2; CONT:=COM[NUM]+3; PFC:=COM[NUM]+4; PFD:=COM[NUM]+5; PFE:=COM[NUM]+6; port[PFC]:=$01; {nastaveni registru} port[CONT]:=128; port[DATA]:=1; {ZDE JE DELITEL} port[INTE]:=0; port[CONT]:=7; HL:=port[PFD];HL:=port[DATA]; port[INTE]:=0; end; { Cteni ze serioveho portu } function SEM:byte; begin repeat until (keypressed or ((port[PFD] and 1) = 1)); SEM:=port[DATA]; end;
simandl@feld.cvut.cz |