Semestrální práce EOM
Rudolf Marek
Měření teploty přes sériový port
Zadání: Vyrobte teploměr k PC.
Řešení:
Původně jsem počítal s termistorem připojeným do game portu, kde bych měřil dobu vybití vnitřního kondenzátoru. Ani po dvou dnech usilovného snažení se mi integrovaný gameport nepodařilo zprovoznit a tak jsem přemýšlel o alternativním řešení.
Příliš jiných možností se nenabízelo, zbývaly sériové porty, PS/2 konektor, pararelní port a USB. Rozhodl jsem se zařízení realizovat v sériovém portu.
Kondenzátor budu přes termistor nabíjet a měřit čas za jak dlouho se nabije. Doba nabíjení je závislá na velikosti připojeného odporu(termistoru) tau = C*R, odpor se mění s teplotou (jedná se o termistor) proto bude stačit naměřené hodnoty převést z časové oblasti do oblasti v níž se obyčejně teplota měří tedy do stupňů.
Byl jsem přesvědčen, že bude nejvýhodnější použít stavových bitů modemu k ovládání a měření přivedených napětí na kondenzátor.Vyhledávač google nabídlo takové schéma:
http://users.auth.gr/~mixos/projects/nopcb/pc/006/

Zbývalá tedy vyřešeit pouze dva problémy. Jakým způsobem se zařízením komunikovat v prostředí OS Linux a jak měřit časový interval.
Rozhodl jsem se neimplementovat speciální ovladač do jádra systému. Zjistil jsem, že díky normě POSIX je možné pomocí systémových volání IOCTL ovládat stav modemu přímo z uživatelského procesu. Po dlouhém hledání jsem nalezl užitečnou stránku popisující všechny potřebné volání i s popisem jednotlivých parametrů.
http://www.easysw.com/~mike/serial/serial.html#2_2_1
Princip měření:
Kondenzátor jsem vybil přes diodu (DTR = 0), pak jsem DTR nastavil na 1 a měřil čas, kdy DSR dosáhnena 1. Pak je kondenzátor nabit. Uplynulý čas je funkcí teploty.
První varianta programu eom.c čas měřila v busy-loop. Proces byl systémovým voláním ozančen za realtimový a tak dostával častěji přidělen procesor. Výsledky měření se ale při větší zátěži příliš lišili (o 10 – 20 ms) a tak jsem se rozhodl pro jinou cestu.
Pěkné by bylo proces uspat a vždy po nějaké době probudit a zkontrolovat stav modemových bitů. Funkce nanosleep sice nabizí uspání času v nanosekundách ale na PC je rozlišení jen 10 ms.
Pro přesnějších měření času lze použít RTC. V Linuxu reprezentované /dev/rtc.
Podle /usr/src/linux/Documentation/rtc.txt jsem program opravil a nazval ho eom_rtc.c. Uspání procesu zajišťovalo blokující čtení /dev/rtc. Jádro přstalo čtení blokovat jakmile se objevilo přerušení IRQ 8, mým programem generované v rytmu 4096 Hz.
Jakmile program dával smyluplné hodnoty v [ms], rozhodl jsem se teploměr zkalibrovat. Uvařil jsem horkou vodu, strčil termistor do mikroténového pytlíku a laboratorním teploměrem jsem si vynášel hodnoty teplot a času. Graf vypadá takto:

Naneštěstí jsem v OpenOffice nenašel rovnici spojnice trendu a tak jsem byl nucen potupně použít Excel. Získnou rovnici jsem dosadil do programu. Provedl jsem regresi exponencíální i logaritmickou křivkou, přičemž přesnějších výsledků dosahuje křivka exponencíální.
Programy jsou přibaleny v příloze.
Závěr: Měření se mi líbilo. A ted vážně. Teploměr zdařile funguje od +5 do + 80, pro teploty menší není možné kondenzátor nabít a teploměr se zasekne (asi kvůli diodě ???) možná by stačilo předřadit nějaký odpor aby se rozsah měřených teplot posunul. Výměna termistoru za jiný nepomohla.
Doufám že si spíše než naměřené hodnoty, potenionální čtenář povšimne softwarové realizace v prostředí OS Linux.