ZL31ARM: wskaźnik przyspieszenia 3D z czujnikiem MEMS LIS35
Konfiguracja interfejsu SPI:
void SPI_Configuration(void){ SPI_InitTypeDef SPI_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; // Enable SPI1 and GPIO clocks RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | RCC_APB2Periph_GPIOA, ENABLE); // Configure SPI1 pins: SCK, MISO and MOSI GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // Configure I/O for Flash Chip select GPIO_InitStructure.GPIO_Pin = GPIO_Pin_CS; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIO_CS, &GPIO_InitStructure); // SPI1 configuration SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI1, &SPI_InitStructure); // Enable SPI1 SPI_Cmd(SPI1, ENABLE); }
Po wykonaniu powyższych czynności można przetestować poprawność działania prostego programu wyświetlającego 3 ramki w różnych kolorach:
#include "board.h" #include "main.h" #include "lis35.h" #include "stm32f10x.h" int main(void){ RCC_Configuration(); GPIO_Configuration(); NVIC_Configuration(); // Inicjalizacja wyswietlacza LCD InitLcdNokia(); // Czysc ekran LCDClearScreen(0x0); // Konfiguracja SPI i inicjalizacja MEMS SPI_Configuration(); if (InitializeLIS35() == LIS35_ERROR) { LCDClearScreen(0xF); while(1); } // Rysuj ramki w 3 kolorach drawRectangle(-40, -50, -20, 50, RED, 0); drawRectangle(-10, -50, 10, 50, BLUE, 0); drawRectangle( 20, -50, 40, 50,GREEN, 0); //Wyswietlenie oznaczen osi LCDPutChar('X',120, 35, 0, 0xFFF, 0x00); LCDPutChar('Y',120, 65, 0, 0xFFF, 0x00); LCDPutChar('Z',120, 95, 0, 0xFFF, 0x00); // Regulacja kontrastu adjustContrast(); return 0; }
Wskaźnik przyśpieszenia 3D
Do poprawnego zaimplementowania programowej obsługi układu MEMS należy wiedzieć jak wygląda rozkład osi pomiarowych i na jakim mniej więcej poziomie utrzymują się wartości w odniesieniu do przyśpieszenia ziemskiego (g = 9,81 m/s2). W celu ułatwienia zapoznania się z wyżej określonym został zrealizowany podprogram rysujący słupki, których wysokość jest proporcjonalna do mierzonych wartości, a pod spodem wyświetlane są surowe wartości typu signed char, tzn. odczytane bezpośrednio z rejestrów OutX..Z bez jakiegokolwiek przeliczenia (fotografia 6). Kierunek osi układu OXYZ przedstawiono na fotografii 7.
Fot. 6. Efekt działania przykładowego programu