Digilent Pmod i STM32 (cz. 3) – PmodACL i PmodMAXSONAR

Kolejna odsłona cyklu dotyczącego modułów peryferyjnych Pmod poświęcona jest modułom PmodACL z 3-osiowym akcelerometrem oraz PmodMAXSONAR z ultradźwiękowym czujnikiem odległości. Podobnie jak w poprzednik częściach, wszystkie opisywane przykłady zostały napisane w oparciu o bibliotekę STM32Cube_FW_L4 i mogą być uruchomione w środowisku Atollic TrueSTUDIO na zestawie deweloperskim KAmeleon (www.kameleonboard.org).

Pozostałe artykuły z cyklu dostępne są w zasobach portalu Mikrokontroler.pl

PmodACL

Moduł PmodACL zawiera 3-osiowy akcelerometr Analog Devices ADXL345 umożliwiający pomiar przyspieszenia w jednym z konfigurowanych zakresów: ±2g, ±4g, ±8g, ±16g. Rozdzielczość pomiaru można ustawić na 10 bitów niezależnie od zakresu, lub w trybie dynamicznym, który automatycznie ustawia rozdzielczość na 4 mg/LSB dla każdego zakresu pomiarowego. Akcelerometr ADXL345 posiada także możliwość wykrywania aktywności, pojedynczego lub podwójnego stuknięcia, a także swobodnego spadania. Wszystkie z powyższych detekcji są konfigurowane w rejestrach akcelerometru przechowujących informacje o progach przyspieszenia poszczególnych aktywności, a także czasach ich trwania. Dodatkowo akcelerometr posiada wewnętrzną kolejkę FIFO przechowującą wyniki pomiarów i umożliwiającą zmniejszenie obciążenia mikrokontrolera.

Fotografia 1. Moduł PmodACL

Przerwania w układzie ADXL345

Układ ADXL345 ma możliwość informowania mikrokontrolera o wykrytych zdarzeniach za pomocą dwóch linii przerwań: INT1 i INT2. Dla obu linii dostępne są następujące źródła przerwań:

  • DATA_READY – dostępne są nowe dane do odczytu,
  • SINGLE_TAP – wykryto pojedyncze stuknięcie,
  • DOUBLE_TAP – wykryto podwójne stuknięcie,
  • Activity – wykryto stan aktywności,
  • Inactivity – wykryto stan braku aktywności,
  • FREE_FALL – wykryto swobodny spadek,
  • Watermark – kolejka FIFO została zapełniona do ustawionego poziomu,
  • Overrun – dostępne dane zostały nadpisane lub kolejka została przepełniona.

Każde z nich można niezależnie włączyć, a także przyporządkować do wybranej linii przerwań.

Połączenie modułu PmodACL z KAmeleonem

Dostęp do 8-bitowych rejestrów konfiguracyjnych i danych pomiarowych jest możliwy za pośrednictwem interfejsów SPI i I2C. Interfejs I2C jest aktywny, gdy pin SS (chip select) jest w stanie wysokim, natomiast po ustawieniu stanu niskiego na pinie SS możliwa jest komunikacja za pośrednictwem SPI. Moduł PmodACL zyposażono w złącza dla obu interfejsów – złącze J2 odpowiada 8-pinowemu interfejsowi I2C Pmod, natomiast J1 jest 12-pinowym interfejsem SPI typu 2A z dodatkową linią przerwania w miejsce sygnału RESET. W opisywanym przykładzie komunikacja z PmodACL odbywa się za pośrednictwem interfejsu SPI, ponieważ złącze J1 jest kompatybilne ze złączem Pmod-SPI na płytce KAmeleon. Opis połączeń uwzględniający wykorzystane piny mikrokontrolera STM32L496ZG znajduje się w tabeli 1, natomiast na fotografii 2 przedstawiono podłączony moduł.

Tabela 1. Sygnały PmodACL oraz odpowiadające im piny mikrokontrolera; w tabeli pominięto sygnały (NC) i linie zasilania występujące na złączu Pmod

Sygnał Numer pinu PmodACL (J1) Pin STM32L496ZG (KAmeleon Pmod-SPI)
~SS 1 PB0
MOSI 2 PA7
MISO 3 PE14
SCLK 4 PA1
INT2 7 PE12
INT1 8 PE13

Fotografia 2. PmodACL podłączony do płytki KAmeleon

Konfiguracja PmodACL

Kod obsługujący moduł PmodACL znajduje się w pliku src/PmodACL.c. Zaimplementowano w nim funkcje do konfiguracji modułu (PmodACL_Config), odczytu danych z trzech osi (PmodACL_ReadXYZ), a także odczytu stanu przerwań (PmodACL_ReadInterruptFlags). Funkcję konfiguracyjną przedstawiono na listingu 1. Jest ona odpowiedzialna za konfigurację modułu SPI1 mikrokontrolera oraz wymaganych pinów. SPI konfigurowany jest w trybie dwukierunkowym (linie MISO i MOSI), 8 bitów danych, z programową kontrolą sygnału SS. Po inicjalizacji interfejsu SPI ustawiane są wartości rejestrów układu ADXL345. Przykładową sekwencję konfiguracji włączającą detekcję podwójnego stuknięcia przedstawiono w tabeli 2.

Kod programu z plikami projektowymi środowiska Atollic można pobrać w sekcji „Do pobrania”

Listing 1. Konfiguracja modułu PmodACL

Sposób konfiguracji przerwania od podwójnego stuknięcia

Tabela 2. Konfiguracja rejestrów ADXL345 do detekcji podwójnego stuknięcia

Rejestr Wartość Opis
0x1D (THRESH_TAP) 0x3C Próg przyspieszenia dla detekcji stuknięcia (62,5 mg/LSB)
0x21 (DUR ) 0x0A Maksymalny czas trwania stuknięcia (625 µs/LSB)
0x22 (Latent) 0x10 Opóźnienie przed detekcją drugiego stuknięcia (1,25 ms/LSB)
0x23 (Window) 0x80 Czas oczekiwania na drugie stuknięcie (1,25 ms/LSB)
0x2A (TAP_AXES) 0x07 Włączenie osi do detekcji; wszystkie trzy są włączone
0x2D (POWER_CTL ) 0x08 Włączenie pomiarów z wyłączonym trybem SLEEP
0x30 (INT_SOURCE ) odczyt Odczyt i wyczyszczenie aktywnych flag przerwań; funkcja PmodACL_ReadInterruptFlags
0x2E (INT_ENABLE ) 0x20 Włączenie przerwania od podwójnego stuknięcia (DOUBLE_TAP)
0x31 (DATA_FORMAT) 0x28 Przerwanie aktywne w stanie niskim; automatyczna zmiana rozdzielczości (4 mg/LSB); wyrównanie danych do prawej; zakres pomiaru ±2g

Przerwania w ADXL345

Wyjaśnienia może wymagać sposób detekcji, konfigurowany za pomocą opisanych rejestrów. Akcelerometr wykrywa wszystkie zdarzenia o amplitudzie przyspieszenia przekraczającej wartość podaną w rejestrze THRESH_TAP, a jednocześnie czasie trwania nieprzekraczającym wartości w rejestrze DUR. Zdarzenia takie są klasyfikowane jako pojedyncze stuknięcia. Po pierwszym zdarzeniu akcelerometr odczekuje czas ustawiony w rejestrze LATENT i jeżeli wykryje kolejne zdarzenie w czasie ustawionym w rejestrze WINDOW, zgłasza przerwanie DOUBLE_TAP. Algorytm ten przedstawiono na rysunku 3.

Rysunek 3. Algorytm detekcji podwójnego stuknięcia w akcelerometrze ADXL345 (źródło: dokumentacja ADXL345)

Na końcu funkcji PmodACL_Config konfigurowane jest przerwanie na pinie PE13, które odpowiada sygnałowi INT1. Domyślnie wszystkie przerwania akcelerometru są przypisane do tej linii (rejestr 0x25 – INT_MAP). W tym przykładzie linia przerwań INT2 nie jest używana.

Konfiguracja SPI

Zgodnie z konwencją biblioteki STM32Cube, wywołanie funkcji bibliotecznej HAL_SPI_Init powoduje wywołanie funkcji HAL_SPI_MspInit, która została zaimplementowana w pliku src/PmodACL.c. Funkcję tą przedstawiono na listingu 2. Jest ona odpowiedzialna za konfigurację pinów SS, SCLK, MISO, a także MOSI. Zgodnie z konfiguracją modułu SPI1, pin SS (PB0) jest sterowany programowo i zostaje pod kontrolą portu GPIO.

Listing 2. Konfiguracja pinów używanych przez SPI

Odczyt danych

Podczas wysyłania adresu rejestru przez interfejs SPI, dwa najstarsze bity mają szczególne znaczenia. Bit 7. oznacza typ operacji – zapis (0) lub odczyt (1), natomiast bit 6. można ustawić do odczytu lub zapisu wielu bajtów. Adres jest wówczas automatycznie inkrementowany, co umożliwia odczyt danych ze wszystkich osi podczas jednej transakcji SPI. Funkcję realizującą odczyt i konwersję danych przedstawiono na listingu 3. Przy ustawieniu rozdzielczości na 4 mg/LSB, odczyt każdej z osi należy pomnożyć przez 4, aby otrzymać wynik pomiaru w [mg]. Kolejka FIFO w przykładzie nie jest używana, dlatego zawsze odczytywane są wyniki z ostatniego pomiaru. Częstotliwość wykonywania pomiarów jest konfigurowana w rejestrze BW_RATE (0x2C). W przykładzie ma on wartość domyślną 0x0A, co oznacza częstotliwość 100 Hz. Za realizację odczytu i zapisu przez SPI są odpowiedzialne dwie funkcje pomocnicze: readRegister, a także writeRegister zaprezentowane na listingu 4.

Listing 3. Odczyt i konwersja danych z akcelerometru

Listing 4. Funkcje pomocnicze do zapisu i odczytu danych przez SPI

Obsługa przerwań

Główna pętla programu w pliku src/main.c wykonuje odczyt danych co jedną sekundę, a także wysyła wartości przyspieszenia ze wszystkich trzech osi na port szeregowy LPUART1. Konfiguracja portu znajduje się w pliku src/serial.c. W pliku main.c znajduje się także obsługa przerwania konfigurowanego przez funkcję PmodACL_Config. Funkcja obsługi przerwania, przedstawiona na listingu 5, odczytuje rejestr akcelerometru przechowujący stan przerwań. Mimo, że w przykładzie używane jest tylko jedno źródło przerwania, to odczyt jest konieczny ze względu na czyszczenie ich stanu w akcelerometrze.

Listing 5. Funkcja obsługi przerwań generowanych przez PmodACL

Wystąpienie przerwania sygnalizowane jest przez mrugnięcie diody LED0 na płytce KAmeleon. Użyta w przerwaniu funkcja HAL_Delay wprowadza opóźnienie w obsłudze przerwania, co nie jest dobrą praktyką i zostało zaimplementowane tylko ze względu na uproszczenie kodu. Aby opóźnienie mogło zadziałać, priorytet przerwania SysTick musi być wyższy od przerwania, w obsłudze którego jest użyte. Priorytet ten można zmienić w pliku stm32l4xx_hal_conf.h (TICK_INT_PRIORITY). Funkcje pomocnicze do obsługi diody zaimplementowano w pliku src/led.c.

Moduły PmodACL i PmodMAXSONAR, a także zestaw KAmeleon oraz wiele innych płytek ewaluacyjnych i modułów rozszerzających można znaleźć w ofercie Kamami.pl

Do pobrania

O autorze