MEMS 3D akcelerometer: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
|||
Riadok 168: | Riadok 168: | ||
Rozsiahly program pre lepšiu prehľadnosť rozdeľte do viacerých súborov. | Rozsiahly program pre lepšiu prehľadnosť rozdeľte do viacerých súborov. | ||
Naša použitá funkcia setup()''source'': | |||
<source lang="c"> | <source lang="c"> | ||
void setup() { | |||
Serial.begin(SerialSpeed); | |||
//pinMode(8, OUTPUT); | |||
Wire.begin(); | |||
/* Zapis*/ | |||
Wire.beginTransmission(0xC0); | |||
Wire.write(0x01); // Address of data to get | |||
Wire.write(byte(0x00)); | |||
Wire.endTransmission(); | |||
delay(1000); | |||
Serial.begin(SerialSpeed); | |||
Serial.println("Semestralne zadanie"); | |||
Serial.println("Meranie nadmorskej vysky a tlaku"); | |||
Serial.println("---------------------------------"); | |||
} | |||
</source> | |||
Funkcia loop() | |||
<source lang="c"> | |||
void loop() { | |||
Wire.begin(); | |||
Wire.beginTransmission(0xC0); | |||
Wire.write(0x04); | |||
Wire.endTransmission(); | |||
Wire.requestFrom(0xC0,3); | |||
byte msb, csb, lsb; | |||
msb = Wire.read(); //ulozenie hodnot zo snimaca | |||
csb = Wire.read(); | |||
lsb = Wire.read(); | |||
delay(500); | |||
float tempcsb = (lsb>>4)/16.0; | |||
float altitude = (float)( (msb << 8) | csb) + tempcsb; | |||
//Returns the number of feet above sea level | |||
float NMM = altitude*3.28084; | |||
// Pressure comes back as a left shifted 20 bit number | |||
long pressure_whole = (long)msb<<16 | (long)csb<<8 | (long)lsb; | |||
pressure_whole >>= 6; //Pressure is an 18 bit number with 2 bits of decimal. Get rid of decimal portion. | |||
lsb &= 0b00110000; //Bits 5/4 represent the fractional component | |||
lsb >>= 4; //Get it right aligned | |||
float pressure_decimal = (float)lsb/4.0; //Turn it into fraction | |||
float pressure = (float)pressure_whole + pressure_decimal; | |||
Serial.begin(SerialSpeed); | |||
Serial.println("Nadmorska vyska v m"); | |||
Serial.println(NMM); | |||
Serial.println(); | |||
Serial.println("Tlak v hPa"); | |||
Serial.println(pressure); | |||
Serial.println(); | |||
delay(10000); | |||
} | } | ||
</source> | </source> | ||
Riadok 185: | Riadok 294: | ||
[[Médiá:MojProgram.c|program.c]] | [[Médiá:MojProgram.c|program.c]] | ||
== Overenie == | == Overenie == |
Verzia z 18:55, 25. máj 2016
Autori: | Eva Bartalová, Romana Čápková |
Študijný odbor: | Aplikovaná mechatronika a elektromobilita |
Ročník: | 1. ročník IŠ (2015/2016) |
Zadanie
Využitím akcelerometra, ktorý sa nachádza na doske MEMS Inertial Nucleo navrhnite a vytvorte aplikáciu, ktorý bude merať zrýchlenie.
Úlohy:
- Nájdite si k senzorom datasheet
- Nájdite si schémy zapojenia dosky
- Na základe predošlých vedomostí navrhnite spôsob pripojenia k riadiacej jednotke
- Napíšte základný demonštračný program využívajúci vaše funkcie
- Vymyslite a demonštrujte vhodnú aplikáciu
MEMS Inertial Nucleo
Zoznam senzorov, ktoré sa nachádzajú na doske:
- LSM6DS0: MEMS 3D accelerometer (±2/±4/±8 g) + 3D gyroscope (±245/±500/±2000 dps)
- LIS3MDL: MEMS 3D magnetometer (±4/ ±8/ ±12/ 16 gauss)
- LPS25HB*: MEMS pressure sensor, 260-1260 hPa absolute digital output barometer
- HTS221: capacitive digital relative humidity and temperature
Literatúra:
- Zoznam použitej literatúry, vrátane katalógových údajov (datasheet), internetových odkazov a pod.
Analýza riešenia
Na realizáciu akcelerometra sme využili senzor LSM6DS0.
Senzor LSM6DS0
LSM6DS0 je integrovaný obvod, ktorý zahŕňa 3D digitálny akcelerometer a 3D digitálny gyroskop. Jednotlivé snímače sú vyrábané pomocou špeciálnej techniky tzv. micromachining, zatiaľ čo rozhranie IC využíva CMOS technológiu. LSM6DS0 má dva režimy použitia. Prvý režim predstavuje aktiváciu akcelerometera a gyroskopu naraz na rovnakom ODR. Druhý režim predstavuje aktiváciu akcelerometera a deaktiváciu gyroskopu.
LSM6DS0 je uložený v 3 mm x 3mm x 0.86 mm LGA púzdre.
Vlastnosti:
- Analógové napájacie napätie: 1.71 V až 3.6 V
- Nezávislé I/O napájanie (1.71 V)
- Nízkovýkonový režim 1.8 mA
- Meranie zrýchlenia v smere osi X,Y,Z
- ±2/±4/±8/±16 g full scale
- ±245/±500/±2000 dps full scale
- SPI/I2C rozhranie
- Vstavený snímač tepla
- Vstavané FIFO
Vývody
Popis jednotlivých pinov a ich funkcia:
Registre
LSM6DS0 má dve operačné módy: iba akcelerometer je zapnutý a gyroskop je vypnutý (register CTRL_REG6_XL (20h)) alebo akcelerometer a gyropskop sú zapnuté na rovnakom ODR (register CTRL_REG1_G (10h)).
CTRL_REG6_XL (20h) Register ovládajúci senzor lineárneho zrýchlenia. Predstavuje register na zápis údajov.
Kde jednotlivé bity predstavujú
ODR_XL [2:0] | Output data rate and power mode slection. Defaultne je nastavená hodnota 000 |
FS_XL [1:0] | Výber maximálneho rozhrania. Defaultne je nastavená hodnota 00, (00: ±2g; 01: ±16g; 10: ±4g; 11: ±8g) |
BW_SCAL_ODR | Bandwidth selection. Defaultne je nastavená hodnota 0 |
BW_XL [1:0] | Anti-aliasing filter. Defaultne je nastavená hodnota 00 (00: 408 Hz; 01: 211 Hz; 10: 105 Hz; 11: 50 Hz) |
Ďalej sme využili nasledovné registra ako Output:
OUT_X_XL (28h - 29h) Výstupný register pre meranie lineárneho zrýchlenia v smere osi X. Hodnota je vyjadrená ako 16-bitové slovo s dvojkovým doplnkom.
OUT_Y_XL (2Ah - 2Bh) Výstupný register pre meranie lineárneho zrýchlenia v smere osi Y. Hodnota je vyjadrená ako 16-bitové slovo s dvojkovým doplnkom.
OUT_Z_XL (2Ch - 2Dh) Výstupný register pre meranie lineárneho zrýchlenia v smere osi Z. Hodnota je vyjadrená ako 16-bitové slovo s dvojkovým doplnkom.
Sériové rozhrania
Registre vo vnútri senzora LSM6DS0 umožňujú prístup aj pre I2C a SPI sériové rozhranie. Pričom SPI môže byť nakonfigurovaný tak, aby SW pracovalo buď v 3-wire alebo 4-wire režime. Sériové rozhrania sú mapované na rovnakých pinoch. Pre využitie rozhrania I2C, musí byť pin CS pripojený k Vdd_IO.
Zbernica I2C
“Inter-Integrated Circuit” protokol a zbernicu vyvinula firma Philips Semiconductor pôvodne pre svoje TV prijímače v roku 1980, za účelom komunikácie medzi IO na jednej DPS pri použití minimálneho množstva pinov. Špecifikácia zbernice I2C je založená na jednoduchých hardvérových štandardoch (nie sú potrebné špeciálne konektory alebo kabeláž)
Základné pojmy
- Master - začína a končí dátový prenos generovaním štart bitu a stop bitu - generuje hodinový signál - vysiela adresu podriadeného IO, pre ktorý budú dáta určené - určuje smer prenosu dát
- Slave - odpovedá iba v prípade, že rozpoznal svoju adresu - časovanie prenosu je riadené hodinovým signálom
- Štart bit a Stop bit - začiatok alebo koniec prenosu je definovaný dátovej linky z vysokej na úroveň. Prenos prechodom nízku (štart bit) alebo z nízkej na vysokú úroveň (stop bit) kým hodinový signál je na vysokej úrovni - po štart bite považujú všetky zariadenia zbernicu za zaneprázdnenú - po príchode stop bitu čakajú zariadenia istý čas a potom považujú zbernicu za voľnú Štart bit a stop bit
Opis
Existujú dva signály spojené s I2C zbernicou: Serial Clock Line (SCL - slúži pre prenos hodinového signálu) a Serial Data Line (SDA - slúži pre prenos sériových dát). SDA je obojsmerná linka, ktorá slúži na odosielanie a prijímanie dát do / z rozhrania. Obe linky musia byť pripojené k Vdd_IO prostredníctvom externého pull-up rezistorov.
Transakcia na zbernici je spustená pomocou signálu ŠTART (ST). Po štart podmienke sa vysiela na zbernicu 7bitove číslo – adresa SLAVE zariadenia (SAD) s ktorým chceme komunikovať – doplnené o najnižší bit, ktorý značí či chceme do zariadenia dáta zapisovať alebo z neho dáta prijímať (čítať).
Slave adresa (SAD) pridružená k LSM6DS0 je 110101xb. Ak je SDO/SA0 pin pripojený k zdroju napätia, LSB je '1' (adresa 1101011b), inak ak je SDO/SA0 pin pripojený k zemi, LSB hodnota "0" (adresa 1101010b). Toto riešenie umožňuje pripojiť sa a riešiť dve rôzne zotrvačné moduly na rovnakej zbernici I2C.
Prenos dát potvrdením je povinný. Vysielač musí uvoľniť SDA linku počas potvrdzovacieho impulzu. Prijímač musí potom ťahať dáta linky na nízkej úrovni, takže zostáva stabilný na nízkej úrovni aj počas high doby impulzu, ktoré potvrdzujú hodiny (clock). Prijímač, ktorý bol určený je povinný vygenerovať potvrdenie po každom bajte prijatých dát. I2C vložený vo vnútri LSM6DS0 sa správa ako slave a nasledujúci protokol musí byť dodržaný. Po počiatočnom stave (ST) slave adresa je odoslaná, akonáhle príde jedno slave vrátené potvrdenie (SAK) sa prenáša 8-bitová sub-adresa (SUB). Prírastok adresy je nakonfigurovaný CTRL_REG8 (22h) (IF_ADD_INC).
Slave adresa je kompletná s Read/Write bitmi. V prípade, že bit je '1' (Read), opakovane zadaná podmienka START (SR) musí byť vydaná po dvoch sub-adries bajtov. Ak je bit "0" (Write) master bude vysielať na slave s nezmeneným smerom.
Popis riešenia
Sem opíšete ako konkrétne ste problém vyriešili. Začnite popisom pripojenia k procesoru (nezabudnite na schému zapojenia!) a zdôraznite ktoré jeho periférie ste pritom využili.
Schéma zapojenia snímača
Algoritmus a program
Uveďte stručný popis algoritmu, v akom jazyku a verzii vývojového prostredia ste ho vytvorili. Je vhodné nakresliť aspoň hrubú štruktúru programu napríklad vo forme vývojového diagramu. Rozsiahly program pre lepšiu prehľadnosť rozdeľte do viacerých súborov.
Naša použitá funkcia setup()source:
void setup() {
Serial.begin(SerialSpeed);
//pinMode(8, OUTPUT);
Wire.begin();
/* Zapis*/
Wire.beginTransmission(0xC0);
Wire.write(0x01); // Address of data to get
Wire.write(byte(0x00));
Wire.endTransmission();
delay(1000);
Serial.begin(SerialSpeed);
Serial.println("Semestralne zadanie");
Serial.println("Meranie nadmorskej vysky a tlaku");
Serial.println("---------------------------------");
}
Funkcia loop()
void loop() {
Wire.begin();
Wire.beginTransmission(0xC0);
Wire.write(0x04);
Wire.endTransmission();
Wire.requestFrom(0xC0,3);
byte msb, csb, lsb;
msb = Wire.read(); //ulozenie hodnot zo snimaca
csb = Wire.read();
lsb = Wire.read();
delay(500);
float tempcsb = (lsb>>4)/16.0;
float altitude = (float)( (msb << 8) | csb) + tempcsb;
//Returns the number of feet above sea level
float NMM = altitude*3.28084;
// Pressure comes back as a left shifted 20 bit number
long pressure_whole = (long)msb<<16 | (long)csb<<8 | (long)lsb;
pressure_whole >>= 6; //Pressure is an 18 bit number with 2 bits of decimal. Get rid of decimal portion.
lsb &= 0b00110000; //Bits 5/4 represent the fractional component
lsb >>= 4; //Get it right aligned
float pressure_decimal = (float)lsb/4.0; //Turn it into fraction
float pressure = (float)pressure_whole + pressure_decimal;
Serial.begin(SerialSpeed);
Serial.println("Nadmorska vyska v m");
Serial.println(NMM);
Serial.println();
Serial.println("Tlak v hPa");
Serial.println(pressure);
Serial.println();
delay(10000);
}
Nezabudnite však nahrať aj kompletné zdrojové kódy vášho programu!
Zdrojový kód: serial.h a main.c
Overenie
Nezabudnite napísať čosi ako užívateľský návod. Z neho by malo byť jasné čo program robí, ako sa prejavuje a aké má užívateľské rozhranie (čo treba stlačiť, čo sa kde zobrazuje). Ak ste namerali nejaké signály, sem s nimi. Ak je výsledkom nejaký údaj na displeji, odfotografujte ho.
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.