Vaša IP adresa: 3.145.93.221
Počet návštev: 30482

Meranie teploty s BMP280 (I2C)

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.

Obr. 1   Senzor tlaku a teploty BMP280 od firmy BOSH.
Obr. 1 Senzor tlaku a teploty BMP280 od firmy BOSH.

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.

Obr. 2   Senzor BMP280 umiestnený na rozširujúcej DPS.
Obr. 2 Senzor BMP280 umiestnený na rozširujúcej DPS.

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.

Obr. 3   Elektrická schéma zapojenia rozširujúcej DPS so senzorom BMP280.
Obr. 3 Elektrická schéma zapojenia rozširujúcej DPS so senzorom BMP280.

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

Obr. 4 Zapojenie vývodov.
#Názov vývodu (I2C)Názov vývodu (BMP280)Názov vývodu (SPI)Funkcia
1VCCVDDVCCNapájanie 1,71 V ÷ 3,6 V
2GNDGNDGNDZem
3SCLSCKSCKTaktovací (hodinový) signál (I2C + SPI)
4SDASDIMOSIDátový vodič (I2C), dátový vstup (SPI)
5CSBCSBCSB/CSVoľba medzi I2C/SPI, chip select (SPI)
6SDOSDOMISODátový výstup (SPI)
Obr. 4 Zapojenie vývodov.

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.

Obr. 5   Mapa registrov senzora BMP280.
Obr. 5 Mapa registrov senzora BMP280.

Ď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.

Tab. 1 Kalibračné registre pre teplotu.
Názov registraAdresa registra(od - do)Obsah registraDátový typ
calib000x88 – 0x89dig_T1Uint16
calib010x8A – 0x8Bdig_T2Int16
calib020x8C – 0x8Ddig_T3Int16

Register ctrl_meas

Pomocou registra môžeme nastaviť rozlíšenie údajov pre meranie teploty a tlaku, a režim senzora.

bit 7bit 6bit 5bit 4bit 3bit 2bit 1bit 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).

Tab. 2 Nastavenie rozlíšenia teploty.
osrs_t[2:0]Teplotné nadvzorkovanieTypické teplotné rozlíšenie
000Preskočiť (výstup 0x800000)-
001× 116 bit/0,0050 °C
010× 217 bit/0,0025 °C
011× 418 bit/0,0012 °C
100× 819 bit/0,0006 °C
101, 110, 111× 1620 bit/0,0003 °C

Tab. 3 Nastavenie režimu.
mode[1:0]Režim
00Sleep mode (úsporný)
01, 10Forced mode (vynútený)
11Normal 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.

Obr. 6   Časový diagram v normálnom režime (Normal mode).
Obr. 6 Časový diagram v normálnom režime (Normal mode).

Register config

Tento register umožňuje nastaviť vzorkovaciu frekvenciu, frekvenčný filter a počet vodičov pri SPI komunikácii.

bit 7bit 6bit 5bit 4bit 3bit 2bit 1bit 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.
Tab. 4 Nastavenie dĺžky trvania neaktívneho intervalu.
t_sb[2:0]tstandby [ms]
0000,5
00162,5
010125
011250
100500
1011000
1102000
1114000

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 7bit 6bit 5bit 4bit 3bit 2bit 1bit 0
temp_msb[7:0]

bit 7bit 6bit 5bit 4bit 3bit 2bit 1bit 0
temp_lsb[7:0]

bit 7bit 6bit 5bit 4bit 3bit 2bit 1bit 0
temp_xlsb[7:4]0000

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.

Obr. 7   Zápis viacerých bajtov cez I2C. Adresa registra nie je inkrementovaná automaticky.
Obr. 7 Zápis viacerých bajtov cez I2C. Adresa registra nie je inkrementovaná automaticky.

Čí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.

Obr.8   Čítanie viacerých bajtov cez rozhranie I2C. Adresa registra je inkrementovaná automaticky.
Obr.8 Čítanie viacerých bajtov cez rozhranie I2C. Adresa registra je inkrementovaná automaticky.

2. Použité vybavenie

  1. Hardvér
    • Vývojová doska Mega Development Board 2 (MDB2)
    • Teplotný senzor BMP280 na rozširujúcej DPS
    • PC
  2. Softvér
    • MATLAB
    • Microchip Studio

3. Schéma zapojenia

Obr. 9   Pripojenie teplotného senzora BMP280 k vývojovej doske MDB2.
Obr. 9 Pripojenie teplotného senzora BMP280 k vývojovej doske MDB2.

4. Úlohy

  1. 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!
  2. 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:
    Obr. 10   Vývojový diagram programu pre MCU.
    Obr. 10 Vývojový diagram programu pre MCU.
  3. 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'.
    Obr. 11   Aplikácia pre zobrazenie aktuálnej hodnoty teploty a jej priebehu v čase.
    Obr. 11 Aplikácia pre zobrazenie aktuálnej hodnoty teploty a jej priebehu v čase.
  4. 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.h
twimaster.c