Mikrokontrollerek és alkalmazásaik Beadandó feladat Digitális hőmérősor
Sándor Máté Csaba, SAMPAT.ELTE
A tantárgy félév végi feladataként egy önálló projekt elkészítését kaptuk feladatul.
Én
egy
olyan
rendszert
szerettem
volna
építeni,
amely
a
számítógéppel kommunikálva több referenciapont hőmérsékletét is képes frekventáltan mérni. Az eszközt a Kármán áramlástani laboratórium számára tervezem. Az eszköz létjogosultságát az adja, hogy a laboratórium egyes kísérleteiben rétegzett közegek közötti termikus gradienst kell kimérni, és a laboratóriumi eszköz, mely a hőmérő fejet folyamatosan fel-le mozgatja a folyadékban, keverést hoz létre ami nagyban ronthatja a kísérletek pontosságát. Ennek kiküszöbölésére olyan hőmérőrendszert terveztem amellyel akár 16 db mérőfej értéke is kiolvasható kb. 0.5°C pontossággal, így ha ezeket a kísérlet megkezdése előtt a megfelelő magasságban rögzítjük az edény falán, a kísérlet során nem kell azt átpozicionálni. Az eszköz kapcsolási rajzát a dolgozat végére csatoltam. Az alapot egy PIC__A típusú mikrokontroller képzi (az ábrán az órai laborban használt típus látható, sajnos nem találtam a tervező programban meg a valódit). A PIC 5V-os tápfeszültséggel működik, órajelét egy 4MHz-s rezonátor adja a kommunikációt a
VDD-RB2-portsoron
végzi
a
számítógép
COM
portján
keresztül.
A
hőmérsékletmérés egy LM355-ös integrált hőmérőeszközzel valósítottam meg, amely a termisztoron kívül egy műszererősítőt is tartalmaz. A hőmérő fej negatív jelölésű lábát földelve, a pozitívat pedig egy nagy (100K) ellenállással sorosan kötve szobahőmérsékleten az ellenállás táppal szemközti oldalán 1.81
+/- 1 V feszültséget mérhetünk multiméterrel. Ez a pontatlanság az ellenállás címértékének pontatlanságából adódik, ez a fejek egyenkénti kalibrálásával kiküszöbölhető. Az LM335 -40°C-tól 100°C-ig kisebb, mint 1°C hibával dU =10 mV / K lineáris hőmérsékletkövető feszültséget ad, az alacsony felvett dT
áram miatt (0.4-5mA) pedig az önfűtésből adódó pontatlanság elhanyagolható. A mérőfejek kimeneti feszültségét egy CD4067BE típusú multiplexeren keresztül vezettem be a PIC RA0 portjára. A multiplexer 16 állású, azonban most csak 4 fejet kötöttem rá. A vezérlést a PIC C0-C3 portjain oldottam meg, amiből a kisebb 4-es összeállítás miatt csak az első kettőre volt szükség. A multiplexer
címzésekor
a
műszer
dokumentációjában
található
igazságtáblázatot követtem. Ez a gyakorlatban annyit jelentett, hogy a C0->A és a C1->B kapcsolatokon a kívánt sorszámú (0-3) hőmérő számát kellett binárisan (alacsony és magas logikai szinttel) megadni, tehát például a 2-es hőmérő címzésekor a C0->A = 0V, C1->B = +5V szinteket kellett beállítanom. A PIC A/D konvertere 10 bites, tehát 1024 szint megkülönböztetésére képes. Ezt a felbontást alap beállításban a 0-5V tartományon teszi, így az elérhető maximális felbontás ~20mV. Ilyen felbontás mellett a legalacsonyabb elérhető abszolút mérési hiba is 1°C lenne. Ezért a PIC RA2 és RA3 portjait és az ADCON 88-as beállítását használva be tudtam szűkíteni a tartományt egy 2V-os sávba, így a felbontást ~2mV-ra tudtam csökkenteni. Ehhez a fent említett portokra 1V és 3V értékeket kellett kapcsolni, ami ha a szobahőmérsékleten vett 1.81Vos értéket vesszük alapul, a műszer mérési tartományát megfelelően lefedi. Az AD
konverter
referenciafeszültségeit
egy
3V-os
nyitófeszültségű
LED-el
stabilizált feszültségosztóval biztosítottam. A
műszerhez
a
vezérlőprogramot
az
órákon
tanult
MikroPascal
programnyelvben írtam. A programkód a dolgozat végén csatolva található. A kód kezdetén inicializálja az Usart kommunikációt, valamint az AD konvertert beállítja a már említett 88-as üzemmódba. A program a kezdőszöveg kiíratása után a C porokat alaphelyzetbe állítja majd egy végtelen ciklusba lép be. Itt a beállított késleltetési idő után (itt 1s, a valós mérésben 30s lesz a hőváltozáskövetés miatt) beolvassa az 1. hőmérő feszültségét, majd átalakítva stringgé az Usart kimenetre küldi a fej sorszámát és a mért értéket. A fejeket még nem kalibráltam, de utána a megfelelő értékeket fogom kiíratni. Ez úgy fog történni,
hogy a programmal kiszámoltatom az adott fej referencia-hőmérséklethez tartozó szintje és a beolvasott érték közti különbéget, majd ezt a műszerre jellemző gradienssel megszorozva megkapom a Celsius fokban mért értéket. A végtelen ciklusban léptetve végighalad az i=0-3 értékeken, és az ezekhez az értékekhez tartozó logikai értékeket adva a C portokon visszakapjuk a megfelelő fejen megjelenő hőmérsékleteket az Usart terminálban. A programhoz a jövőben a pontos kalibráláson és a 16 hőmérőfejre való bővítésen kívül tervezem a megfelelő használatkész elkészítést és tokozást. A megfelelő működés elérése után szeretnék a programhoz egy kezelői felületet készíteni a LabView program segítségével.
A PIC-be égetett kód: program homero_sampaat; var i:byte; ad:word; i_str:string[1]; ad_str:string[8]; t1,t2:string[32]; t3:string[16]; t4:string[3]; const shift :array[4] of word = (($00000000),($10000000),($01000000), ($11000000)); begin i:=0; t1:='Hőmérsékletmérés multiplexerrel:'; t3:='hőmérő:'; t4:='°C'; Usart_Init(9600); Usart_Write_Text(t1); TRISC:=$F0; ADCON1:=$88; PortC.0:=0; PortC.1:=0; PortC.2:=0; PortC.3:=0; while True do begin Delay_ms(1000); i:=(i+1) mod 4; WordToStr(i,i_str); Usart_Write_Text(i_str); if i<3 then PortC:=shift[i]; ad:=Adc_Read(0); Delay_ms(500); WordToStr(ad,ad_str); Usart_Write_Text(t3); Usart_Write_Text(ad_str); Usart_Write_Text(t4); end; end.
Az összeállítás kapcsolási rajza: