Abstrakt: Komunikace s teplotním čidlem DS18B20 připojeným ke sběrnici one-wire.
DS18B20 je běžně dostupný digitální teploměr, který je schopen měřit v rozsahu -55°C až +125°C s přesností ±0.5°C garantovanou v teplotním rozsahu -10°C to +85°C. Data jsou ze senzoru získávána pomocí jedno-vodičového seriového rozhraní (1-wire interface) s uživatelsky programovatelnou přesností 9 - 12 bitů (tzn. rozlišení rozlišení 0.5 - 0.0625°C). Pro komunikaci se používá jeden datový a dva napajecí vodiče (GND, VDD, DQ). Napájecí napětí VDD se může pohyboat v rozmezí 3.3V až 5.5V. Mimo to lze senzor provozovat v tzv. parazitním režimu využívajícím pouze dvou vodičů.
Kromě měření teploty obvod disponuje funkcí digitálního termostatu, jehož dolní a horní hranici lze programově nastavit a uložit do EEPROM paměti na čipu. Při čtení naměřené hodnoty jsou pak k dispozici bity informující o překročení naprogramovaných rozsahů.
Každý obvod má již z výroby přiděleno své vlastní unikátní 64-bitové seriové číslo, které slouží k adresaci konkrétního senzoru. Seriové číslo společně s unikátním protokolem identifikace připojených zařízení ke sběrnici umožňuje provozovat několik senzorů na jednom datovém vodiči. Mimo to nabízí obvod možnost využít napěťový signál pro přenos dat, čímž se celkový počet vodičů nutný k připojení senzorů redukuje na dva (GND, VDD/DQ).
Aplikace umožňuje snímat teplotu z jednoho senzoru DS18B20 připojeného k jednomu z pinů FPGA obvodu. Komunikaci s čidlem a realizaci 1-wire protokolu zajišťuje řadič uvnitř FPGA. Mikrokontroler obsahuje rutiny, které jsou schopny znicializovat teplotní čidlo a změřit teplotu. Rutiny využívají příkazu čtení a zápisu bytu poskytovaného FPGA řadičem.
Řadič v FPGA se skládá z konečného automatu, který zajišťuje a) čtení 8-bitové informace, b) zápis 8-bitové informace, c) inicializaci teplotního sensoru a detekci jeho připojení. Zdrojový kód řadiče lze nalézt v souboru one_wire.vhd.
Vlastní měření realizuje rutina measuretemp()
uvedená v souboru main.c. Tato funkce využívá následující jednoduché rutiny komunikující s řadičem v FPGA:
onewire_reset()
- nařídí řadiči v FPGA zinicializovat zařízení (je-li nějaké připojeno)
onewire_write()
- řadič v FPGA pošle přes 1-wire 8-bitové slovo
onewire_read()
- řadič v FPGA přečte z 1-wire 8-bitové slovo a vrátí je mikrokontoleru (v rutině se aktivně čeká na dokončení operace)
Pomocí těchto funkcí jsou zasílány příkazy a čteny data ze senzoru. Nejdříve je zahájen převod teploty (příkaz 0xCC 0x44), poté se aktivně čeká, až je převod dokončen a následně je přečtena naměřená hodnota (příkaz 0xCC 0xBE). Bližší informace naleznete v příslušném datasheetu.
Zdrojové kódy aplikace lze nalézt v SVN.
přeložte aplikaci
připojte teplotní senzor na předposlední pin horní řady konektoru JP10 dle nákresu na obrázku 3.1. Datový vodič je nutné opatřit pull-up resistorem o odporu několik kilo ohmů.
naprogramujte MCU a FPGA a spusťte terminálový program nebo vytáhněte propojky J8/J9
Pokud je senzor připojen, měla by se na displeji zobrazit naměřená teplota, která se aktualizuje každou sekundu.