Převodník SMT160-30-92 je součástka, se kterou lze celkem jednoduše a přesně měřit teplotu téměř jakýmkoliv mikroprocesorem, za použití pouze jednoho výstupního pinu. Teplota je totiž převedená na střídu výstupního logického signálu:
DC =0.32 + 0.0047 x t
Kde t je teplota ve stupních celsia a DC je střída výstupního signálu o frekvenci 1 - 4 kHz.
Pokud budeme měřit střídu běžným způsobem, je potřeba implementovat do procesoru rutiny pro výpočty dělení a násobení, nehledě na to, že měření střídy musí být provedeno s dostatečně velikou přesností, což je závislé na rychlosti procesoru a může to být docela limitující.
Níže uvedený způsob měření je jednodušší variantou - co do délky i složitosti kódu - a lze jej bez větších problémů upravit pro libovolný mikroprocesor.
Princip měření a výpočtů
Pokud budeme vzorkovat vstupní signál v pravidelných intervalech po dostatečně dlouhou dobu, pak počet stavů, kdy je vstup v log. 1, bude přímo úměrný teplotě t. Pokud vhodně zvolíme počet vzorků, bude převod výsledku na teplotu poměrně jednoduchou záležitostí.
Příklad:
Chci měřit výsledek s přesností na 0.5°C. Protože střídě DC = 0 odpovídá teplota t = 0.32 / -0.0047 tj. -68.09°C, a protože výsledné číslo je přímo úměrné střídě, zvolím si kupř výslednou hodnotu jako jeden BYTE, kde hodnota 0 odpovídá teplotě -68°C, hodnota 136 teplotě 0°C. Maximální měřená hodnota je pak 60°C. Protože střídě 0.32 odpovídá hodnota 136, celkový počet měřených vzorků bude 136 / 0.32 = 425. Uvedenou hodnotu mohu znásobit kupř 2x, 4x, 8x pro zvýšení přesnosti. Výsledek potom pouze X krát posunu v rámci dvoubajtového registu, abych dostal potřebnou jednobajtovou hodnotu. Uvedený princip je možné snadno modifikovat kupř pro měření s větší přesností atd.
Nevýhody této metody měření teploty
Chyby měření:
První chyba měření, ke které dochází, je dána faktem, že nikdy neměřím přesně celé pulsy, ale na začátku či na konci měření teoreticky mohu mít až maximálně polovinu jednoho pulzu navíc. Tato chyba se dá eliminovat délkou měření. Kupř. pro nejnižší možnou frekvenci převodníku 1kHz - pokud bude doba měření trvat cca 100msec - bude maximální hodnota chyby okolo 1%. Čím delší doba měření, nebo vyšší frekvence převodníku, tím bude chyba nižší.
Další chybou je chyba daná rychlostí vzorkování. Kupříkladu s mikroprocesorem PIC na hodinovém kmitočtu 4MHz je vzorkovací perioda 8-9µsec. Při této hodnotě a frekvenci 4kHz převodníku může chyba narůst v extrémním případě až na 8.5°C. Samozřejmě pouze ve velmi nepravděpodobné situaci - pokud by došlo k přesné synchronizaci obou frekvencí na tomto kmitočtu, nebo na některé harmonické. Tato situace je poměrně nepravděpodobná, ale je nutné s tím počítat. Chyba se sníží při rostoucí frekvenci vzorkování. Další možností by bylo, vzorkovat vícekrát po sobě s časovým posunem a nebo do vzorkování úmyslně vložit chybu. Kupříkladu, pokud každý 256vzorek bude o 1µsec spožděný, tato chyba se zmenší, přičemž chyba vnesená touto nepřesností měření není nikterak veliká. Této vnesené chyby zároveň využívám ke zrychlení instrukční smyčky mého programu.
Doba měření:
Vzhledem k první chybě je ideální doba měření pro nižší přesnost 108msec (425 x 32 x 8µsec). Pro větší přesnost je možné měřit ještě delší dobu.
Programové řešení
Rutina je napsaná v jazyku PARALLAX pro PIC. Pro informaci uvádím i klasické PIC instrukce. Rutinu lze bez problémů upravit téměř pro libovolný typ procesoru
Definice vstupu pro měření:
TIn = rb.0 ;vstup teplotniho cidla
Definice registů - celkem 4 použité:
countL ds 1 ;citac nizsi byte
countH ds 1 ;citac vyssi byte
stridaL ds 1 ;pocitadlo stridy nizsi byte
stridaH ds 1 ;pocitadlo stridy vyssi byte
Vlastní kód rutiny:
;-------------------------------------------------------------------------- ;------------- MERENI ----------------------------------------------------- ;-------------------------------------------------------------------------- ; Tato rutina vrati teplotu v 0.5 stupnich celsia (pocitano od -68 stupnu) v registru ; stridaH ; registr stridaL pripadne obsahuje doplnek pro zpresneni teto hodnoty ;425 x 32 kroku mereni = 13600 = 3520H ; instrukce PARALLAX ; instrukce assembleru PIC ; pocet instr. cyklu MERENI ; napln citace poctem mereni ; (hodnota H je vyssi o jedna, protoze se pocita i cyklus pro countL) mov countL,#020h ; MOVLW #020h 2 ; MOVWF countL mov countH,#036h ; MOVLW #036h 2 ; MOVWF countH ; vynuluj citace stridy clr stridaL ; CLRF stridaL 1 clr stridaH ; CLRF stridaH 1 ; vynuluj Z clrb Z ; BCF 3,2 1 ; nasledujici funkce se pouziva pro doplneni smycky tak, aby instrukcni ; cyklus mel 8usec (repeatA:) a kazdy 256ty cyklus 9usec (repeatB:) repeatA: nop ; NOP 1 repeatB: ; pokud je vstupni pin nastaveny, zvys hodnotu promenne stridaL snb TIn ; BTFSC RB,0 1/2 inc stridaL ; INCF stridaL,1 1 ; pokuz Z=1, zvys hodnotu stridaH snz ; BTFSC 3,2 1/2 inc stridaH ; INCF stridaH,1 1 ; pozn: Z muze nabyt hodnoty 1 pouze pokud predchozi instrukce pro ; zvyseni registru stridaL pretekla pres nulu ; jinak posledni instrukce pred touto, ktera ovlivnuje flag Z je bud ; clrb Z na zacatku instrukcniho cyklu, nebo instrukce djnz smycky ; po niz Z zustane vzdy rovno 0 ; tato metoda programovani neni prilis cista, ale pouzil jsem ji pro ; zmenseni poctu instr. cyklu ve smycce ; vzdy je dulezite, aby pocet instr. cyklu byl stejny, nezavisle na stavu ; vstupniho bitu !!! ; cyklus opakuj 13600x djnz countL,repeatA: ; DECFSZ countL,1 3/2 ; GOTO repeatA: djnz countH,repeatB: ; DECFSZ countH,1 3/2 ; GOTO repeatB: ; vynuluj CY a 3x posun vysledek doleva (32 x 2^3 = 256) ; v případě posunu pouze 2x dostaneme v registru stridaH ; teplotu primo ve stupnich celsia a zvetsi se nam rozsah mereni ; do kladnych hodnot az do 130 stupnu Celsia clrb C ; BCF 3,0 1 rl stridaL ; RLF stridaL,1 1 rl stridaH ; RLF stridaH,1 1 rl stridaL ; RLF stridaL,1 1 rl stridaH ; RLF stridaH,1 1 rl stridaL ; RLF stridaL,1 1 rl stridaH ; RLF stridaH,1 1 ret ; RETURN ;--------------------------------------------------------------------------
Závěr
Uvedený způsob měžení nevyniká přílišnou přesností, ani rychlostí, ale díky své jednoduchosti implementace může snadno nalézt uplatnění v praxi. Testování zapojení počítačovou simulací v celém frekvenčním rozsahu senzoru vykázalo v několika mezních případech chybu až 5stupňů. Měření několika vzorků převodníků ukázalo, že kmitočet jejich interního oscilátoru se pohybuje okolo 3.6kHz ve všech případech. Při simulaci v tomto rozsahu se chyba pohybovala řádově v desetinách stupně.
Praktické testy ukázaly, že vše funguje spolehlivě a bez jakýchkoliv problémů. Průměrováním 10 vzorků je možné dosáhnout přesnosti na desetinu stupně Celsia, měření ovšem pro celou řadu aplikací vyhoví i bez průměrování.
DOWNLOAD a Odkazy na internetu
- Datasheet : smt_smt160.pdf (80 kb)
- Kod programu - paralax_smt.txt
©2001 - Ondřej Vitouš
Komentáře
Simulace - NEJDE
Zdravím, začínám se učit programování PIC a zkoušel jsem tento program nasimulovat v programu PIC Simulator. Problem je,že do registru nebo promene stridaH to uklada nesmysly... Prosím poraďte...