[2] STM32CUBE w przykładach

W tej części kursu zapoznamy się z licznikami oraz generatorem sygnału PWM, który będzie generowany przez mikrokontroler z zestawu KA-NUCLEO-F411. Dowiemy się jak płynnie zmieniać jasność świecenia diody, czym jest korekcja gamma oraz jak mieszać kolory, korzystając z różnych przestrzeni barw. Wszystkie te rzeczy omówione zostaną w trakcie tworzenia projektu, którego efektem będzie program płynnie zmieniający kolor diody RGB, przechodząc przy tym przez wszystkie możliwe do uzyskania barwy.

Liczniki to bardzo proste układy – rejestry zawierające liczby, najczęściej 16–bitowe, rzadziej 8–bitowe lub 32–bitowe. Sygnał prostokątny wchodzący na wejście licznika, powoduje każdorazowe zwiększenie (inkrementację) jego zawartości na zboczu narastającym lub opadającym. Sygnał ten może pochodzić z wejścia GPIO (gdy przykładowo zliczamy ilość wejść do sklepu albo wciśnięć przycisku) lub być odpowiednio podzielonym sygnałem taktującym układu. Po doliczeniu do wartości maksymalnej (dla 16–bitowego licznika jest to wartość 65535), licznik resetuje się – ustawia wartość 0. Po osiągnięciu ustalonej wartości, licznik może wywoływać ustaloną akcję. Na przykład, w momencie zresetowania, może wygenerować przerwanie licznika, czyli przerwać wykonywanie kodu programu i kazać procesorowi przeskoczyć do wykonywania ustalonej funkcji.

Innym przykładem takiej akcji może być generowanie sygnału PWM. Generator sygnału PWM ustawia stan wysoki na pinie (3.3V), w momencie zresetowania się licznika i stan niski (0V) po doliczeniu do zadanej wartości z zakresu od zera do wartości po osiągnięciu której licznik się resetuje (tą również możemy zdefiniować na niższą niż maksymalna). Jeśli na przykład wartość po osiągnięciu której licznik zresetuje się, ustawimy na 999, co da nam (licząc od zera) 1000 stanów przez które każdorazowo przejdzie licznik oraz wartość po osiągnięciu której, generator ustawia na pinie stan niski na 499, stan wysoki oraz stan niski będą panowały na pinie przez 50% czasu, zmieniając się bardzo szybko. Jeśli do piniu podłączona zostanie dioda LED, będzie ona bardzo szybko migała pozostając zapaloną przez 50% czasu i zgaszoną przez drugą połowę. Da nam to złudzenie możliwości sterowania jasnością świecenia diody. W identyczny sposób możemy sterować silnikami.

Do dzieła!

Podobnie jak w pierwszej części, zacznijmy od utworzenia nowego projektu w programie STM32CubeMX. Wybieramy z listy nasz mikrokontroler. Dla przypomnienia, na wykorzystywanej, podczas tworzenia tego kursu, płytce rozwojowej Kamami KA–NUCLEO–F411CE, znajduje się układ STM32F411CEU6. Podobnie jak poprzednio, z listy po lewej stronie rozwijamy kolejno „Peripherals”, oraz „RCC”. Następnie, w polu „High Speed Clock (HSE)”, wybieramy opcję „Cristal/Ceramic Resonator”.

Jeśli korzystamy z płytki KA–NUCLEO–F411CE, odszukujemy piny PB13, PB14 oraz PB15. Są to piny podłączone do diody LED RGB. Pin PB13 odpowiada za kolor niebieski, PB14 to kolor czerwony, a PB15 – zielony. Klikamy na każdy z wymienionych pinów lewym przyciskiem myszy i z menu wybieramy jego funkcję alternatywną – „TIM1_CHxN”. Od teraz piny te będą obsługiwane przez układ pierwszego licznika. Musimy jeszcze skonfigurować, w jaki sposób ma się to odbywać. W tym celu przechodzimy do menu po lewej stronie i rozwijamy w nim zakładkę „Peripherals” –> „TIM1” – przechodzimy do konfiguracji licznika TIM1. Z listy rozwijanej, w polach Channel od 1 do 3 wybieramy pozycję „PWM Generation CHxN”, powodującą generowanie sygnału PWM na pinach skojarzonych z kanałem licznika. Należy zwrócić szczególną uwagę na literę N występującą w funkcjach alternatywnych pinów oraz w polach Channel. Trzy pierwsze kanały licznika TIM1 obsługują jednocześnie po dwa piny. Jeden z tych pinów oznaczony jest jako „CHx”, a drugi – „CHxN”. Możemy generować sygnał PWM na dowolnym z nich lub na obu na raz – opcje „PWM Generation CHx”, „PWM Generation CHxN” oraz „PWM Generation CHx CHxN”.

Jeśli korzystamy z innej płytki rozwojowej, musimy zorientować się do których pinów podłączona jest dioda RGB lub podłączyć ją samemu. Wybieramy wtedy takie piny, aby możliwe było na nich generowanie sygnału PWM – muszą one zawierać na liście funkcji alternatywnych pozycję „TIMx_CHx” lub „TIMx_CHxN”, a dany kanał CHx licznika TIMx musi posiadać opcję „PWM Generation CHx” i/lub „PWM Generation CHxN”.

W obu przypadkach, w polu „Clock Source” w konfiguracji licznik, wybieramy opcję „Internal Clock” – w ten sposób ustawiamy sygnał wejściowy, inkrementujący licznik, na wewnętrzny sygnał taktujący.

Konfiguracja pinów w programie STM32CubeMX

Następnie, po skonfigurowaniu pinów, przechodzimy do drugiej zakładki głównego okna programu STM32CubeMX i konfigurujemy pętlę PLL. Ustawiamy ją analogicznie jak w poprzedniej części – „PLL Source Mux” przestawiamy na „HSE”. W polu „Input frequency” przed blokiem „HSE” wpisujemy częstotliwość naszego generatora (na płytce KA–NUCLEO–F411CE jest to 8 MHz). W sekcji „System Clock Mux” wybieramy pozycję „PLLCLK”. W pole „HCLK” wpisujemy maksymalną częstotliwość obsługiwaną przez nasz układ (tutaj, 100 MHz). Teraz należy się jeszcze upewnić, jaka częstotliwość wchodzi na blok „APB2 Timer clock” (przy korzystaniu z liczników o numerach TIM1, TIM9, TIM10 lub TIM11) albo „APB1 Timer clock” (liczniki TIM2, TIM3, TIM4 oraz TIM5) i zapamiętać tą wartość lub ją zapisać.

Konfiguracja pętli PLL w programie STM32CubeMX)

Konfiguracja licznika

Konfiguracja licznika TIM1 w CubeMX

Teraz, po raz pierwszy, przechodzimy do zakładki Configuration – kolejnej karty okna programu STM32CubeMX. Pozwala ona na dokładną konfigurację peryferiali. To właśnie tutaj ustawimy szybkość pracy interfejsów UART, a także wartość, po doliczeniu do której, resetować mają się liczniki. Z sekcji „Control” wybieramy przycisk oznaczający licznik wybrany do generowania sygnału PWM (TIM1 jeśli korzystamy z płytki rozwojowej KA–NUCLEO–F411CE).

Jak już wspominałem, generator sygnału PWM, w normalnym trybie pracy, ustawia stan wysoki na pinie w momencie zresetowania licznika. Stan niski ustawiany jest w momencie osiągnięcia pewnej innej zdefiniowanej wartości. Powoduje to bardzo szybkie miganie diody oraz złudzenie świecenia ze zmienną jasnością.

Jak więc powinniśmy skonfigurować licznik? Na początku musimy zdecydować, z jaką częstotliwością chcemy aby nasza dioda migała. Żarówki zasilane z domowej sieci elektrycznej, migają z częstotliwości 100 Hz (zapalają się i gasną dwukrotnie w trakcie jednego okresu fali). Jest to już wystarczająca, niezauważalna dla ludzkiego oka częstotliwość. Załóżmy jednak że chcemy aby nasza dioda migała z częstotliwością 400 Hz. Musimy doprowadzić do sytuacji w której licznik będzie resetował się z taką częstotliwością.

Odpowiadają za to pola/rejestry „Prescaler (PSC – 16 bit value)” oraz „Counter Period (AutoReload Register – 16 bit value)”. W pierwszym z nich ustalamy z jaką częstotliwość licznik zwiększa swoją wartość (lub zmniejsza, bo i tak można go ustawić), w drugim, po osiągnięciu jakiej wartości, licznik ma się zresetować. Ta druga wartość powinna być jak największa, aby pozwolić nam na płynne ustalanie jasności świecenia diody. Tę będziemy wybierać z zakresu od zera do wartości „Counter Period (AutoReload Register – 16 bit value)”, gdzie zero odpowiada jasności 0%, a wartość rejestru/pola AAR – 100%.

Jeśli zatem chcemy uzyskać częstotliwość migania 400 Hz, możemy ustawić częstotliwość z jaką licznik inkrementuje swoją wartość na 20 MHz, dzieląc wejściową częstotliwość 100 MHz na 5, oraz wartość po doliczeniu do której, licznik zresetuje się (“Counter Period”) na 49999 (tak aby przyjął w trakcie zliczania 50000 różnych wartości, z przedziału od 0 do 49999). Do pola „Prescaler” wpisujemy wartość dzielnika pomniejszoną o jeden – 4 (zamiast 5), a do „Counter Period” – 49999.

Pozwala to wyprowadzić prosty wzór:

Częstotliwość migania * (Counter Period + 1) * (Prescaler + 1) = Częstotliwość wchodząca na licznik

Oba pola – „Counter Period” oraz „Prescaler” przyjmują wartości z zakresu od 0 do 65535, w przypadku liczników 16–bitowych.

W dalszej części okna, znajdują się sekcje odpowiadające za ustawienia każdego z wykorzystywanych kanałów licznika. Dla przypomnienia, każdy z nich odpowiada za generowanie sygnału PWM dla osobnego koloru (niebieskiego, czerwonego oraz zielonego). Ponieważ nasza dioda świeci gdy na pinie panuje stan niski i gaśnie gdy ustawimy stan wysoki, musimy odwrócić (zanegować) sygnał PWM. Robimy to osobno dla każdego kanału, zmieniając parametr „CH Polarity” na „LOW”.

Do pobrania