[2] STM32CUBE w przykładach

Sterowanie jasnością z kodu programu

Następnie generujemy projekt dla środowiska System Workbench, w sposób opisany w poprzedniej części – klikamy na zębatkę znajdującą się na pasku narzędziowym CubeMX, w polu „Toolchain/IDE” ustawiamy „SW4STM32” i klikamy OK. Dalej importujemy wygenerowany projekt w System Workbench for STM32 – po uruchomieniu i zamknięciu karty powitalnej, klikamy prawym przyciskiem myszy w pole „Project Explorer” i z menu wybieramy kolejno: „Import” –> „General” –> „Existing Projects into Workspace”.

Do pliku main.c, do sekcji „USER CODE 2” oraz „USER CODE 3” dopisujemy poniższy kod.

 

Funkcja HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1) odpowiada za uruchomienie generatora sygnału PWM na drugim pinie (N) obsługiwanym przez kanał pierwszy (TIM_CHANNEL_1), pierwszego licznika (&htim1). Jeśli potrzebujemy uruchomić generator sygnału PWM na pierwszym pinie (bez N), korzystamy z funkcji HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1). Funkcja __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, i) ustawia wartość po doliczeniu do której, generator ma ustawić na pinie stan niski 0V (na płytce STM32F411CEU6, wysoki 3.3V ponieważ diody podłączone są od napięcia dodatniego do pinu mikrokontrolera i odwróciliśmy sygnał PWM w ustawieniach). Wartość tą określa ostatni parametr – tutaj zmienna „i”, zwiększana, a następnie zmniejszana w pętli w zakresie od 0 do 49999 włącznie, z krokiem równym 50. Efektem działania powyższego kodu jest powolne rozjaśnianie oraz wygaszanie poszczególnych kolorów (niebieskiego, czerwonego oraz zielonego).

Teraz możemy skompilować oraz uruchomić program – klikamy ikonkę młotka (Build) oraz robaka (Debug), na pasku narzędziowym, a po przejściu do perspektywy debugowania, przycisk strzałki (Resume).

Jeśli, z powodu błędów, nasz program się nie kompiluje, w panelu „Project Explorer”, klikamy prawym przyciskiem myszy na nazwę projektu i z menu kontekstowego wybieramy polecenie „Properties”. W nowootwartym oknie, otwieramy zakładkę „C/C++ Build” –> „Settings”. W nowootwartej karcie, otwieramy zakładkę „MCU GCC Compiler” –> „Dialect” i w polu „Language standard” ustawiamy pozycję „ISO C99”. Standard ISO C90, który może być ustawiony jako domyślny, nie pozwala na deklarację zmiennych w instrukcjach pętli („…for (int i…”).

Wybór standardu języka C w System Workbench for STM32

 

Czy coś jest nie tak?

Jeśli teraz przyjrzymy się temu, jak zwiększa się jasność świecenia diody, z pewnością zauważymy że dioda najpierw bardzo szybko się rozjaśnia, a po chwili, zmiany te nie są w ogóle zauważalne. Dzieje się tak dlatego, że ludzkie oko nie postrzega jasności w skali liniowej, w jakiej rozjaśniamy diodę. Aby temu zaradzić, stosuje się korekcję gamma. Jasność z zakresu od 0.0 do 1.0 (wartość zmiennoprzecinkową) podnosimy do potęgi 2.2, a następnie rozszerzamy wynik na zakres wartości od zera do wartości rejestru ARR (tutaj 49999), mnożąc wynik przez zawartość tego rejestru. Aby nie kopiować kodu tej operacji, utworzymy funkcję ustawiającą jasność diody po przesłaniu jej takich samych parametrów jak dla funkcji __HAL_TIM_SET_COMPARE(), z tą różnicą że jasność będzie argumentem zmiennoprzecinkowym, z zakresu od 0.0 do 1.0.

 

Z powodu błędu w oprogramowaniu System Workbench, możemy mieć problem z kompilacją powyższego kodu. Aby temu zaradzić, należy wejść w ustawienia projektu (klikamy prawym przyciskiem na jego nazwę i z menu wybieramy polecenie „Properties”). Następnie otwieramy kartę „C/C++ Build” –> „Settings” i w kolejnym panelu, wewnątrz nowej karty, rozwijamy „MCU GCC Linker” –> „Libraries”, przewijamy kartę w dół, odznaczamy opcję „Use C math library” oraz dodajemy (przycisk z plusem), w polu „Libraries”, bibliotekę o nazwie „m”. Dalej klikamy przycisk „Apply” oraz „OK”. Funkcja powf(), wykorzystywana do podniesienia wartości zmiennoprzecinkowej jasności do potęgi 2.2, znajduje się w bibliotece math.

Dodawanie biblioteki math w ustawieniach linkera

 

Mieszanie barw

Cylinder barw HSV (źródło: Wikipedia)


Poszczególne kolory możemy zapalać również w jednym czasie, ustawiając osobno jasność każdej z diod wchodzących w skład diody RGB. W ten sposób uzyskujemy różne kolory i ich odcienie. Przykładowo, zapalenie czerwonej oraz niebieskiej diody da nam kolor fioletowy. Jeśli będziemy zmniejszać jasność koloru czerwonego, stopniowo kolor ten zacznie przechodzić w niebieski. Przestrzeń barw RGB (czerwony, zielony, niebieski) pozwala uzyskać każdy kolor i jest bardzo wygodna do implementacji w sprzęcie – potrzebujemy tylko trzech diod, nie pozwala nam ona jednak na łatwy wybór dowolnej barwy, a następnie ustawienie jej nasycenia albo jasności. Tutaj z pomocą przychodzi przestrzeń kolorów HSV – Hue Saturation Value. Kolor definiujemy w niej jako barwę (Hue – wartość w zakresie od 0 do 360 stopni, patrz ilustracja), jej nasycenie (Saturation – u nas, wartość od 0.0 do 1.0, gdzie 0.0 to kolor biały, a 1.0 to największe możliwe nasycenie) oraz jasność (Value – podobnie, wartość z zakresu od 0.0 do 1.0). Wybrany kolor musimy następnie przekonwertować na przestrzeń RGB, aby możliwe było jego ustawienia na diodach.

Poniższy kod to funkcja konwertująca kolor podany w przestrzeni HSV, na kolor w przestrzeni RGB. Przyjmuje on na wejściu strukturę danych typu hsv, zawierającą 3 pola typu double – barwę, nasycenie i jej jasność, oraz zwraca strukturę typu rgb (jasność koloru czerwonego, zielonego oraz niebieskiego). Kod ten, wraz z definicjami struktur, należy umieścić w sekcji „USER CODE 0”, po funkcji set_led_brightness():

 

Kolejna funkcja uprości nam ustawienie koloru podanego w przestrzeni HSV na diodę RGB. Ją również dodajemy do sekcji „USER CODE 0”:

 

Karuzela

Teraz możemy już wykorzystać nowe funkcje, wywołując je w sekcji „USER CODE 3” – w pętli. Zamieniamy dotychczasową zawartość tej sekcji, na podaną poniżej:

 

W ramach zadania domowego, możemy poeksperymentować, zmieniając natężenie oraz nasycenie barw, najlepiej w pętli, tworząc ciekawe efekty. Pełny kod omawianego przykładu oraz projekt dla programu STM32CubeMX dostępny jest do pobrania poniżej.

Aleksander Kurczyk

Do pobrania