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
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
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