Meranie teploty pomocou senzora s rozhraním I2C
1. Teoretický úvod
Integrovaný obvod BMP280 od firmy BOSH je digitálny senzor tlaku, ktorý umožňuje aj meranie teploty. Umožňuje merať tlak v rozsahu od 30 kPa do 110 kPa. Jeho relatívna presnosť je ±12 Pa, čo je ekvivalentné zmene nadmorskej výšky o ±1 m, preto je možné použiť senzor aj ako výškomer. Senzor umožňuje merať teplotu v rozsahu -40 °C až +85°C, ale najvyššiu presnosť merania teploty dosahuje v rozsahu (0 ÷ +65) °C a to ±1 °C (v okolí 25 °C je presnosť ±0,5 °C). Maximálne rozlíšenie výstupných dát pri meraní tlaku je 0,16 Pa a pri meraní teploty 0,01 °C. Senzor dosahuje spotrebu iba 2,7 µA pri frekvencii vzorkovania 1 Hz. Je možné ho napájať napätím od 1,71 V do 3,6 V. Senzor komunikuje cez rozhranie I2C alebo SPI.

V laboratórnom cvičení budeme používať senzor BMP280 umiestnený na rozširujúcej doske plošných spojov (Obr. 2) kvôli možnosti jeho umiestnenia do prepojovacieho poľa. DPS obsahuje okrem senzora aj potrebné pasívne súčiastky.

Schéma zapojenia BM280 spolu s diskrétnymi súčiastkami je na Obr. 3. Kondenzátory C1 a C2 slúžia na filtrovanie možných rušivých zložiek z napájania. Rezistor R1 slúži ako pull-up rezistor na aktiváciu I2C rozhrania. Podobne rezistory R2 a R3 plnia funkciu pull-up rezistorov pre dátové linky I2C rozhrania - SDA a SCL. Rezistor R4 plní funkciu pull-down rezistora a pri výbere I2C komunikácie nastavuje východiskovú adresu senzora. Východisková 7-bit adresa senzora je 0x76. V prípade, že je vývod SDO pripojený na +3,3 V, tak je I2C adresa nastavená na 0x77.

Zapojenie vývodov rozširujúcej DPS je uvedené na Obr. 4.

# | Názov vývodu (I2C) | Názov vývodu (BMP280) | Názov vývodu (SPI) | Funkcia |
---|---|---|---|---|
1 | VCC | VDD | VCC | Napájanie 1,71 V ÷ 3,6 V |
2 | GND | GND | GND | Zem |
3 | SCL | SCK | SCK | Taktovací (hodinový) signál (I2C + SPI) |
4 | SDA | SDI | MOSI | Dátový vodič (I2C), dátový vstup (SPI) |
5 | CSB | CSB | CSB/CS | Voľba medzi I2C/SPI, chip select (SPI) |
6 | SDO | SDO | MISO | Dátový výstup (SPI) |
Senzor podporuje komunikačné rozhrania I2C a SPI. Voľba rozhrania je realizovaná pomocou vývodu CSB. Ak je vývod CSB pripojený na napájanie (+3,3 V), tak je aktivované rozhranie I2C. V prípade, že je vývod CSB uzemnený, tak je aktivované rozhranie SPI. Zo schémy na Obr. 3 je vidieť, že vývod CSB je pripojený cez pull-up rezistor na napájanie, čo znamená, že je aktivované komunikačné rozhranie I2C aj v prípade, že je vývod CSB nezapojený.
Mapa registrov senzora BMP280
Namerané hodnoty tlaku a teploty, ako aj nastavené parametre senzora sú uložené na pamäťových miestach, ktoré nazývame registre. Pre prácu so senzorom je kľúčová tzv. mapa registrov. Mapa registrov obsahuje názvy a adresy jednotlivých registrov a takisto ich štruktúru. Mapa registrov je zobrazená na Obr. 5. Napríklad, identifikačné číslo (ID) senzora je uložené na adrese 0xD0. Na tejto adrese je uložená hodnota 0x58 (88D), ktorú by sme mali prečítať cez rozhranie I2C alebo SPI a tak si overíme, či máme funkčné a správne nastavené komunikačné rozhranie.

Ďalej sú popísané iba registre, ktoré priamo súvisia s náplňou laboratórneho cvičenia, ktorou je meranie teploty.
Register calib
Senzor je kalibrovaný počas výroby a kalibračné konštanty sú vpísané do ROM (pamäť, v ktorej zostávajú dáta uložené aj po odpojení napájania) senzora. Register calib obsahuje kalibračné údaje pre teplotu a tlak. Registre, ktoré obsahujú kalibračné údaje pre teplotu sú uvedené v nasledujúcej tabuľke.
Názov registra | Adresa registra(od - do) | Obsah registra | Dátový typ |
---|---|---|---|
calib00 | 0x88 – 0x89 | dig_T1 | Uint16 |
calib01 | 0x8A – 0x8B | dig_T2 | Int16 |
calib02 | 0x8C – 0x8D | dig_T3 | Int16 |
Register ctrl_meas
Pomocou registra môžeme nastaviť rozlíšenie údajov pre meranie teploty a tlaku, a režim senzora.
bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 |
---|---|---|---|---|---|---|---|
osrs_t[2:0] | osrs_p[2:0] | mode[1:0] |
osrs_t[2:0] | Nastavuje nadvzorkovanie teplotných údajov a zároveň nastavuje počet bitov na vzorku (rozlíšenie) – Tab. 2 |
osrs_p[2:0] | Nastavuje nadvzorkovanie údajov tlaku a zároveň nastavuje počet bitov na vzorku (rozlíšnie). |
mode[1:0] | Nastavuje mód senzora (Tab. 3). |
osrs_t[2:0] | Teplotné nadvzorkovanie | Typické teplotné rozlíšenie |
---|---|---|
000 | Preskočiť (výstup 0x800000) | - |
001 | × 1 | 16 bit/0,0050 °C |
010 | × 2 | 17 bit/0,0025 °C |
011 | × 4 | 18 bit/0,0012 °C |
100 | × 8 | 19 bit/0,0006 °C |
101, 110, 111 | × 16 | 20 bit/0,0003 °C |
mode[1:0] | Režim |
---|---|
00 | Sleep mode (úsporný) |
01, 10 | Forced mode (vynútený) |
11 | Normal mode (normálny) |
Režim Sleep mode je východiskový režim pri pripojení napájania k senzoru. V tomto režime sa nevykonávajú žiadne merania a elektrická spotreba je minimálna. Prístupné sú však všetky registre.
Režim Forced mode umožní jedno meranie teploty a tlaku. Keď sa meranie dokončí, senzor sa vráti do úsporného režimu (Sleep mode) a výsledok je uložený v príslušných dátových registroch. Ďalšie meranie sa uskutoční opätovným nastavením Forced mode v registri ctrl_meas. Tento režim sa odporúča pre merania, kedy sa nevyžaduje vysoká vzorkovacia frekvencia, alebo keď sa vyžaduje synchronizácia s MCU.
Režim Normal mode zabezpečuje automatické opakovanie merania teploty a tlaku. Strieda sa aktívny (merací) interval a neaktívny interval, keby neprebieha meranie (Obr. 6). Dĺžka trvania neaktívneho intervalu sa označuje ako tstandby. Tento čas sa nastavuje v registri config.

Register config
Tento register umožňuje nastaviť vzorkovaciu frekvenciu, frekvenčný filter a počet vodičov pri SPI komunikácii.
bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 |
---|---|---|---|---|---|---|---|
t_sb[2:0] | filter[2:0] | spi3w_en[0] |
t_sb[2:0] | Nastavuje dĺžku trvania neaktívneho intervalu tstandby. (Tab. 4) |
filter[2:0] | Nastavuje časové konštanty IIR filtra. |
spi3w_en[0] | Aktivuje trojvodičovú SPI komunikáciu. |
t_sb[2:0] | tstandby [ms] |
---|---|
000 | 0,5 |
001 | 62,5 |
010 | 125 |
011 | 250 |
100 | 500 |
101 | 1000 |
110 | 2000 |
111 | 4000 |
Aplikácia filtra IIR má význam pri meraní tlaku a preto je nastavenie parametrov filtra IIR v tomto cvičení nepodstatné.
Rozhranie SPI môže fungovať v dvoch režimoch: štvorvodičom a trojvodičovom. Nastavením bitu spi3w_en aktivujeme trojvodičový režim. V tomto režime slúži vývod SDI pre obojsmernú komunikáciu.
Register temp_msb, temp_lsb, temp_xlsb
Registre obsahujú namerané teplotné dáta v surovej forme (hodnoty AD prevodníka). Výstupom je 20-bitová hodnota, ktorá vznikne spojením registrov. Pri prepočte na teplotu je potrebné použiť kalibračnú rovnicu, ktorá je uvedená v katalógovom liste.
bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 |
---|---|---|---|---|---|---|---|
temp_msb[7:0] |
bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 |
---|---|---|---|---|---|---|---|
temp_lsb[7:0] |
bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 |
---|---|---|---|---|---|---|---|
temp_xlsb[7:4] | 0 | 0 | 0 | 0 |
Nižšie je uvedená funkcia v jazyku C, ktorá slúži na prepočet surovej hodnoty z AD prevodníka (adc_T) na hodnotu v [°C] (T) s využitím kalibračných konštánt (dig_T1, dig_T2, dig_T3) a ich dosadením do kalibračnej rovnice.
int32_t bmp280_compensate_T_int32(int32_t adc_T)
{
int32_t var1, var2, T, t_fine;
var1 = ((((adc_T>>3) - ((int32_t)dig_T1<<1))) * ((int32_t)dig_T2)) >> 11;
var2 = (((((adc_T>>4) - ((int32_t)dig_T1)) * ((adc_T>>4) - ((int32_t)dig_T1))) >> 12) * ((int32_t)dig_T3)) >> 14;
t_fine = var1 + var2;
T = (t_fine * 5 + 128) >> 8;
return T;
}
I2C komunikácia
Ak necháme vývod CSB na rozširujúcej doske nezapojený (je pripojený cez pull-up rezistor na napájanie), tak je po pripojení senzora na napájanie aktivované I2C rozhranie. Sú podporované tri rýchlosti (frekvencie) I2C rozhrania: Standard speed (100 kbit/s), Fast speed (400 kbit/s), High speed (3,4 Mbit/s). Adresa senzora (7-bit) pre I2C komunikáciu je 0x76 alebo 0x77 v závislosti od pripojenia vývodu SDO. V našom prípade je adresa senzora 0x76, pretože je uzemnený vývod SDO na Obr. 3. Hexadecimálna hodnota 0x76 zodpovedá 7-bitovému binárnemu číslu 0b1110110.
Zápis cez I2C
Zápis sa vykonáva zaslaním adresy senzora (Slave address) spolu s režimom zápisu (bit R/W ̅=0), t.j. 0b11101100 (0xEC). Následne sa zasiela adresa registra (Control byte), do ktorého chceme dáta zapísať a následne samotné dáta (Data byte). Môžeme zapísať viacero registrov naraz bez toho, aby sme museli znova zasielať adresu senzora. Prenos je ukončený podmienkou STOP. Zápis viacerých bajtov je ukázaný na Obr. 7.

Čítanie cez I2C
Aby sme mohli čítať obsah registrov senzora, musíme najprv zaslať adresu senzora s režimom zápisu, t.j. 0b11101100 (0xEC) a adresu registra (Control byte), z ktorého chceme čítať. Potom musí byť zaslaná podmienka stop alebo opakovaná podmienka štart. Následne je zaslaná adresa senzora s režimom čítania (bit R/W ̅=1), t.j 0b11101101 (0xED). Po tomto kroku nám senzor zašle obsah registra z požadovanej adresy. Adresa registra sa automaticky inkrementuje, to znamená, že môžeme čítať dáta z nasledujúcej adresy bez toho, aby sme museli znova posielať adresu senzora. Čítanie registrov je možné dovtedy pokiaľ nepošleme podmienku STOP. Na Obr. 8 je ukážka čítania registra 0xF6 a následne registra 0xF7, celkovo sú teda prečítané 2 bajty.

2. Použité vybavenie
- Hardvér
- Vývojová doska Mega Development Board 2 (MDB2)
- Teplotný senzor BMP280 na rozširujúcej DPS
- PC
- Softvér
- MATLAB
- Microchip Studio
3. Schéma zapojenia

4. Úlohy
- Podľa schémy zapojenia (Obr. 9) pripojte senzor BMP280 k vývojovej doske MDB2. Použite napájanie z adaptéra. Pozície prepojok na MDB2 sú vyznačené červenou – napájanie senzora musí byť 3,3 V! Pri voľbe napájania 5 V môže dôjsť k poškodeniu senzora!
- V jazyku C vytvorte program pre MCU, ktorý bude získavať údaje zo senzora BMP280 cez I2C rozhranie a posielať získané údaje o teplote do PC cez rozhranie UART. V kóde implementujte nasledujúce parametre a funkcionality:
- Frekvencia I2C: 100 kHz,
- Údaje o teplote získavajte zo senzora a posielajte do PC každých 100 ms,
- Rýchlosť prenosu cez UART nastavte na 19 200 Baud,
- Vzorky začnite posielať do PC až po prijatí znaku 'S', posielanie zastavte po prijatí znaku 'X'. Na detekciu prijatia znaku využite prerušenie od UART
- Pri tvorbe programu postupujte podľa nasledujúceho vývojového diagramu:
- V jazyku MATLAB pomocou prostredia AppDesigner vytvorte aplikáciu s grafickým užívateľským rozhraním, ktorá bude zobrazovať aktuálnu hodnotu teploty v °C a jej priebeh v čase podľa Obr. 11. Aplikácia musí obsahovať nasledujúce prvky:
- Graf pre vykresľovanie priebehu teploty v čase,
- Textové pole pre zobrazenie aktuálnej teploty,
- Tlačidlá: 'Otvor port', 'Štart' a 'Stop'.
- Zhodnoťte priebeh laboratórneho cvičenia. Zamerajte sa na nasledujúce body:
- Písanie kódu pre MCU, problematické časti,
- Písanie kódu pre aplikáciu v MATLABe.


Na stiahnutie
twimaster.htwimaster.c