Záměrem bylo vytvořit bateriově napájený teploměr, který umožní navíc naměřenou teplotu v předem stanovených časových intervalech ukládat do paměti eeprom. Veškerá komunikace, nastavování a čtení naměřených hodnot z paměti je realizováno přes asynchronní sériovou linku (RS232) pomocí PC. Napájení je uvažováno z baterie, proto byla snaha minimalizovat odběr proudu zařízení.
Blokové schéma
Jako řídící kontrolér je použit MC9S08QG8. Na obr. 1. je blokové schéma přístroje včetně využití periferií mikrokontroléru. Teplota se měří digitálním senzorem DS18B20 od Maxim-Dallas s rozhraním 1-wire. Přesnost měření je dána přesností senzoru +-0,5 st. C v intervalu -10 až +85 st. C. Teplota se měří v nejvyšším rozlišení 12 bitů. Naměřená data jsou ukládána do seriové eeprom 24LC512, se kterou se komunikuje přes I2C sběrnici. Ke zobrazování naměřené teploty je použit displej z mobilního telefonu Nokia 3310, který obsahuje řadič PCD8544 se synchronním sériovým rozhraním SPI. Na displeji se zobrazuje teplota na tři platné číslice z toho jedno desetinné místo. Stav baterie je sledován pomocí analogového komparátoru mikrokontroléru (ACMP) a nízké napětí indikováno symbolem na displeji. Ke konfiguraci zařízení z PC je použit seriová linka RS232 a periferie SCI mikrokontroléru. Mikrokontrolér kvůli omezení spotřeby proudu podstatnou část doby stráví ve STOP modu, proto se využívá externí přerušení (KBI periferie) napojené na Rx pin SCI, které probudí MCU, pokud je komunikace s PC aktivní.
Obr. 1 Blokové schéma
Podrobné schéma zapojení
Obvody IO1, IO2 jsou připojeny k mikrokontroléru obvyklým (katalogovým) způsobem. LCD displej je na samostatné desce s plošnými spoji připojen přes konektor SV1. Zapojení desky displeje je pak na obr. 3. Vzhledem k tomu, že bylo záměrem podpořit mód činnosti přístroje, kdy je displej vypnut (viz dále), je napájení LCD připojeno přímo na PTA3 pin MCU. Displej má odběr proudu menší než 1 mA (střední hodnota je asi 0,3 mA), což by měl pin MCU zvládnout. Napájení aplikace je uvažováno ze dvou tužkových článků (AAA), o celkovém napětí 3V. Ke kontrole baterie je použit interní analogový komparátor MCU, jehož neinvertující vstup je připojen k interní referenci asi 1,2 V (bandgap reference) a invertujicí vstup vyveden na pin PTA1 MCU. Zde je připojen dělič napětí R4, R5, který snižuje napětí tak, aby k překlopení komparátoru docházelo při napětí baterie asi 2V. Jelikož dělič vytváří na pinu PTA1 napěťovou úroveň, která neodpovídá logikým úrovním MCU, dochází tím ke zvýšení odběru proudu. Proto je R4 místo na zem připojen k pinu PTA4, který logickou 0 dělič uzemní jen po velmi krátkou dobu kontroly napětí baterie. Logická 1 na tomto pinu vyřadí dělič z činnosti a omezí se tak odběr proudu. Konektor SV2 slouží k připojení sériové komunikace z PC. Převodník úrovní RS232 není z důvodu úspory místa a odběru proudu realizován a musí se připojit externě mezi teploměr a PC. Konektor SV3 slouží k připojení programovacího adaptéru (USB SPYDER).
Popis činnosti zařízení
Teploměr pracuje ve třech režimech činnosti, které se dají přepínat přes seriovou linku z PC.
- Měření a zobrazování teploty bez zápisu naměřených hodnot do eeprom
- Měření a zobrazování teploty se zápisem naměřených hodnot do eeprom
- Měření teploty a zápis naměřených hodnot do eeprom bez zobrazování na displeji.
Činnost SW mikrokontroléru v jednotlivých režimech je zachycena na obr. 4 – 6.
Konverze teploty senzoru v nejvyšším rozlišení trvá podle manuálu maximálně 750ms. Minimální perioda mezi dvěma měřeními byla stanovena na 2 sekundy, aby k měření teploty nedocházelo příliž často. Přes SCI lze zadat časový interval v minutách a sekundách ve kterém se budou naměřené údaje ukládat do eeprom. Tento interval musí být také v násobcích 2 sekund. V režimu 1 tedy MCU zahájí měření teploty a vstoupí do STOP módu při čekání na dokončení měření na dobu 1 sekundy. Poté přečté naměřenou teplotu a zobrazí na displeji a opět vstoupí do STOP módu na dobu 1 sekundy. Pak se celý cyklus opakuje. Režim 2 je podobný, jen rozšířen o čítač (LogCounter), který se inicializuje na počet sekund, po jejichž uplynutí se zapíše měřená hodnota do eeprom. V každém z jedno-sekundových intervalů je čítač snížen o jedničku.
K dlouhodobějšímu záznamu teplot bez přítomnosti osob je určen režim 3. Spotřeba proudu z baterie je v tomto režimu zmenšena vypnutím displeje a skutečností, že MCU komunikuje se teplotním senzorem a pamětí eeprom pouze po uplynutí časového intervalu daného čítačem LogCounter. MCU se tedy probouzí ze STOP módu každou sekundu na velmi krátký okamžik, víceméně pouze na manipulaci s čítačem LogCounter.
Je-li detekována aktivita na komunikační lince (Log. 0 na Rx pinu MCU) pomocí externího přerušení (KBI), zařízení vystoupí z měřících režimů a zahájí komunikační proces. Přenosová rychlost je nastavena na 4800 Bd. Komunikační rámec asynchronní komunikace má 8 datových bitů, bez parity, 1 stop bit. Zahájení komunikačního procesu je signalizováno vypsáním výzvy na terminál:
"q=quit, c=change config, d=dump log, g=get config, s=log size\n"
Odesláním příslušného znaku z terminálu se provede zvolená akce.
S – vypíše počet zaznamenaných hodnot v paměti
G – vypíše nastavený režim a časový interval ukládání do eeprom
D – vypíše postupně všechny naměřené hodnoty uložené v eeprom (ASCII oddělené čárkou – lze přímo ukládat do textového souboru)
C – změna režimu (1-3) a časového intervalu – zadávají se v minuty a sekundy (obě hodnoty max. 255)
Q – návrat do zvoleného měřícího režimu
Zadaná konfigurační data jsou uložena do eeprom.
Obr. 4 - Režim 1.
Obr. 5 - Režim 2
Obr. 6 - Režim 3
Struktura SW a konfigurace periferií
K vývoji SW bylo použito prostředí CodeWarrior for MCUs V6.1. Ke konfiguraci pereferií MCU byl použit nástroj Processor Expert, který nabízí sadu tzv. Beans. Obr. 7 zachycuje strukturu SW.
Hlavní stavový automat (funkce main), který realizuje Režim 1 až 3 je uložena v modulu Teplomer.c (na obr.7 označeno červeně). Střední vrstva SW implementuje komunikaci s jednotlivými externími obvody (na obr. 7 označeno bíle). Nejnižší vrstva SW je vytvořená pomocí beanu v nástroji Processor Expert (na obr. 7 označeno modře), která již přímo ovládá buď interní periferie mikrokontroléru, nebo externí obvody (na obr. 7 označeny zeleně).
Data v paměti eeprom jsou organizována tak, že 6 byte na začátku paměti zabírají konfigurační data, zbytek je k dispozici pro ukládání naměřených hodnot. Naměřená hodnota má velikost 2 byte, takže do paměti 24LC512 se vejde přes 32 tisíc hodnot. Pokud se paměť naplní další data se již nezapisují a je nutné vyčíst obsah paměti do PC, čímž se paměť zároveň vymaže. Konfigurační data obsahují 2 bytový ukazatel na místo, kam se bude zapisovat další naměřená hodnota. Po zápisu se ukazatel zvýší o 2. Ukazatel zároveň udává kolik paměti je obsazeno. Vymazaní paměti se provede pouze vynulováním tohoto ukazatele. Dále je v konfigurační oblasti uložen zvolený režim měření (1 byte) a časový interval ukládání naměřených hodnot do eeprom (2 byte). Zbývající byte konfigurační oblasti je zatím nepoužitý.
LCD displej má organizaci 84 pixelů na šířku a 48 pixelů ba výšku. Fonty číslic zabírají většinu plochy displeje (obr. 8), což znamená poměrně velké množství dat při každém zápisu do řadiče LCD a tedy i času, který MCU stráví v aktivním módu s vyšší spotřebou. Z toho důvodu se při měření teploty uschovává hodnota z předchozího měření, porovná se s aktuální hodnotou a zápis do LCD se provádí jen pokud je teplota odlišná od předchozí. Dále po převodu naměřené teploty na desídkový kód (BCD) se uschová rovněž každá číslice a do LCD řadiče se zapisuje jen ta číslice, která se změnila od předchozí hodnoty. Pokud poklesne napětí baterie pod asi 2V, na displeji se zobrazí symbol v levém horním rohu – viz obr. 8. V levém dolním rohu se zobrazuje symbol „L“ pokud je aktivní režim měření s ukládáním do paměti eeprom. Po připojení napájecího napětí se na asi 1 sekundu zobrazí nastavený měřící režim, pak se teprve zahájí vlastní měření.
Hodinový signál pro MCU vytváří intení oscilátor 31.25 kHz, jehož hodnota není uplně přesná, ale je možné ji zápisem do trimovaciho registru nastavit na žádanou hodnotu. V paměti flash je navíc vyhrazeno místo místo pro trvalé uložení této hodnoty. CPU bean v Procesor Expert nabízí volbu zkopírování této hodnoty do příslušných registrů automaticky v inicializaci mikrokontroléru. Kmitočet interního oscilátoru je dále zvyšen pomocí PLL na výslednou hodnotu bus clock 1 MHz. Pro úsporu spotřeby proudu je využíván STOP3 mód procesoru. V tomto módu dojde ke kompletnímu vypnutí CPU a některých periferií, obsah paměti RAM i log. úrovně na I/O portech jsou zachovány. Procesor se ze stop módu probouzí buď resetem nebo přerušením od vybraných periferií. V této aplikaci se využívá přerušení od KBI modulu (externí přerušení), které signalizuje aktivitu na Rx pinu asynchronní sériové komunikace (PC) a dále se procesor probouzí přerušením od časovače RTI, který je nastaven na přerušení po cca 1 sekundě (viz popis režimů). V aplikaci je využito také přerušení po přijetí znaku SCI modulem (z PC), toto přerušení ale vzbudit procesor ze stop módu nedokáže, proto bylo nutné využít KBI modulu.
AsynchroSerial bean pro obsluhu SCI periferie nabízí možnost použití kruhového bufferu při vysílání i příjem dat. V této aplikaci je využit buffer pro vysílání dat směrem do PC spolu s přerušením od vysílače. Bean dává k dispozici funkci SendBlock, která blok dat zkopíruje do bufferu a postupně v přerušení odvysílá. V aplikaci je toho využito při vyčtení naměřených hodnot z eeprom a odeslání do PC. Zatímco program vyčítá nová data z eeprom, v přerušení jsou „na pozadí“ odesílány již dříve vyčtená data do PC pomocí bufferu v AsynchroSerial beanu.
Odběr proudu a napájení
Odběr proudu ze zdroje v režimu 1 po dobu 2-sekundové periody je orientačně zachycen na obr. 9
Na začátku MCU odešle povel pro zahájení konverze (asi 4 ms, 1.5 mA), pak přejde do STOP módu. Dále odebírá proud hlavně teplotní senzor po dobu konverze (asi 650 ms, 1mA), zbytek do konce 1. sekundy jen displej (0.1 – 0.3 mA). Na začátku druhé sekundy se vzbudí MCU, vyčte naměřenou teplotu (asi 5 ms, 1.5 mA) a poud není potřeba další akce, přejde opět do STOP módu až do konce druhé sekundy. Pokud se zobrazuje nová hodnota na displej, nebo zapisuje do eeprom, doba aktivního režimu je delší delší (až 150 ms, čárkovaně).
Obr. 9 Spotřeba v režimu 1
Obr. 10 Spotřeba v režimu 3
Daleko úspornější je režim 3, kdy je vypnutý displej a interval měření teploty a ukládání do paměti je zvolen mnohem delší než 2 sekundy. Pak ve STOP módu má celé zařízení odběr jednotky, max desítky uA (obr. 10). Jen jednou za čas je odběr vyšší při měření teploty a uložení do eeprom (čárkovaně). Relativně největší odběr se všech součástek ma teplotní senzor, vzhledem k tomu, že doba konverze v nejvyšším rozlišení (12 bitů) trvá skoro ¾ sekundy. Možností, jak zkrátit dobu konverze a tím spotřebu senzoru, je snížit rozlišení. Při 11. bit rozlišení trvá doba koverze max. 350ms, při 10. bit. rozlišení 150 ms. Při nižších rozlišeních by bylo nutné zvážit, zda má význam zobrazovat na displeji i desetiny stupně Celsia. Další možností, jak zmenšit spotřebu je použít jiné digitální čidlo teploty (z digitálních čidel má o něco nižší spotřebu např. MCP 9800 od Microchip), nebo použít analogový senzor teploty spolu s A/D převodníkem, což ale povede ke složitějšímu programu MCU, který bude muset pracovat delší dobu v run módu s vyšší spotřebou.
Spodní mez napájecího napětí použitých součástek je vesměs kolem 2,5 – 2,7 V, MCU dokonce od 1,8V. Jen teplotní senzor pracuje až od 3V. Přímé napájení ze dvou alkalických baterii tedy není moc efektivní. Firma Maxim-Dalas má ve své nabídce zajímavý obvod MAX679, který na principu nábojové pumpy zvyšuje vstupní napětí z rozsahu 1.8 až 3.6V a reguluje výstupní napětí na 3.3 V.
Obvod nepotřebuje ke své činnosti externí indukčnost a má klidový odběr 50 uA. Zapojení tohoto obvodu vhodné pro tuto aplikaci je na obr. 11.
Obr. 11 Regulátor napětí baterie
Realizace
Prototyp teploměru byl realizován na nepájivém kontaktním poli (obr. 12 uprostřed, obr. 13). Pro displej byla vyrobena pomocná deska s plošnými spoji, která obsahuje plošky přesně odpovídající roztečí kontaktům displeje (obr 12 dole). Na displeji jsem ponechal kousek plastoveho profilu, za který se displej přišroubuje vruty k desce (obr. 8). Programátor a debbuger USB SPYDER (obr. 12 vlevo) byl propojen jediným vodičem k pinu PTA4 MCU. Deska na obr. 12 vpravo obsahuje převodník úrovní RS232 na 3V logiku a zdroj napětí 3,3V (není součástí teploměru).
Regulátor napětí baterie zatím nebyl zapojen.
Obr. 12 Prototyp teploměru
Obr. 13 Detail nepájivého pole
Závěr
V další etapě bude navržena a realizována deska s plošnými spoji pro teploměr. Deska bude obsahovat na jedné straně většinu součástek v SMD provedení, na druhé straně bude pouzdro na baterii a konektory. Deska teploměru se připojí přes konektor SV1 k desce displeje, tzn. desky budou umístěny nad sebou.
Literatura, zdroje:
- [1] MC9S08QG8 datasheet, Freescale
- [2] 24LC512 512K I2C™ CMOS Serial EEPROM datasheet, Microchip
- [3] DS18B20 datasheet, Maxim-Dallas
- [4] AN 126 1-Wire Communication Through Software, Maxim-Dalas
- [5] MAX679 datasheet, Maxim
- [6] PCD8544, 48 × 84 pixels matrix LCD controller/driver, datasheet, Philips
- [7] http://serdisplib.sourceforge.net/ser/pcd8544.html
- Soutěž vývojářů s USB SPYDER
- Výsledky soutěže vývojářů s USB Spyder
Komentáře
Protokol
Vše super, jen z praxe doporučuji přidat jakýkoli protokol k přenosu dat po RS232. Byť by to mělo být i jen zabezpečení CRC či LRC (checksum).
A co takhle přidat funkci termostat ...?
Zdravím, je to úžasný, ale slušelo by tomu vytvořit i zapojení termostatu, který by dokázal udržovat nastavenou teplotu na 0,2°C (úplně by stačil jen režim DEN/NOC a bez ukládání teplot v čase) a s nějakým výstupem pro ovládání "něčeho". Třeba něco, co by dokázalo dálkově ovládat topidlo = třeba encodér s RF modulem. Potřeboval bych něco takového na regulování topidel v jednotlivých obytných místnostech domu. A kdyby se dal použít nějaký barevný displej (mám tady chabrus N5230 s dobrým displejem?) a napájení z baterie pro mobily, bylo by to boží - a pěkně malé. Ten displej by ani nemusel svítit non-stop, mohl by se rozsvěcet dle potřeby místně tlačítkem, nebo (v luxusním aranžmá) dálkáčem ...??? Ať se daří!
alt.sm-5x2obfq@yopmail.com
A co takhle přidat funkci termostat.
Je to nádherné, a tak by tomu slušelo vylepšení. Stačilo by, kdyby to dokázalo hlídat nastavenou teplotu (úplně postačuje režim DEN/NOC), žádné týdenní programy, dovolená apod., ale aby to umělo ovládat "něco", co by ovládalo topidlo. Např. encodér pro DO s RF modulem = teplota v místnosti dosáhne nastavené úrovně - rádio vyšle povel pro topidlo, aby vypnulo; teplota klesne pod nstavenou teplotu - rádio vyšle povel pro topidlo, aby začalo topit. To úplně stačí!! A kdyby se dalo použít byrevný displej, tak by to bylo boží. Displej by nemusel ani svítit non-stop, stačilo by, zapínat jej podle potřeby tlačítkem, nebo v luxusním aranžmá dálkáčem ... a napájení baterií z mobilu.
alt.sm-5x2obfq@yopmail.com