Jste zde

Jak na převodník SMT160-30-92

Měření teplotního čidla SMT160-30-92 lze koncipovat několika způsoby. Zde demonstruji způusob, který příliš procesor nezatěžuje, není nejpřesnější, ale většinou dostačuje. Výstupem čidla je obdélníkový signál na frekvenci 1-4 kHz, jehož střída se mění lineárně s teplotou.

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


 


©2001 - Ondřej Vitouš
Hodnocení článku: 

Komentáře

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...