Teploměr pro rozhraní RS232C
Vypracoval: Martin Zeman
6.1. 2000
Základní popis: změřená teplota je vysílána po rozhraní RS232C v textovém formátu ASCII a ukončena znakem CR (#13).
Technické parametry:
Popis zapojení: teplota je měřena čidlem Th0 - SMT160-30, což je převodník teplota-střída s převodním vzorcem DC=0.32+0.0047*t, kde DC je střída v rozsahu hodnot 0-1 (0-100%) a t je teplota ve stupních Celsia. Střídu změřím jednočipovým mikropočítačem IO1 – 89C2051, změřenou střídu převedu na stupně Celsia a 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.
Schéma:
Seznam součástek:
Mechanické provedení:
Je koncipováno pro připojení k PC. Napájení je realizováno průchozím konektorem, který se připojí sériově před klávesnici. Výstup může být na konektor 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 nebo přes pinový konektor.
Realizovaný teploměr ukazují následující obrázky:
Popis:
Teplotní čidlo SMT160-30 (viz [1]) měří teplotu v rozsahu –45°C až +130°C s absolutní přesností +/-0.7°C. Napájení je 5V a výstup je slučitelný s logikou 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řídu vý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ět na 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.
Popis programu
Program se skládá z cyklu následujících úkonů:
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 krystalu 11.059Mhz trvá instrukce a 1 takt časovače cca 1us a nejdelší perioda by mě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
; meření střídy, log 1
- počet taktů v C/T0, log 0 - počet taktů v C/T1
; nastavení C/T0 a C/T1 na mod1, č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
MOV R2, #64 ; 64 meření
JB T0, $ ;
JNB T0, $ ;
podle log. hodnoty signálu
zastavujeme a spouštíme jednotlivé časovače 64 krát ve smyčce
; vlastní měřící smyčka
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 instrukce k jejich
zastavení a spuštění a časovače v ten okamžik nečítali
a uložíme do proměnných var1 a var2
; uložení "1"
stavu do var1
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 °dC 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 realizoval makry v souboru MATH.ASM .
nastavíme konstanty 1446 a 681
; konstanty do var3 a var4
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 jmenovatele T1+T2
; výpočet teploty
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
; zjisteni znamenka
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-var5 a výsledek přemístíme
do var5
MINUS var7, var5 ; záporný
čitatel do var7
mov A, var7 ; přemístění
do var5
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
kladne: MINUS var5, var7 ;
kladný čitatel do var5
mov R7, #0 ; znaménko +
výpočteme podíl čitatele var5
a jmenovatele var1
hps: PODIL var5, var1, var9, var10 ; var9 výsledek
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
; průměr z 256 hodnot
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
; převod do 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ým BCD čí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šleme znak desetinné tečky a na závěr znak Enter (#13).
; nastavení sériového
portu na 9600b/s, 8 bitů bez parity
ANL TMOD, #0Fh ;
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
;nulování paměti
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ále pomocné 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 8 bitová čí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á efektu binární soustavy: dělení dvěma je totéž jako odečtení. Toto makro jako 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ázvy návěští skoků.
Fce CMP porovnává dvě čísla postupně od nějvětšího řádu na shodu, a př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íme BCD číslo dvěma a pokud je následující bit roven '1' přičteme ješte jedničku.
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ě v toleranci +/-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řílohy: