Jste zde

Teploměr pro rozhraní RS-232C

Chcete-li si postavit teplotní snímač připojený např. k PC přes sériové rozhranní RS-232C, či Vás jen zajímá způsob měření z dalšího zpracování, pak právě pro Vás je tento článek určen, ale nejen pro Vás, doufám, že zaujme i ostatní kutily.

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ů:

  1. změření střídy signálu čidla 
  2. výpočet převodu střída->teplota v °dC v binární soustavě 
  3. převod z binárního soustavy do kódu BCD 
  4. 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

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

MOV R2, #64 ; 64 meření
JB T0, $ ;
JNB T0, $ ;

podle log. hodnoty signálu zastavujeme a spouštíme jednotlivé časovače64 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 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

; 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 °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

; 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 jmenovateleT1+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-var5a 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

MINUS var5, var7 ; kladný čitatel do var5
mov R7, #0 ; znaménko +

výpočteme podíl čitatele var5 a jmenovatele var1

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

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

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:

 

Autor textu: MartinZeman
Martin.Zeman@ seznam.cz

Autorovahome page
Hodnocení článku: