LinkedIn YouTube Facebook
Szukaj

Wstecz
IoT

ZL30ARM (STM32F103) + LabView: obsługa akcelerometru MMA7455

Ostatnią funkcją jest void MultipleRead(u32 NumByteToRead, uint8_t BaseRegisterAddress, uint8_t I2C1_Bufferx[]). Służy ona do odczytu kilku bajtów przy jednorazowym zaadresowaniu urządzenia. Działanie tej funkcji różni się od poprzedniej tym, że po otrzymaniu jednego bajta danych kontroler wystawia znak potwierdzenia (AK) po czym czujnik przesyła dane z rejestru o adresie o jeden większym niż poprzednie dane. Czyli każdy znak potwierdzenia inkrementuje adres, aż do momentu gdy zamiast potwierdzenia pojawi się bit stopu. Funkcja jako parametr przyjmuje liczbę bajtów do odczytu, adres rejestru pierwszej danej do odczytu oraz bufor do którego będzie realizowany zapis otrzymanych danych. Ten tryb został użyty do czytania danych kolejno z każdej osi XOUT8, YOUT8, ZOUT8. Na Rys. 6 przedstawiono działanie na sygnałach natomiast na Listingu 3 przedstawiono kod funkcji.

 

Rys. 6. Odczyt określonej ilości danych

Rys. 6. Odczyt określonej ilości danych

 

 

Listing 3. Funkcja odczytująca wskazaną ilości danych z układu

void MultipleRead(u32 NumByteToRead, uint8_t BaseRegisterAddress, uint8_t I2C1_Bufferx[]) {
	uint32_t pBuffer = 0;
	I2C_AcknowledgeConfig(I2C1, ENABLE);

	//wysłanie bitu startu
	I2C_GenerateSTART(I2C1, ENABLE);
	GPIO_SetBits(LED_PORT, LED_PIN);
	while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
	
	//wysłanie adresu układu MMA7455
	GPIO_ResetBits(LED_PORT, LED_PIN);
	I2C_Send7bitAddress(I2C1, SLAVE_ADDRESS7, I2C_Direction_Transmitter);
	while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
	
	//wysłanie adresu rejestru, od którego odbywać się będzie odczyt
	I2C_SendData(I2C1, BaseRegisterAddress);
	while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
	
	//wysłanie bitu startu
	I2C_GenerateSTART(I2C1, ENABLE);
	while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

	//ponowne wysłanie adresu urządzenia
	I2C_Send7bitAddress(I2C1, SLAVE_ADDRESS7, I2C_Direction_Receiver);
	while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
	
	while (NumByteToRead)
	{
		if (I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)) {

			//zapis odebranych danych do bufora
			I2C1_Bufferx[pBuffer++] = I2C_ReceiveData(I2C1);
			
			//odebranie znaku odpowiedzi
			if (NumByteToRead == 2)
				{I2C_AcknowledgeConfig(I2C1, DISABLE);}

			//warunkowe wysłanie bitu stopu
			if (NumByteToRead == 1)
				{I2C_GenerateSTOP(I2C1, ENABLE);}

			//dekrementacja licznika danych do odczytu
			NumByteToRead--;
		}
	}
	
	//oczekiwanie i zapis ostatniego bajta danych
	while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
	I2C1_Bufferx[pBuffer++] = I2C_ReceiveData(I2C1);
}

 

LabView

Aplikacja w LabView słurzy do przetwarzania danych z czujnika i prezentacji danych w formie obracającego się prostokąta (przedstawiającego wychylenie układu) lub kolejno przesyłanych próbek na wykresie. Poza samym programem LabView, którego wersję testową można ściągnąć (po zarejestrowaniu) ze strony firmy National Instruments, należy zainstalować pakiet VISA (Virtual Instrument Software Architecture), który w tym wypadku potrzebny jest do obsługi portu szeregowego.

Panel programu przedstawiony został na Rys. 7. Przed uruchomieniem należy ustawić odpowiedni numer portu COM, przycisk ‘RUN’ zaczyna zbieranie danych. Interfejs szeregowy jest tak skonfigurowany, że odbiera dane paczkami do napotkania znaku enter – ‘\n’. Aktualnie odebrane dane w formacie tekstowym są wyświetlane w polu ‘String’, a w formie liczbowej na trzech suwakach, każdy dla innej osi.

W aplikacji dwa główne procesy komunikują się ze sobą w formie kolejek, których stan w jakim się aktualnie znajdują jest prezentowany przez kontrolki ‘Producer’ i ‘Consumer’.

Rys. 7. Okno aplikacji systemu LabView

Rys. 7. Okno aplikacji systemu LabView

 

 

Zakładka ‘3D Picture’ zawiera obracający się prostokąt rysowany w kontrolce 3D Picture Control służącej do rysowania wykresów przestrzennych. Zmieniając ustawienie kontrolki ‘Render Dest’ na ‘Scene Window’, pojawi się ona w nowym oknie, które można powiększyć na cały ekran. Ponieważ liczby przesyłane z czujnika nie zmieniają się w sposób płynny, ulegają pewnym wahaniom, zostały zaimplementowane dwie proste metody do stabilizacji obliczanych współrzędnych figury – kontrolka ‘axis_mode’. Pierwsza opcja ‘Mean’ czyli średnia ostatnich dziesięciu próbek. Druga ‘Threshold’, która zmienia współrzędną jeśli przychodząca dana przekroczyła wartość większą niż ustawiony ‘prog’ w stosunku do wartości aktualnej. Dodatkowo w zakładce ‘Graph’ są prezentowane dane w postaci wykresów. W aplikacji istnieje również możliwość zapisu próbek do pliku.
Mateusz Baszczyk