LinkedIn YouTube Facebook
Szukaj

Wstecz
Artykuły

STM32Butterfly: współpraca z 3-osiowym czujnikiem przyspieszenia MEMS (LIS35D)

 

 

 

 

W artykule przedstawiamy efektowną aplikację pozwalającą zapoznać się z akcelerometrem LIS35DE firmy STMicroelectronics, który mierzy przyspieszenie wzdłuż trzech osi. Aplikacja jest przygotowana dla zestawu uruchomieniowego STM32Butterfly2 (z mikrokontrolerem STM32F107), modułu KAmodTFT2 oraz modułu KAmodMEMS2, który jest wyposażony w układ LIS35DE. Sposób dołączenia modułów do zestawu uruchomieniowego opisano w pliku main.c.

Obsługa wyświetlacza

Wyświetlacz modułu KAmodTFT2 jest wyposażony w kontroler PCF8833. Komunikacja z kontrolerem odbywa się przez interfejs szeregowy SPI. Niestety ramka danych ma 9 bitów, co uniemożliwia wykorzystanie sprzętowego interfejsu SPI wbudowanego w mikrokontroler STM32 (tu do wyboru jest wyłacznie 8 lub 16 bitów). Wpływa to negatywnie na wydajność, ale do naszej aplikacji w zupełności wystarczy.

Obsługa akcelerometru

Układ LIS35DE jest wyposażony w interfejsy I2C i SPI, linie tych interfejsów w module KAmodMEMS2 zostały wyprowadzone na wygodne w użyciu złącza. W aplikacji wykorzystałem interfejs SPI. Odczyt rejestrów układu polega na wysłaniu w pierwszym bajcie:

  • bitu 0 o wartości 1 (odczyt),
  • bitu 1 o wartości 0 lub 1 (dla wartości 1 adres rejestru będzie automatycznie inkrementowany)
  • bitów 2..7 zawierających adres rejestru

Następnie należy odczytać zawartości rejestrów. Zapis przebiega analogicznie z tą różnicą, że bajt 0 ma mieć wartość 0. Poniżej przedstawiam funkcje realizujące zapis i odczyt rejestrów.

#define LIS35_WRITE 		0
#define LIS35_READ 		0x80
#define LIS35_ADDR_NO_INC 	0
#define LIS35_ADDR_INC 		0x40

...

void LIS35_ReadRegister(char addr,char * v)
{
	SPI_CS_Enable();
	SPI_Transmit(LIS35_READ|LIS35_ADDR_NO_INC|addr);
	*v=SPI_Receive();
	SPI_CS_Disable();
}


void LIS35_WriteRegister(char addr,char v)
{
	SPI_CS_Enable();
	SPI_Transmit(LIS35_WRITE|LIS35_ADDR_NO_INC|addr);
	SPI_Transmit(v);
	SPI_CS_Disable();
}

Po dołączeniu zasilania akcelerometr jest w stanie power-down, funkcja inicjalizująca przełącza układ w tryb active przez ustawienie bitu PD w rejestrze CTRL_REG1 oraz odblokowuje wszystkie trzy osie akcelerometru przez ustawienie bitów ZEN, YEN i XEN w tym samym rejestrze.

char InitializeLIS35(void)
{
	char RegVal, LIS35Settings;
  
	//Reset LIS35 configuration
  	LIS35_RebootMemory(); 

	LIS35_ReadRegister(LIS35_REG_CR1, &RegVal);

	//Power up
	LIS35Settings = LIS35_REG_CR1_XEN | LIS35_REG_CR1_YEN | LIS35_REG_CR1_ZEN | LIS35_REG_CR1_ACTIVE;
	LIS35_WriteRegister(LIS35_REG_CR1, LIS35Settings);
	LIS35_ReadRegister(LIS35_REG_CR1, &RegVal);

	//Check whether power up is set
	if (RegVal == LIS35Settings) return LIS35_OK;

	return LIS35_ERROR;
}