1) Slovo úvodem
Tento článek popisuje kompletní zdokumentovanou stavbu teploměru připojenéhopřes sériové rozhranní RS232. Teplota je měřena čidlem Th0 - SMT160-30,což je převodník teplota-střída. Signál z tohoto čidla je zpracováván (průměrována upravován) jednočipovým mikropočítačem 89C2051 a dále pak upraven v převodníkuMAX232, který převede logické úrovně TTL na logické úrovně rozhraní RS232C.Takto navrhnutý měřící obvod včetně uvedených programů pracuje v teplotnímrozsahu -45°C až 130°C.
2) Konstrukce
Teplotní čidlo SMT160-30(TO92) je převodník teplota -> střída, generujeobdéníkový TTL kompatibilní signál 1-4kHz s různou střídou dle vzorce D.C.=0.32+0.0047*t. K měření používám jednochip Atmel 89C2051, jímž změřím střídu (respektivestřídy 64 period signálu, viz velikost chyby v manuálu k čidlu) a dle zpětnéhovzorce t=(DC-0.32)/0.0047 vypočtu teplotu s rozlišením desetiny stupně.Veškeré výpočty se provádějí v pevné čárce (fixed point) pomocí mé vlastnímatematické knihovny. Pak vypočtu průměr z 256 hodnot (takto se posílá1 měření za 5-6 sekund, jinak by byl port zavalen 50x za sekundu), převedudo kódu BCD, pak do kódu ASCII a pošlu přes budič RS232C-MAX232 na sériovýport. Výstupem je teplota ve stupních Celsia (znaky ve formatu ASCII) zakončenáznakem klávesy Enter, pokud přesměrujete seriový port do aplikace, budese vám jako klávesnicí vypisovat teplota. ( S několika úpravami lze připojiti LED zobrazovač. )
3) Technické parametry
Změřená teplota je vysílána po rozhraní RS232C v textovém formátu ASCIIa ukončena znakem CR (#13).
- rozsah měřených teplot -45 až 130°C
- přesnost čidla +/- 0.75°C
- délka kabelu k měřícímu čidlu až 20 metrů
- napájení 5V
- odběr proudu typicky 15mA, maximálně 20mA
- výstup po RS232C v textovém formátu: -045.0 až _000.0 až _130.0
- nastavení výstupu: rychlost 9600b/s, 1 stop bit, žádná parita
- rychlost měření cca 5-6 vteřin (průměr 256 měření), rychlost měření lzezvýšit snížením počtu průměrovaných měření změnou programu
4) Popis zapojení
Teplota je měřena čidlem Th0 - SMT160-30, což je převodník teplota-střídas převodním vzorcem DC=0.32+0.0047*t, kde DC je střída v rozsahu hodnot0-1 (0-100%) a t je teplota ve stupních Celsia. Střídu změřím jednočipovýmmikropočítačem IO1 – 89C2051, změřenou střídu převedu na stupně Celsiaa v textovém formátu ASCII odešlu sériovým výstupem přes převodník-budičIO2 – MAX232, který převede logické úrovně TTL na logické úrovně rozhraníRS232C +/-12V.
5) Schéma
6) Seznam součástek
- IO1 AT89C2051
- IO2 MAX232 (ICL232), ta nejobyčejnější verze
- X1 krystal 11.059MHz
- Cx1-2 22pF keramika, 2ks
- C0-C4 1uF/25V elektrolyt, 5ks
- C5-7 100nF keramika, 2ks
- C6 50uF/25V elektrolyt
- D1 KY132, libovolná dioda 0.5-1A
- F1 tavná přístrojová pojistka 50-100mA (<5R),
- a držák pojistek (spotřeba je do 20mA)
- Th0 SMT160-30 TO92 a třížilový kabel do 20m
- konektor Cannon9F nebo Cannon25F a propojovací dvojlinka do 15 m
- konektor DIN5M a DIN5F a propojovací 6 žilový kabel
- patice DIL20 a DIL16
- krabička např.: KM26N
- plošný spoj viz příloha v OrCADu
7) Mechanické provedení
Je koncipováno pro připojení k PC. Napájení je realizováno průchozímkonektorem, který se připojí sériově před klávesnici. Výstup může být nakonektor Cannon9 nebo Cannon25. Měřící čidlo může připojeno až 20 metrůdlouhým třížilovým kabelem, který se přímo zaletuje do plošného spoje nebopřes pinový konektor.
8) Matematický popis
Teplotní čidlo SMT160-30 (viz [1]) měří teplotu v rozsahu –45°C až +130°Cs absolutní přesností +/-0.7°C. Napájení je 5V a výstup je slučitelný slogikou TTL. Výstupní obdélníkový signál lze měřit analogově, kdy středníhodnota napětí výstupu je střída*5V, nebo čislicově kdy změříme stříduvýstupního signálu. Výstupní signál je v rozsahu 1-4kHz a střída se rovná:
T1~stavu log. 1, T2~stavu log. 0
Ale měříme střídu a potřebujeme zjistit teplotu.
Tímto převodním vzorcem již získáme teplotu, ale výpočet budeme provádětna 8bitovém jednočipu a je tedy vhodné počítat v pevné řádové čárce. Provedemeúpravy na odstranění desetinných čísel a rozšíříme zlomek číslem 1/0.0047. Přesnost čidla je +/-0.7 °C a odpovídající měřené rozlišení bude vhodnéna desetiny, proto zlomek vynásobíme 10krát a výsledek v pevné desetinné čárce bude v decistupních Celsia.
9) Popis programu
Program se skládá z cyklu následujících úkonů:
- změření střídy signálu čidla
- výpočet převodu střída->teplota v °dC v binární soustavě
- převod z binárního soustavy do kódu BCD
- vyslání sériovým portem v kódu ASCII včetně desetinné tečky
1. Změření střídy signálu čidla
Vlastní měření se provede dvěma 16bitovými časovači jednočipu. Měřímečasy stavů log. 1 a 0 pro několik period signálu (viz [1] str.9). Při krystalu11.059Mhz trvá instrukce a 1 takt časovače cca 1us a nejdelší perioda byměla být 1000us (signál 1kHz), při použití 16bitových časovačů bez přetečeníje vhodné měřit střídu 64 period signálu.
nastavíme režim časovačů a vynulujeme je
; nastavení C/T0 a C/T1 na mod 1, časovač
MOV TMOD, #00010001B;
ANL TCON, #0Fh ; vynulovat přetečení a stopnout je
MOV TL0, #0 ;
MOV TH0, #0 ; nulovaní C/T0
MOV TL1, #0 ;
MOV TH1, #0 ; nulovaní C/T1
měření spustíme od náběžné hrany signálu ; nalezení synchronu
JB T0, $ ;
JNB T0, $ ;
podle log. hodnoty signálu zastavujeme a spouštíme jednotlivé časovače64 krát ve smyčce
loopme: setb TR0 ;
jb T0, $ ;
clr TR0 ; signal v "1"
setb TR1 ;
jnb T0, $ ;
clr TR1 ; signal v "0"
DJNZ R2, loopme ;
ke stavu časovačů přičteme korekční hodnoty, které potřebovali instrukcek jejich zastavení a spuštění a časovače v ten okamžik nečítali a uložímedo proměnných var1 a var2
MOV A, TL0 ;
ADD A, #189 ; korekce za (5-2) instrukce*64-3
MOV var1, A ;
MOV A, TH0 ;
ADDC A, #0 ; pričtení přetečení řádu od TL0
MOV var1+1, A ;
; uložení "0" stavu do var2
MOV A, TL1 ;
ADD A, #64 ; korekce za (3-2) instrukci*64
MOV var2, A ;
MOV A, TH1 ;
ADDC A, #0 ; pričtení přetečení řádu radu od TL1
MOV var2+1, A ;
2. výpočet převodu střída->teplota v °C v binárním soustavě
Jedná se o realizaci výpočtu vzorce:
Rozsahy čísel z časovačů jsou 16 bitů a konstanty 1446 a 681 nevystačís 8 bity a budou 16 bitové. Operací násobení vznikne číslo o 32 bitech,je třeba používat 16-32 bitovou aritmetiku. Tyto výpočty jsem realizovalmakry v souboru MATH.ASM.
nastavíme konstanty 1446 a 681
MOV var3, #0A6h ;
MOV var3+1, #05h ; 1446 = 05A6h
MOV var4, #0A9h ;
MOV var4+1, #02h ; 681 = 02A9h
provedeme součiny čitatele 1446*T1 a 681*T2, a součet jmenovateleT1+T2
SOUCIN var1, var3, var5, var6 ; výsledek do var5
SOUCIN var2, var4, var7, var8 ; výsledek do var7
PLUS var1, var2 ; jmenovatel do var1
teplota může být i záporná, to zjistíme porovnáním součinů čitatele
mov R0, #var5 ;
mov R1, #var7 ;
call cmp ;
JC kladne ;
je-li teplota záporná nastavíme příznak mínus do R7, vypočteme var7:=var7-var5a výsledek přemístíme do var5
MINUS var7, var5 ; záporný čitatel do var7
mov var5, A ;
mov A, var7+1 ;
mov var5+1,A ;
mov A, var7+2 ;
mov var5+2, A ;
mov A, var7+3 ;
mov var5+3, A ;
mov R7, #255 ; znaménko -
JMP hps ;
je-li teplota kladná vypočteme var5:=var5-var7
mov R7, #0 ; znaménko +
výpočteme podíl čitatele var5 a jmenovatele var1
pro zpřesnění vypočtu průměr z 256 hodnot, dělení 256 se provede adresacívýsledku o 1 byte výše
PLUS prumer, var9 ;
INC R6 ;
mov A, R6 ;
JZ nenuly ;
jmp nuly ;
nenuly: NOP ;
3. převod z binárního soustavy do kódu BCD
BINBCD prumer+1, var11 ;
; nulování proměnné prumer
mov prumer, #0 ;
mov prumer+1, #0 ;
mov prumer+2, #0 ;
mov prumer+3, #0 ;
mov prumer+4, #0 ;
4. vyslání sériovým portem v kódu ASCII včetně desetinné tečky
Nastavíme časovač 1 jako generátor hodin pro sériový port. K jednotlivýmBCD číslovkám přičteme číslo 48 (v ASCII ‘0’~48) a vyšleme sériovým kanálem.Nejprve vyšleme případné znaménko mínus. Mezi jednotkami a desetinami vyšlemeznak desetinné tečky a na závěr znak Enter (#13).
nastavení sériového portu na 9600b/s, 8 bitů bez parity
ORL TMOD, #00100000B;
MOV TH1, #0FDh ;
ANL PCON, #7Fh ;
MOV SCON, #01000000B;
SETB TR1 ;
CLR RI ;
CLR TI ;
; znaménko mínus nebo mezera
MOV A, R7 ;
JZ kld ;
mov A, #45 ;
jmp nkld ;
kld: mov A, #32
nkld: MOV SBUF, A ;
JNB TI, $ ;
CLR TI ;
; stovky
MOV A, var11+1 ;
ANL A, #0F0h ;
SWAP A ;
ADD A, #48 ;
MOV SBUF, A ;
JNB TI, $ ;
CLR TI ;
; desítky
MOV A, var11+1 ;
ANL A, #0Fh ;
ADD A, #48 ;
MOV SBUF, A ;
JNB TI, $ ;
CLR TI ;
;jednotky
MOV A, var11 ;
ANL A, #0F0h ;
SWAP A ;
ADD A, #48 ;
MOV SBUF, A ;
JNB TI, $ ;
CLR TI ;
; desetinná tečka
MOV A, #46 ;
MOV SBUF, A ;
JNB TI, $ ;
CLR TI ;
; desetiny
MOV A, var11 ;
ANL A, #0Fh ;
ADD A, #48 ;
MOV SBUF, A ;
JNB TI, $ ;
CLR TI ;
; Enter
MOV A, #13 ;
MOV SBUF, A ;
JNB TI, $ ;
CLR TI ;
na závěr vynuluji pamět a skočím na začátek programu
nuly: MOV R0, #30h ;
MOV R2, #60 ;
nuluj: MOV @R0, #0 ;
INC R0 ;
DJNZ R2, nuluj ;
Pro výpočty jsem napsal makra na součet, rozdíl, součin a podíl. Dálepomocné fce na porovnání dvou čísel a převod z binárního kódu do kódu BCD.(viz MATH.ASM)
Makra SOUCET a ROZDIL jsou posloupností součtu/rozdílu pro čtyři 8bitová čísla s přenosem do vyššího řádu.
Makro SOUCIN se skládá z posloupnosti součtů součinů jednotlivých řádůčinitelů.
Makro PODIL je založeno na binárním postupném dělení, kde se využíváe fektu binární soustavy: dělení dvěma je totéž jako odečtení. Toto makrojako jediné může být v programu použito jen jednou, neboť používá smyčky.Pro vícenásobné použití je třeba udělat kopii jiného názvu s jinými názvynávěští skoků.
Fce CMP porovnává dvě čísla postupně od nějvětšího řádu na shodu, apři neshodě nastaví příznak CY pro první větší číslo.
Fce BINBCD využíná postupného přepočtu binární soustavy řád po řádu(bit po bitu), ale v soustavě BCD. Postupně od nejvyšší bitu vynásobímeBCD číslo dvěma a pokud je následující bit roven "1" přičteme ješte jedničku.
10) Přílohy
- schéma a plošný spoj pro OrCAD386+
- program pro jednočip tep_ok.asm a math.asm
- zkušební program Teploměr pro WIN32 v Delphi a sériovýterminál od ASYNC32 pro Delphi
- pod linuxem lze vyzkoušet pomocí např.: " cat SMT160-30.PDF
- fotografie reálného zařízení : celézařízení , detail plošného spoje
11) Závěr
Přesnost měření jsem ověřil pomocí ustálené směsi vody a ledu pro 0 °C a porovnáním chladnoucí vody v rozsahu 30-80 °C. Měření byla bezpečně vtoleranci +/-1 °C.
Rychlost měření můžeme zrychlit odstraněním průměrování z 256 hodnot.Počet čidel lze přímo rozšířit až na čtyři, připojením na piny T0, T1,INT0 a INT1. Stav těchto vstupů lze testovat instrukcemi s délkou 1 takt.Více čidel lze připojit pomocí multiplexeru. Stavající program však počítás jedním čidlem, pro více čidel stačí udělat nastavení příznaku-čísla měřenéhočidla a zasílaný text rozšířit o číslo čidla.
Příiklad použití http://stoupa.sh.cvut.cz/teplomer/
Obsah:
- Slovo úvodem
- Konstrukce
- Technické parametry
- Popis zapojení
- Schéma
- Seznam součástek
- Mechanické provedení
- Matematický popis
- Popis programu
- Přílohy
- Závěr