02.07.2012
STM32Butterfly: współpraca z 3-osiowym czujnikiem przyspieszenia MEMS (LIS35D)
Do odczytu wartości przyspieszeń służy poniższa funkcja:
void LIS35_GetPosition(signed char * x, signed char * y, signed char * z) { SPI_CS_Enable(); SPI_Transmit(LIS35_READ|LIS35_ADDR_INC|LIS35_REG_OUTX); *x=SPI_Receive(); SPI_Receive(); *y=SPI_Receive(); SPI_Receive(); *z=SPI_Receive(); SPI_CS_Disable(); }
Program główny
Aplikacja umożliwia wyświetlenie wartości przyspieszeń na dwa sposoby. Pierwsza wersja wyświetla trzy paski, których długość jest proporcjonalna do odczytanego przyspieszenia. Paski rysowane są tylko w przypadku, gdy któraś z wartości przyspieszenia różni się o co najmniej 3 od poprzedniej wartości, dzięki temu unikamy migotania spowodowanego częstym odrysowywaniem pasków.
while(1) { // Read KAmodMEMS orientation LIS35_GetPosition(&x, &y, &z); if (abs(xo - x) > 3 || abs(yo - y) > 3 || abs(zo - z) > 3) { DrawBar(x, 0, 20, 0x3); DrawBar(y, 40, 60, 0x1C); DrawBar(z, 80, 100, 0xE0); xo = x; yo = y; zo = z; } }
Druga wersja wyświetla siatkę sześcianu, sześcian jest obrócony w trzech osiach o kąty proporcjonalne do odczytanych przyspieszeń.
while(1) { // Read KAmodMEMS orientation LIS35_GetPosition(&x, &y, &z); // If MEMS moved then redraw cube if (abs(xo - x) > 3 || abs(yo - y) > 3 || abs(zo - z) > 3) { // Erase previous cube DrawCube(xo, yo, zo, 0x0); // Draw new cube DrawCube(x, y, z, 0xFF); // Store old orientation xo = x; yo = y; zo = z; } }