Biblioteka SeggerSTemWin w praktyce (4): magnetometr na zestawie STM32F429I-DISCO

Krótka charakterystyka platformy sprzętowej

Wykorzystany w projekcie zestaw STM32F429I-DISCOVERY (fotografia 1) zawiera praktycznie wszystkie niezbędne elementy do przetwarzania i prezentacji danych, a ich źródłem jest zewnętrzny zintegrowany czujnik pola magnetycznego (indukcji magnetycznej) A1395 firmy Allegro MicroSystems (rysunek 2, 3, 4), cechujący się niewielkimi wymiarami (2 mm x 3 mm x 0.75 mm) i niewymagający stosowania dodatkowych elementów w celu przeprowadzenia pomiarów. Dany model czujnika oprócz uzyskania informacji o obecności pola i jego biegunowości pozwala także odczytać liczbową wartość indukcji. Schemat jego podłączenia do zestawu przedstawia rysunek 5.

Fot. 1. Zestaw STM32F429I-Discovery

Rys. 2. Czujnik pola magnetycznego o wymiarach 3 mm x 2 mm x 0.75 mm

Rys. 3. Schemat blokowy układu czujnika A1395

Rys. 4. Opis wyprowadzeń układu czujnika A1395

Rys. 5. Schemat elektryczny podłączenia układu czujnika A1395 do zestawu STM32F429I-DISCO

Zgodnie z informacją zawartą w dokumentacji [1] czujnik może być zasilany napięciem Vcc=2.5V…3.5V i wymaga dostarczenia napięcia referencyjnego w zakresie 2.5V…Vcc. Wartość mierzonej indukcji magnetycznej jest konwertowana na wartość napięcia na wyjściu OUT, przy czym w przypadku braku pola magnetycznego napięcie to wynosi VREF/2, a w pozostałych jest odchylane w kierunku potencjału 0V lub VREF w zależności od biegunowości pola i proporcjonalnie do jego intensywności. Przy pomocy wbudowanego w mikrokontrolerze STM32F429ZIT6U przetwornika A/C z 12-bitową rozdzielczością napięcie na wyjściu czujnika jest mierzone (nóżka PC3, do której podłączony jest 13 kanał przetwornika) i przeliczane na wartość indukcji magnetycznej w gaussach i teslach zgodnie ze wzorami:

Warto tutaj dodać, że zastosowany czujnik A1395 jest jednym z czterech dostępnych czujników pola magnetycznego z rodziny A1395x różniących się czułością (tabela 1). Im mniejsza czułość tym większy zakres mierzonych wartości indukcji magnetycznej.

Tab. 1. Czułość i zakres czujników pola magnetycznego z rodziny A139x

 

Model Czułość [mV/G] Zakres B [G], VREF=3V
A1391 1,25 ±1200
A1392 2,50 ±600
A1393 5 ±300
A1395 10 ±150

 

Prezentacja danych na wykresie

Wizualizację wyników pomiarów w postaci wykresu można stosunkowo łatwo zrealizować wykorzystując jeden z dostępnych widżetów biblioteki STemWin [2,5]. Widżet GRAPH, którego strukturę przedstawia rysunek 6, umożliwia wyświetlenie wielu zbiorów danych (wykresów), a także informacji ich opisujących.

Rys. 6. Struktura widżetu GRAPH

 

Użytkownik może wybrać jeden z dwóch rodzajów wykresów (rysunek 7) i przy pomocy dostępnych procedur (tabela 2) skonfigurować jego wygląd. Wykres XY można zastosować do prezentacji zbioru punktów typu GUI_Point, natomiast wykres YT nadaje się do wyświetlania ciągu wartości typu I16.

Rys. 7. Rodzaje wykresów widżetu GRAPH

Sekwencja czynności wykonywanych podczas rysowania wykresów jest następująca:

  1. Wypełnienie tła wykresu zdefiniowanym kolorem,
  2. Wywołanie opcjonalnej funkcji zwrotnej (np. w celu narysowania siatki użytkownika),
  3. Narysowanie siatki (jeśli została uaktywniona),
  4. Narysowanie zbioru danych i obramowania,
  5. Narysowanie skali,
  6. Wywołanie opcjonalnej funkcji zwrotnej (np. do narysowania skali użytkownika lub dowolnego tekstu/grafiki).

Przykład kodu tworzącego widżet GRAPH wraz ze zbiorem danych może wyglądać jak poniżej:

Tab. 2. Procedury powiązane z widżetem GRAPH [2]

Procedura Opis
Procedury ogólne
GRAPH_AttachData() Dołącza zbiór danych do widżetu GRAPH (rysunek 8).
GRAPH_AttachScale() Dołącza skalę do widżetu GRAPH (rysunek 9).
GRAPH_CreateEx() Tworzy widżet GRAPH.
GRAPH_CreateIndirect() Tworzy widżet GRAPH z poziomu tablicy zasobów.
GRAPH_CreateUser() Tworzy widżet GRAPH z dodatkową rezerwacją miejsca w pamięci dla danych użytkownika.
GRAPH_DetachData() Odłącza zbiór danych od widżetu GRAPH.
GRAPH_DetachScale() Odłącza skalę od widżetu GRAPH.
GRAPH_GetScrollValue() Zwraca bieżącą wartość (pozycję) wybranego paska przewijania.
GRAPH_GetUserData() Odczytuje dane użytkownika z widżetu GRAPH.
GRAPH_SetAutoScrollBar() Ustawia automatyczne użycie pasków przewijania.
GRAPH_SetBorder() Ustawia szerokość obramowania (szerokość czterech krawędzi osobno) (rysunek 10).
GRAPH_SetColor() Ustawia kolor wybranego elementu widżetu GRAPH.
GRAPH_SetGridDistX() Ustawia odstęp między pionowymi liniami siatki.
GRAPH_SetGridDistY() Ustawia odstęp między poziomymi liniami siatki (rysunek 11).
GRAPH_SetGridFixedX() Blokuje przemieszczanie się siatki w osi poziomej.
GRAPH_SetGridOffY() Przesuwa siatkę w osi pionowej (rysunek 12).
GRAPH_SetGridVis() Ustawia widoczność siatki.
GRAPH_SetLineStyleH() Ustawia styl poziomych linii siatki (rysunek 13).
GRAPH_SetLineStyleV() Ustawia styl pionowych linii siatki.
GRAPH_SetScrollValue() Przewija wybrany pasek (przesuwa wykres).
GRAPH_SetUserData() Zapisuje dane użytkownika w widżecie GRAPH.
GRAPH_SetUserDraw() Pozwala na wskazanie funkcji zwrotnej (rysunek 14).
GRAPH_SetVSizeX() Ustawia (wirtualny) zakres wartości wykresu w osi poziomej.
GRAPH_SetVSizeY() Ustawia (wirtualny) zakres wartości wykresu w osi pionowej.
Procedury powiązane ze zbiorem danych GRAPH_DATA_YT
GRAPH_DATA_YT_AddValue() Dodaje nową wartość do zbioru danych GRAPH_DATA_YT (rysunek 15)
GRAPH_DATA_YT_Clear() Usuwa wszystkie wartości ze zbioru danych GRAPH_DATA_YT.
GRAPH_DATA_YT_Create() Tworzy nowy zbiór danych GRAPH_DATA_YT.
GRAPH_DATA_YT_Delete() Usuwa wskazany zbiór danych GRAPH_DATA_YT.
GRAPH_DATA_YT_MirrorX() Zmienia kierunek rysowania wykresu (rysunek 16).
GRAPH_DATA_YT_SetAlign() Ustawia wyrównanie wykresu do prawej lub lewej (rysunek 17).
GRAPH_DATA_YT_SetOffY() Przesuwa wartości zbioru danych w osi pionowej wykresu.
Procedury powiązane ze zbiorem danych GRAPH_DATA_XY
GRAPH_DATA_XY_AddPoint() Dodaje nowy punkt do zbioru GRAPH_DATA_XY (rysunek 18).
GRAPH_DATA_XY_Create() Tworzy nowy zbiór punktów GRAPH_DATA_XY.
GRAPH_DATA_XY_Delete() Usuwa wskazany zbiór punktów GRAPH_DATA_XY.
GRAPH_DATA_XY_SetLineStyle() Ustawia styl linii wykresu (rysunek 19).
GRAPH_DATA_XY_SetOffX() Przesuwa punkty zbioru w osi poziomej wykresu.
GRAPH_DATA_XY_SetOffY() Przesuwa punkty zbioru w osi pionowej wykresu.
GRAPH_DATA_XY_SetOwnerDraw() Pozwala na wskazanie funkcji zwrotnej.
GRAPH_DATA_XY_SetPenSize() Ustawia grubość linii wykresu (rysunek 20).
Procedury powiązane ze skalą GRAPH_SCALE
GRAPH_SCALE_Create() Tworzy nową skalę GRAPH_SCALE.
GRAPH_SCALE_Delete() Usuwa wskazaną skalę GRAPH_SCALE.
GRAPH_SCALE_SetFactor() Przemnaża wartości na skali przez podany współczynnik (rysunek 21).
GRAPH_SCALE_SetFont() Zmienia czcionkę tekstu skali.
GRAPH_SCALE_SetNumDecs() Ustawia liczbę cyfr wyświetlanych po przecinku (rysunek 22).
GRAPH_SCALE_SetOff() Przesuwa skalę w osi pionowej wykresu (rysunek 23).
GRAPH_SCALE_SetPos() Przesuwa skalę w osi poziomej wykresu (rysunek 24).
GRAPH_SCALE_SetTextColor() Zmienia kolor tekstu skali.
GRAPH_SCALE_SetTickDist() Zmienia odstęp między działkami skali w pikselach (rysunek 25).

Rys. 8. Dołączenie zbioru danych

Rys. 9. Dołączenie skali

Rys. 10. Zmiana szerokości obramowania

Rys. 11. Zmiana odstępu między poziomymi liniami siatki

Rys. 12. Przesunięcie siatki w osi pionowej

Rys. 13. Zmiana stylu linii siatki z ciągłej na kropkowaną

Rys. 14. Funkcja zwrotna umożliwia rysowanie dodatkowej grafiki na wykresie

Rys. 15. Dodanie nowych wartości do zbioru danych

Rys. 16. Zmiana kierunku rysowania wykresu w osi X

Rys. 17. Wyrównanie wykresu do prawej (przed) i do lewej (po)

Rys. 18. Dodanie nowych punktów do zbioru

Rys. 19. Zmiana stylu linii wykresu

Rys. 20. Zmiana grubości linii wykresu

Rys. 21. Zmiana wartości na skali

Rys. 22. Zmiana dokładności skali

Rys. 23. Przesunięcie skali w osi pionowej

Rys. 24. Przesunięcie skali w osi poziomej

Rys. 25. Zmiana odstępu między działkami skali

Projekt aplikacji magnetometru

Aplikacja magnetometru została stworzona poprzez modyfikację i uzupełnienie projektu z przykładem użycia widżetu FRAMEWIN [6]. Definicje funkcji przedstawionych poniżej umieszczono w pliku main.c.

Po uruchomieniu układu wykonywanie programu rozpoczyna się od głównej funkcji main(), w której konfigurowane są peryferia (przycisk, przetwornik A/C), tworzone jest nowe zadanie „Magnetometer” oraz wywoływany jest planista (ang. scheduler) systemu FreeRTOS.

Przetwornik A/C jest skonfigurowany do pracy z 13 kanałem (nóżka PC3), a pojedynczy pomiar wyzwalany jest programowo w funkcji adc_convert():

Zadanie o nazwie „Magnetometer” realizuje funkcja Main_Task(). Pierwsza rzecz jaka jest wykonywana w tym zadaniu to inicjalizacja warstwy BSP oraz biblioteki STemWin, a dopiero po tym tworzone są widżety FRAMEWIN, GRAPH i TEXT.

Funkcja rysująca dodatkowe elementy na wykresie, nazwę której przekazano jako argument dla funkcji GRAPH_SetUserDraw(), wygląda jak poniżej. Dzięki niej możliwym jest dodanie podpisu dowolnej osi (i nie tylko; można również narysować dowolną rzecz), a w danym przypadku jest to pionowa oś z wartościami napięcia.

W wyniku działania aplikacji na wykresie będzie widoczny przebieg wartości napięcia w czasie na wyjściu OUT czujnika, a poniżej prezentowane będą aktualne wartości mierzonej indukcji magnetycznej wraz z podaniem „umownej” biegunowości pola (N – biegun północny, S – biegun południowy) (fotografia 1). Pomiary są wykonywane co około 50 ms.

Fot. 1. Prezentacja wyników pomiarów w postaci wykresu i tekstu

Badania magnesów

W ramach prostych testów aplikacji przeprowadzono badania kilku magnesów (fotografia 2), których parametry przedstawiono w tabelce 3. Ze względu na zbyt duże wartości indukcji w pobliżu badanych magnesów oraz niewielki zakres pomiarowy czujnika jest dość ciężko określić dokładność wskazań przyrządu. Również zauważalnym jest szum mierzonego napięcia Vout, które może oscylować w granicach do ±5 mV, co w przeliczeniu daje ±0.5 gaussów dla modelu A1395. Zakres odległości na jakich odczytana wartość indukcji danych magnesów zawierała się w zakresie pomiarowym czujnika wynosi od 7 mm do 80 mm.

Fot. 2. Magnesy trwałe wykorzystane w badaniach

Tab. 3. Parametry badanych magnesów

Materiał
magnesu

Indukcja remanencji
B
r [T]
Koercja
H
cB [kA/m]
Koercja
H
cJ [kA/m]
Wymiary [mm] Kierunek magnesowania
F30 0,37 – 0,40 175 – 210 180 – 220 25 x 10 x 5 wzdłuż wymiaru 5 mm
N38 1,21 – 1,25 min. 899 min. 955 15 x 10 x 2 wzdłuż wymiaru 2 mm
N38 1,21 – 1,25 min. 899 min. 955 4 x 20 wzdłuż wymiaru 20 mm

Wyjaśnienia niektórych pojęć z powyższej tabelki:

Remanencja (namagnesowanie szczątkowe) – wartość indukcji magnetycznej pozostała po usunięciu zewnętrznego pola magnetycznego magnesującego dany materiał ferromagnetyczny. Remanencja jest jednym z głównych parametrów charakteryzujących magnesy trwałe [4].

Koercja magnetyczna – wartość zewnętrznego pola magnetycznego jaką trzeba przyłożyć do ferromagnetyka, aby zmniejszyć do zera pozostałość magnetyczną. Zależnie od wartości koercji ferromagnetyki dzieli się umownie na magnetycznie twarde (o dużej wartości koercji, powyżej 10000 A/m), magnetycznie półtwarde (o wartościach pośrednich) oraz magnetycznie miękkie (o stosunkowo niewielkich wartościach koercji, poniżej 1000 A/m) [3].

Jan Szemiet

Literatura

[1] Allegro MicroSystems A1395: Micro Power 3 V Linear Hall Effect Sensor ICs with Tri-State Output and User-Selectable Sleep Mode

[2] UM03001: emWin, Graphic Library with Graphical User Interface, User & Reference Guide

[3] http://pl.wikipedia.org/wiki/Koercja_magnetyczna

[4] http://pl.wikipedia.org/wiki/Remanencja

[5] http://stm32.eu/node/393 – Biblioteka Segger STemWin dla STM32 – graficzne HMI bez problemu!

[6] http://stm32.eu/node/391 – Biblioteka Segger STemWin w praktyce (2): menadżer okien

Do pobrania

Autor: