LinkedIn YouTube Facebook
Szukaj

Wstecz
Artykuły

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

Fot. 6. Efekt działania przykładowego programu

 

 

Autor: Jan Szemiet