Dálkové ovladače II.
               Hybridní infračervené přijímače
                Moderní součástková základna nám v současnosti nabízí mnohem perspektivnější řešení infračervených přijímačů s použitím hybridních obvodů zpravidla v třívývodových pouzdrech SOT32, SOT82, TO247 a pod. Zmíněné prvky jsou již při výrobě před samotným zapozdrováním nastaveny na příslušný nosný kmitočet, nejčastěji na 36kHz, 56kHz, ale vyjímkou nejsou 38kHz, 51kHz i jiné nestandartní kmitočty. Tyto malé přijímače svojí citlivostí, selektivností, rychlostí náběhu a doběhu neboli rychlostí odezvy, spotřebou ( často odebírají okolo 2mA ) předčí přijímací obvody složené z diskrétních prvků. Pro vlastní činnost vyžadují jen jedno napájecí napětí (zpravidla mezi 4 až 6V), blokovací kondenzátor, popřípadě jednoduchý RC článek v napájení k lepšímu potlačení nežádoucích napěťových driftů a výstupní Pull-Up rezistor ( cca 10k či vyšší ). Jejich bezkonkurenční cena s porovnáním cen diskrétních přijímačů je lákadlem pro použití i v těch zařízeních, která by jinak rozšířením diskrétních IR obvodů byla značně až neúnosně prodražena. K nejběžnějším typům s velmi příznivými parametry i cenou patří SFH5110 a SFH506, které dále ve stručnosti popíši.
        Přijímače SFH5110 a SFH506
                Abychom byli přesnější, měli bychom IR přijímače nazvat spíše IR detektory, neboť jakákoliv přítomnost infračerveného signálu v rozsahu citlivosti vstupní přijímací IR diody, AFC zesilovače, má za následek překlopení výstupu přijímače do logické nuly. Naopak nepřítomnost příslušné nosné se projeví klidovým stavem na výstupu, t.j. logickou jedničkou. Klíčování na straně vysílače má tedy význam jen pro hloubku modulace m=1. Modulaci na straně vysílače tak snadno realizujeme číslicově přímo z I/O výstupu mikroprocesoru, samozřejmě patřičně výkonově zesíleného vhodným budícím tranzistorem. Vysílacími IR protéká impulsní proud řádově desítky mA, vždy však jen na dobu poloviny periody nosné vlnové délky. Modulace probíhá jen po dobu značek. Vzhledem k pravidelnému střídání značek a mezer je střední hodnota proudu vysílacími diodami čtvrtinová oproti impulsnímu proudu, na který musí být dimenzován i spínací, budící tranzistor. Čipy SFH506 (katalogový list zde) mají oproti SFH5110 vyšší citlivost a selektivitu, čímž dosáhneme většího dosahu a spolehlivosti při stejném zářivém výkonu vysílacích infračervených diod. Podmínkou je však, že bude nosný kmitočet na vysílací straně souhlasit s kmitočtem, na který je naladěn hybridní přijímač ( označení například SFH506-36 pro 36kHz a pod. ). Obvod SFH5110 má na výstupu tvarovač s TTL/CMOS výstupem a není již zapotřebí signál před vlastním číslicovým zpracováním dále ošetřovat Schmittovým klopným obvodem jako u SFH506. To platí jen pro mikroprocesory, které postrádají Schmittovací vstupy. Například mikrokontroléry Scenix SX18/28/38/52 (nyní Ubicom) mají u portu B možnost volby napěťových úrovní TTL/CMOS/SCHMITT. Dále většina mikrořadičů, u kterých k dekódování RC5 použijeme vstupy externích přerušení na hranu či vstupy hardwarrových čítačů.
                Pokud vyžadujete přenos větších objemů dat a zařízení nemusí být kompatibilní s běžnými kódy RC5 , URC3 a pod., či je to dokonce nežádoucí (utajení přenosového protokolu, vyšší přenosová rychlost - přenos dat prostřednictvím kódovaní RC5 není právě nejrychlejší ...) nabízí se velmi jednoduché, při tom však spolehlivé a elegantní řešení. Většina jednočipů je vybavena univerzálním asynchronním přijímačem/vysílačem ( UART = Universal Asynchronous Receiver - Transmitter ), popřípadě USARTem ( Universal Synchronous Asynchronous Receiver - Transmitter , t.j. s možností synchronního příjmu a vysílání ). V takovém případě je možné datový výstup (otevřený kolektor) obou zmíněných typů hybridních IR přijímačů připojit přímo k příslušnému vstupu RX procesoru. Všechny UART/USART jednotky mají pro příjem vlastní Schmittův klopný obvod. Kromě nutného Pull-Up odporu tak není zapotřebí již dalších součástek a podpůrných obvodů. Dosažená přenosová rychlost je pak v rozsahu 1000 až 2000 Baud.
Obr.8 Popis pouzdra infrapřijímače SFH5110
 Obr.8  Infrapřijímač SFH5110 s označením jednotlivých pinů
               Datový kanál s hybridními IR přijímači
                Zde podrobněji rozeberu datový přenos s využitím UART/USART podpory mikroprocesoru, nejedná se tedy o přenos formátem RC5 (fázová modulace). Na obr.9 je schema takového IR vysílače. Budící proud Ib vysílacích led volíme s ohledem k jejich maximálním trvalým proudům dle příslušných katalogových listů, běžně cca 25mA. Impulsní proud je v případě fázové modulace RC5 čtyřnásobkem Ib. Za každou značkou, burstem trvajícím 32 period nosné následuje vždy buď ještě jedna značka, burst nebo mezera trvající stejnou dobu. Při přenosu jednotlivých burstů probíhá buzení led vždy jen v polovině periody nosného kmitočtu. Ne tak v případě, kdy probíhá datový přenos s využitím periferních bloků ASART a formování je podle konvencí asynchronního přenosu. Pak je nutné volit impulsní proud jen dvojnásobkem maximálního trvalého proudu Ib, t.j. 50mA. Startbit je zde značkou stejně jako každý datový bit logické nuly. Stopbitu a každé logické jedničce dat odpovídá absence budícího proudu. V případě přenosu osmi datových bitů logické nuly po startbitu a dvou stopbitů je přenos složen z devíti značek a dvou mezer. Přenosová rychlost je shora omezena nosným kmitočtem a je vhodné dát každému bitu několik desítek period nosné. Zvyšováním přenosového kmitočtu roste nestabilita a poruchovost přenosu, snižováním pak klesá kanálová kapacita.
               Jádrem vysílače může být jakýkoliv universální mikroprocesor - jednočip s minimálně jedním volným výstupem, kterým budeme spínat T1 a tím modulovat budící proud vysílacích diod. Potřebného budícího výkonu můžeme docílit například zapojením npn tranzistoru se společným emitorem, viz obr.9. Hodnota rezistoru R2 je cca 10k a jeho funkcí je uzemňovat bázi tranzistoru T1 po dobu, kdy je jednočip v resetovacím stavu. Tehdy jsou všechny porty procesoru ve stavu vysoké impedance (nastaveny jako vstupní) a bez Pull-Down rezistoru R2 by T1 mohl být částečně nebo zcela sepnut přes vnitřní Pull-Up rezistor brány procesoru. Hodnotu R3 je nutné vypočíst podle kolektorového proudu Ic T1 dle vztahu:
R3 = Uio * h21e / s*2*Ib
, kde Ib je maximální trvalý budící proud IR diodami dle katalogu, například 25mA, špičkový proud je pak 2*Ib, viz střída 1:1 nosné
s ... sycení tranzistoru ( 2 až 5 )
Uio ... napětí na výstupu I/O jednočipu zmenšené o úbytek na přechodu B-E T1 (pro CMOS jednočip je Uio=4.2V)
h21e ... proudový zesilovací činitel T1 v zapojení se společným emitorem (dle katalogu nebo změřit)
               Zvolíme-li malé sycení s<2, může při poklesu Uio (zvýšené zatížení I/O portu, pokles napájecího napětí ...) dojít k nedokonalému sepnutí T1 a tím i k menšímu nárůstu Ib. Na T1 dochází k vyzařování výkonu Ib*Ub v podobě tepla. Na diodách D1 a D2 je v důsledku sníženého Ib naopak vyzářený výkon menší. Ideální sycení je 2 až 5. Při vyšším sycení s>10 je T1 rovněž dokonale sepnut, nicméně saturační napětí na T1 dalším zvyšováním sycení roste a to v důsledku přesycené oblasti B-E volnými nosiči, t. zv. rozšířením rekombinační hladiny. Navíc zde dochází ke zhoršení dynamických vlastností T1, zvýšení recovery time přechodu B-C tranzistoru což má za následek pozdější rozepínání T1. Tuto nežádoucí vlastnost bipolárních spínačů také můžeme částečně eliminovat pomocnou Schottkyho diodou, zapojenou paralelně k přechodu B-C s polarizací stejnou jako je přechod B-C T1. U npn tranzistoru tedy anodou na bázi a katodou na kolektor. Princip diody je následující: v okamžiku sepnutí T1 odvádí Schottkyho dioda přebytečný náboj pryč z oblasti báze do oblasti kolektoru, který je v sepnutém stavu na nižším potenciálu než báze. Mezi kolektorem a emitorem T1 je saturačního napětí cca 20 až 100mV, mezi bází a emitorem je minimálně 650mV a s rostoucím proudem báze toto napětí ještě roste (bez diody). Se zapojenou diodou není přechod B-E po sepnutí nadále tolik přesycován. Při poklesu Uio na log.0 je nahromaděný náboj na kapacitě přechodu B-C odváděn prostřednictvím Schottkyho diody, a to tak dlouho, dokud je Uce<Ube-Usch. Při rozpojení T1 se dále Schottkyho dioda již nijak neuplatní.
Minimální hodnotu rezistoru R1 vypočteme dle vztahu:
R1 = (Uc - n*Ud/ 2*Ib
, kde Ib je maximální budící proud IR diodami
n ... počet diod v sérii
Ud ... napěťový úbytek na diodě při proudu 2*Ib
Uc ... napájecí napětí zmenšené o saturační napětí na spínacím tranzistoru a vždy musí platit:
Uc > n*Ud
Obr.9 Proudový budič navázaný na I/O port procesoru
 Obr.9  Příklad přímobudícího infravysílače navázaného na výstup mikrokontroléru PIC
               Programové vybavení
                Zde je podrobně rozepsán program pro jednočip PIC, analogicky je možné použít i jiný typ. U Atmelů 89Cxxx je třeba dát pozor na jiné zapojení výstupních portů a na nižší hodnotu vnitřních Pull-Up rezistorů. Z tohoto důvodu je vhodnější použití PNP tranzistoru se společným emitorem a diody zapojit mezi kolektorem a zemí, logická nula na výstupu Atmelu tranzistor spíná. Současně je rovněž dobré zajistit pomocí Watch-Dog a Brown-Out kontroleru hlídání procesoru, aby nám v okamžiku buzení diod "nezatuhl". To by pak mělo fatální důsledek, výkonové přetížení diod a jejich spálení. U procesorů PIC16F62x, PIC16F87x, PIC16F7x, PIC18Fxxx a pod. je Watch-Dog, Brown-Out detektor, PWRT implementován již na čipu a vše je konfigurovatelné ve fuse registru na adrese 2007h (viz dokumentace k jednočipům PIC). Watch-Dog se uplatní především při zastavení hodinového on-chip oscilátoru (nepředpokládám programové zacyklení v jednoduché rutině pro vysílání, viz ukázka listingu níže). Vstup Osc1 je velmi choulostivý na parazitní kapacity a induktance a má jen velmi malou zatížitelnost. Nechtěný dotyk i měřící sondy čítače kmitočtu může oscilátor zastavit. Pro měření kmitočtu při případném ověřování rezonančních kmitočtů krystalů raději používejte výstup Osc2 ! Uvedená procedura je součástí programu pro PIC16F877 (download celého programu je na konci článku, jednočip F877 byl vybrán záměrně pro vyšší počet I/O pinů, které jsou dále použité pro řízení LCdispleje, scanování abecedněnumerické klávesnice, řízení tří led a reproduktorku, jakož i pro větší vnitřní Flash, do které lze programově zapisovat) a pro 18-pinová pouzdra je nutné pozměnit portc na portb, neboť tyto kontrolery portc postrádají.
               V programu je od adresy vysilej_data uložena sekvence vlastních bitových přenosů, počínaje startbitem, přes tělo osmi datových bitů po dva stopbity. Jinou délku datového pole je nutné programově upravit, nedoporučuji však používat více jak 16 datových bitů, neboť pak již mohou nastávat problémy se synchronizací v přijímači, nehledě na hardwarrovou podporu maximálně 9 datových bitů u mikrokontrolérů PIC. Každé logické nule dat a startbitu odpovídá značka, logické jedničce a stopbitům mezera - klidový stav. (na výstupu přijímačů SFHxxx je log.1 při klidovém stavu a log.0 při značce - vysílání) Polovině periody nosné 36kHz odpovídá 36instrukcí mikrokontroléru (při krystalu 10.368MHz) - viz čítač citac1 v níže uvedeném programu. Každý bit přenášených dat je modulován 29.5 periodami nosné (bitová šířka 819.2us) - čítač citac2 v programu. Tomu odpovídá přenosová kapacita 1220 bitů/sekundu (cca 110 bytů/sekundu). Rychlost je volena s ohledem na rychlost přeběhu hybridního přijímače a hardwarrové možnosti dekodéru, který je osazen jednočipem PIC16F877 s krystalem 20MHz (maximální povolená katalogová hodnota - PIC pracuje však běžně i s krystalem 24MHz - vyzkoušeno). Minimální přenosová rychlost pro 20MHz je 1220baudů, neboť je odvozována od hodinového kmitočtu dle následujícího vztahu:
bit_per_sec = fkrystal / 64*(baud_rate_reg+1)
, kde baud_rate_reg je osmibitový registr (maximální hodnota 255)
 
Výpis programu je zde:
 
infraout  equ 1  ; rb1
portc     equ 7

citac1    equ 0x20
citac2    equ 0x21
txdata    equ 0x22

; *** P R O C E D U R A    P R O    V Y S I L A N I   - I N F R A P O R T ***
; procesor musí mít krystal 10.368MHz - 72 instrukcí na jednu periodu nosné 36kHz
; pro jiné kmitočty nosné je zapotřebí změnit krystal nebo upravit program

vysli_zpravu:
	clrwdt
	movlw prvni_byte_pro_vystup
	call vysilej_data
	movlw druhy_byte
	call vysilej_data
          .
          .
          .
	movlw posledni_byte
vysilej_data:
	movwf txdata
	call puls       ; start-bit
	btfss txdata,0
	call puls
	btfsc txdata,0
	call mezera
	btfss txdata,1
	call puls
	btfsc txdata,1
	call mezera
	btfss txdata,2
	call puls
	btfsc txdata,2
	call mezera
	btfss txdata,3
	call puls
	btfsc txdata,3
	call mezera
	btfss txdata,4
	call puls
	btfsc txdata,4
	call mezera
	btfss txdata,5
	call puls
	btfsc txdata,5
	call mezera
	btfss txdata,6
	call puls
	btfsc txdata,6
	call mezera
	btfss txdata,7
	call puls
	btfsc txdata,7
	call mezera
	call mezera     ; stop-bit
mezera:     ; vyrovnavaci bit
	movlw 0xc0
	movwf citac1
	bcf portc,infraout
	clrwdt
	decfsz citac1,1
	goto $ - 1
	decfsz citac1,1
	goto $ -1
	decfsz citac1,1
	goto $ - 1
	clrwdt
	return

puls:
	bsf portc,infraout
	movlw 0x0b
	movwf citac1
	decfsz citac1,1
	goto $ - 1
	nop
	bcf portc,infraout
	movlw 0x0a
	movwf citac1
	decfsz citac1,1
	goto $ - 1
	nop
	movlw 0x1c
	movwf citac2
	clrwdt
loop_puls:
	bsf portc,infraout
	movlw 0x0b
	movwf citac1
	decfsz citac1,1
	goto $ - 1
	nop
	bcf portc,infraout
	movlw 0x0a
	movwf citac1
	decfsz citac1,1
	goto $ - 1
	nop
	decfsz citac2,1
	goto loop_puls
	nop
	bsf portc,infraout
	movlw 0x08
	movwf citac1
	decfsz citac1,1
	goto $ - 1
	clrwdt
	bcf portc,infraout
	return
 
                Používáte-li přerušovací subsystém jednočipu, je nutné před vstupem do vysílací rutiny zakázat globálně všechna přerušení ( nulováním 7.bitu registru intcon ). Po ukončení vysílání přerušení opět nastavením příslušného bitu povolit. Pokud Vás uvedený článek zaujal, můžete mi své názory, další informace a prosby zaslat na pro@selfcontrol.cz.
 
Program v assembleru pro PIC16F877 - vysílač