wersja mobilna

Arduino dla mikrokontrolerów STM32 (4)

Numer: Styczeń/2019

W poprzednich artykułach z tego cyklu pokazano, jak skonfigurować środowisko programistyczne Arduino do pracy z mikrokontrolerami STM32 oraz jak zrealizować aplikację używającą portów wejścia/wyjścia i interfejsu szeregowego UART. Ta część kontynuuje wątek aplikacyjny, demonstrując sposób wykorzystania kolejnego zasobu: przetwornika A/C.

Pobierz PDF

Pracę należy rozpocząć, uruchamiając środowisko programistyczne Arduino. Przygotowanie do pisania kodu obejmuje kilka prostych kroków.

Arduino i STM32 – przygotowanie do pracy

W pierwszej kolejności konieczne jest stworzenie nowego projektu (zwanego sketchem w Arduino). W tym celu użytkownik wybiera z menu głównego środowiska programistycznego kolejno FileNew (skrót klawiaturowy CTRL+N).

W następnym kroku należy wskazać używaną platformę sprzętową. Przykładowo, autor wybrał płytkę NUCLEO-L476RG z 64-pinowym układem STM32L476RG (rysunek 1). W tym celu należy ponownie użyć menu głównego środowiska programistycznego. Wybór platformy przebiega w dwóch etapach. Najpierw klikając ToolsBoard, wybrać należy Nucleo-64. Następnie ToolsBoard Part Number, wybrać należy Nucleo L476.

W ostatnim kroku należy zapisać projekt na dysku twardym. Jednocześnie warto zmienić nazwę projektu na bardziej intuicyjną, gdyż domyślna nazwa zawiera tylko słowo sketch oraz nazwę aktualnego miesiąca i dnia. Chcąc zapisać projekt oraz zmienić jego nazwę użytkownik znowu korzysta z menu głównego środowiska programistycznego, wybierając kolejno FileSave as… (skrót klawiaturowy CTRL+Shift+S). W ten sposób otworzone zostanie okno, które pozwoli na wybranie na dysku twardym ścieżki, pod którą zapisany zostanie projekt. Jednocześnie okno pozwala na wpisanie nowej nazwy projektu.

Arduino i STM32 – struktura kodu

Każdy stworzony od nowa projekt (sketch) zawiera domyślnie kilka linii kodu tworzących szkielet aplikacji. Kod ten pokazano w listingu 1. Składa się on z dwóch funkcji. Pierwsza funkcja nosi nazwę setup. Jej przeznaczenie można łatwo rozszyfrować, zapoznając się z komentarzem. Programista umieszcza w niej kod, który ma zostać wykonany tylko raz, na początku aplikacji, a więc po doprowadzeniu napięcia zasilania do mikrokontrolera. Są to głównie funkcje konfigurujące peryferia mikrokontrolera (np. ustawiające parametry przetwornika A/C lub interfejsu UART) albo inicjujące podzespoły zewnętrzne (np. moduł Bluetooth). Druga funkcja otrzymała nazwę loop. Ponownie w rozszyfrowaniu jej przeznaczenia pomaga komentarz. Jest to nieskończona pętla, w której programista umieszcza funkcje wykonywane cyklicznie (np. odczyt stanu przycisku lub odebranie danych z czujnika). Zatem programista tworzy kod aplikacji, uzupełniając ciała funkcji setuploop o dodatkowy kod języka Arduino. Kod ten składa się z typowych elementów języka programowania, takich jak zmienne, funkcje, instrukcje warunkowe czy operacje matematyczne.

Przetwornik A/C – podstawowe informacje

Często zdarza się, że system elektroniczny oparty na mikrokontrolerze wykorzystuje nie tylko sygnały cyfrowe, a więc takie, w których wyróżnić można wartość binarną 0 i 1 (np. sygnał PWM, interfejsy komunikacyjne I2C/UART/SPI itp.), ale używa również sygnałów analogowych, których wartość nie ogranicza się do logicznego 0 i 1, a zmienia się w sposób dowolny w zakresie między wartością minimalną i maksymalną. Do poprawnego odczytania wartości takich sygnałów mikrokontroler wykorzystuje odpowiedni zasób, jakim jest przetwornik A/C. Jak sama nazwa wskazuje, zdefiniować go można jako blok konwertujący sygnał analogowy do postaci cyfrowej. Proces ten odbywa się w trzech etapach: próbkowania, kwantowania i kodowania. Próbkowanie to czynność zamiany sygnału ciągłego na sygnał dyskretny, a więc na grupę pomiarów wykonanych w stałym odstępie czasu. Kwantyzacja jest czynnością polegającą na przypisaniu każdej z próbek wartości liczbowej ze zbioru wartości, jakie przyjąć może wyjście przetwornika. Kodowanie natomiast jest zamianą wartości liczbowej wyjścia przetwornika na odpowiadającą jej sekwencję bitów. Poszczególne etapy tego procesu zilustrowano na rysunku 2.

Przetwornik A/C – funkcje Arduino

W Arduino przewidziało wykorzystanie tylko jednego przetwornika A/C. Nie oznacza to jednak, że napięcie można odczytywać tylko z jednego pinu mikrokontrolera. Możliwych do użycia wyprowadzeń mikrokontrolera na potrzeby konwersji analogowo-cyfrowej jest łącznie sześć (oznaczone są one jako A0…A5). Są to tak zwane kanały przetwornika A/C. Wewnątrz mikrokontrolera sygnały z kanałów doprowadzone są do multipleksera, a ten wybiera jeden z nich i łączy go z przetwornikiem.

Sam przetwornik A/C zwraca wynik o rozdzielczości 10 bitów. W praktyce oznacza to, że napięcie minimalne (0 V) reprezentowane jest przez wartość przetwornika 0, natomiast napięcie maksymalne (równe napięciu zasilania, w przypadku płytki Nucleo jest to 3,3 V) reprezentowane jest przez wartość 2 do potęgi 10 minus 1, a więc 1023. Z tej zależności wyznaczyć można wzór przeliczający wynik przetwornika na napięcie. Do korzystania z przetwornika A/C wystarczy znajomość jednej funkcji. Nazywa się ona analogRead. Funkcja ta przyjmuje jeden argument, jakim jest liczba całkowita z zakresu 0…5. Liczba ta identyfikuje wejście przetwornika (kanał), którego programista chce użyć, a więc A0…A5. Funkcja zwraca wartość adekwatną do odczytanego napięcia (zakres 0…1023).

Przetwornik A/C – przykładowa aplikacja

W odstępnie czasu co 100 ms aplikacja będzie odczytywała wynik konwersji przetwornika A/C. W przykładowej aplikacji wykorzystany zostanie jeden kanał przetwornika oznaczony jako A3 (pin PA4). Za każdym razem odczytana wartość zostanie przekształcona za pomocą wzoru na wartość napięcia. Następnie wynik napięcia zostanie wysłany portem szeregowym (pin PA2). Jako że zintegrowany na płytce Nucleo programator/debugger ST-Link pełni funkcję mostu pomiędzy interfejsem UART i interfejsem USB emulującym port COM, wysyłane przez aplikację wartości będzie można odczytać za pomocą terminalu komputerowego. Odpowiedni schemat pokazano na rysunku 3.

Po zapoznaniu się najpierw z funkcją Arduino do obsługi przetwornika A/C, a następnie po przeanalizowaniu schematu połączeń, jesteśmy gotowi do napisania programu realizującego odczyt wartości przetwornika, konwersję do wartości napięcia oraz transmisję danych do komputera. Zaprezentowany na listingu 2 kod zawiera kolejno:

- Przed funkcją setup:

  • deklarację zmiennej typu całkowitego Wartosc do przechowywania wyniku konwersji przetwornika A/C,
  • deklarację zmiennej typu zmiennoprzecinkowego Napiecie do przechowywania wyniku napięcia.

- Wewnątrz funkcji setup:

  • wywołanie funkcji Serial.begin ustawiającej prędkość transmisji interfejsu UART.

- Wewnątrz funkcji loop:

  • wywołanie funkcji analogRead realizującej pomiar przetwornikiem A/C dla wybranego kanału i zwracającej wynik tej konwersji, która zapisana zostaje w zmiennej Wartosc,
  • przekształcenie za pomocą wzoru wyniku konwersji na napięcie i zapisanie jej w zmiennej Napiecie,
  • wywołanie funkcji Serial.println, która wysyła do komputera zawartość zmiennej Napiecie.

Po napisaniu kodu program należy skompilować, wybierając przycisk Verify (skrót klawiaturowy CTRL+R). Po zakończeniu procesu kompilacji należy wgrać program do pamięci mikrokontrolera, wybierając przycisk Upload (skrót klawiaturowy CTRL+U).

Działanie aplikacji można obserwować z poziomu środowiska programistycznego Arduino IDE, które dysponuje terminalem komputerowym portu COM oraz programem do wizualizacji danych. Terminal można włączyć z poziomu menu głównego, wybierając kolejno ToolsSerial Monitor (skrót klawiaturowy CTRL+Shift+M). Program do wizualizacji danych również jest dostępny z poziomu menu głównego: ToolsSerial Plotter (skrót klawiaturowy CTRL+Shift+L). Widok okien obu programów podczas działania aplikacji mikrokontrolera pokazano na rysunku 4.

Podsumowanie

Czwarty artykuł z cyklu traktującego o Arduino i STM32 kontynuuje wątek aplikacyjny, koncentrując się tym razem na przetworniku A/C. W przedstawionym materiale pokazano, jak realizować pomiar napięcia przetwornikiem oraz zademonstrowano sposób wysłania tych danych do komputera za pomocą interfejsu szeregowego.

Kolejny artykuł zakończy aspekt prostych aplikacji korzystających z zasobów mikrokontrolera. Tematyką będzie timer i wytwarzanie za jego pomocą sygnału PWM.

Szymon Panecki
STMicroelectronics
szymon.panecki@st.com

Pozostałe artykuły

Dwurdzeniowe dsPIC33CH w praktyce

Numer: Czerwiec/2019

Dzięki uprzejmości firmy Microchip stałem się posiadaczem zestawu dsPI33CH Curiosity Development Board (fotografia tytułowa). Jest to testowa platforma mająca na pokładzie opisywany już w "Elektronice Praktycznej" dwurdzeniowy mikrokontroler dsPIC33CH128MP508. Wielordzeniowe mikroprocesory nie są czymś niezwykłym, ale w przypadku mikrokontrolerów takie rozwiązania dopiero zaczynają się pojawiać.

Nowości od Cypressa

Numer: Czerwiec/2019

Układy PSoC (programowalny system na chipie) to rodzina scalonych mikrokontrolerów firmy Cypress Semiconductor. Układy te zawierają w sobie rdzeń procesora oraz zespół zintegrowanych, konfigurowalnych urządzeń peryferyjnych - analogowych i cyfrowych - łączonych ze sobą za pomocą programowalnej macierzy połączeń dla sygnałów mieszanych - tak analogowych, jak i cyfrowych.

LoRaWAN - moduł ATSAMR34-XPro

Numer: Maj/2019

LoRaWAN jest radiowym protokółem komunikacyjnym, który pozwala łączyć się z Internetem urządzeniom IoT wyposażonym w łącze radiowe. Połączenie nie jest realizowane wprost, ale za pomocą specjalnych stacji bazowych nazywanych koncentratorami. Bardzo ważną cechą standardu jest możliwość uzyskania dużego zasięgu liczonego w kilometrach przy bardzo ograniczonej mocy nadawania (20 dBm),a co za tym idzie przy małym poborze ...

Mikrokontrolery STM32G0

Numer: Kwiecień/2019

Mikrokontrolery to elementy, które są używane w zastosowaniach, o których kiedyś nawet nie pomyślano. Niska cena powoduje, że wykorzystuje się je na szeroką skalę. Przez długi czas najtańsze były proste jednostki 8-bitowe, ponieważ ich struktury półprzewodnikowe zajmowały relatywnie małe powierzchnie krzemu. Wydajne mikrokontrolery 16-bitowe, a następnie 32-bitowe oferowały coraz większe możliwości, ale jednocześnie ...

Nowe mikrokontrolery Microchip DSC z rodziny dsPIC33CH

Numer: Luty/2019

Mikrokontrolery z rodziny dsPIC33 są przeznaczone głównie do stosowania w układach automatyki i sterowania, wymagających wykonywania złożonych algorytmów. Wydajny, 16-bitowy rdzeń RISC jest zintegrowany z jednostką DSP zoptymalizowaną do szybkiego wykonywania algorytmów przetwarzania cyfrowego. Takiemu połączeniu producent nadał nazwę Digital Signal Controllers - DSC.

Mobilna
Elektronika
Praktyczna

Elektronika Praktyczna

Lipiec 2019

PrenumerataePrenumerataKup w kiosku wysyłkowym

Elektronika Praktyczna Plus

lipiec - grudzień 2012

Kup w kiosku wysyłkowym