STM8S001J3 (8). Timer w trybie PWM

STM8S001J3 (8). Timer w trybie PWM
Pobierz PDF Download icon
Ósma część cyklu artykułów dotyczących 8-pinowego mikrokontrolera STM8S001J3 poświęcona jest układom licznikowym (timerom). W artykule opisano budowę wybranego układu licznikowego oraz pokazano jak wykonać krok po kroku przykładową aplikację używającą tego zasobu mikrokontrolera do wygenerowania sygnału PWM (Pulse-Width Modulation).

Powszechnie spotykanym w mikrokontrolerach zasobem są układy licznikowe. Zasada ich działania opiera się na zliczaniu impulsów sygnału taktującego (generowanego wewnątrz mikrokontrolera lub doprowadzanego do niego z zewnątrz). Funkcjonalność ta umożliwia układom licznikowym na realizowanie przeróżnych zadań. Główne z nich to:

Wytwarzanie podstawy czasu dla aplikacji przez generowanie przerwania co określony interwał czasu. Jest to wygodny mechanizm dla implementacji zadań cyklicznych. Ponadto przerwanie układu licznikowego może wybudzać mikrokontroler z trybu uśpienia.

Wytwarzanie sygnałów cyfrowych na wyjściu portu mikrokontrolera, w szczególności sygnału PWM. Tego typu sygnał przydatny jest np. w sterowaniu prędkością silników DC, w ustawianiu pozycji serwomechanizmu oraz w zmienianiu poziomu jasności oświetlenia opartego na diodach LED.

Określanie parametrów sygnałów cyfrowych na wejściu portu mikrokontrolera np. długości impulsu lub liczby impulsów. Druga z wymienionych funkcjonalności używana jest np. w tradycyjnych (mechanicznych) licznikach wody.

Cechą wspólną wszystkich sygnałów wytwarzanych przez układ licznikowy jest ich cyfrowy charakter. Oznacza to, że sygnał może przyjąć jeden z dwóch stanów: niski i wysoki. Wartość napięcia tych stanów odpowiada wartościom, jakie może przyjąć port mikrokontrolera: stan niski to 0 V, natomiast stan wysoki to typowo 3,3 V lub 5 V. Szczególnym przypadkiem sygnału generowanego przez układ licznikowy jest sygnał PWM. Jest to sygnał o zadanych: częstotliwości/okresie oraz poziomie wypełnienia (procentowo wyrażonym czasie trwania poziomu wysokiego w jednym okresie sygnału). Wytwarzanie sygnałów PWM przez układ licznikowy pokazano w praktyce na rysunku 1.

CLK (clock) jest sygnałem taktującym układ licznikowy. Z każdym kolejnym zboczem sygnału zegarowego wartość licznika CNT (counter) zwiększa się o 1. Gdy na skutek zliczania wartość CNT osiągnie wartość równą CCR1 (capture/compare register 1), poziom logiczny sygnału na wyjściu portu skojarzonego z kanałem pierwszym zmienia się. Zazwyczaj układ licznikowy dysponuje więcej niż jednym kanałem. Wtedy ich użycie jest możliwe w analogiczny sposób do kanału pierwszego. W przypadku trzech kanałów zdefiniowane są zatem wartości CCR2 i CCR3. Gdy CNT zrówna się najpierw z CCR2, a potem z CCR3, poziomy logiczne sygnałów na wyjściu portów skojarzonych z kanałami drugim i trzecim również zmieniają się. Wartość graniczną zliczania wyznacza ARR (auto-reload register). Osiągnięcie tej wartości przez CNT skutkuje jego wyzerowaniem. W tym momencie czasu poziomy logiczne sygnałów wszystkich trzech kanałów zmieniają się, a licznik rozpoczyna zliczanie od początku. Zatem jest tak, że wartości CCR1, CCR2 oraz CCR3 określają poziom wypełnienia sygnałów PWM odpowiednio dla kanału pierwszego, drugiego i trzeciego, natomiast wartość ARR określa częstotliwość/okres wszystkich trzech sygnałów PWM.

Układy licznikowe w STM8S001J3

Mikrokontrolery STM8S mogą być wyposażone (w zależności od modelu) w trzy różne typy układów licznikowych: zaawansowanego sterowania (TIM1), ogólnego przeznaczenia (TIM2/TIM3/TIM5) oraz podstawowe (TIM4/TIM6). Wszystkie te peryferia oparte są na tej samej architekturze (rejestry, podstawowe funkcje), natomiast różnią się wybranymi cechami i parametrami. Zestawienie porównawcze zaprezentowano w tabeli 1.

Mikrokontroler STM8S001J3 wyposażony jest w dwa układy licznikowe: TIM1 oraz TIM2. Schemat blokowy układu licznikowego TIM2 pokazano na rysunku 2. Układ ten taktowany jest (podobnie jak wszystkie zasoby mikrokontrolera) przez sygnał fMASTER, który wytwarzany jest z wewnętrznego lub zewnętrznego źródła sygnału zegarowego (HSI, LSI lub HSE). Maksymalna częstotliwość tego sygnału to 16 MHz. fMASTER doprowadzony jest do modułu układu licznikowego o nazwie TIME BASE UNIT. Istnieje możliwość zredukowania częstotliwości tego sygnału przez 4-bitowy podzielnik. Następnie impulsy sygnału taktującego są zliczane przez 16-bitowy licznik (w zależności od konfiguracji w górę lub w dół). Wartość licznika nieustannie porównywana jest z wartością ustawioną w rejestrze Auto-reload, aby w momencie gdy wielkości te są takie same nastąpiło przywrócenie licznikowi wartości początkowej. Wartość licznika używana jest przez drugi z modułów układu licznikowego – CAPTURE/COMPARE ARRAY. Składa się on głównie z podzielników i rejestrów Capture/Compare, sekcji OUTPUT STAGE odpowiedzialnej za wytwarzanie sygnałów cyfrowych na wyjściach kanałów i portów oraz sekcji INPUT STAGE odczytującej sygnały cyfrowe z wejść kanałów i portów.

tabeli 2 zamieszczono wykaz wszystkich portów mikrokontrolera STM8S001J3, które mogą zostać wykorzystane jako kanały układu licznikowego TIM2. Każdy z tych trzech kanałów może zostać skonfigurowany w wejściowy lub wyjściowy tryb pracy.

TIM2 w STM8CubeMX

Narzędziem ułatwiającym pracę z portami wejścia/wyjścia mikrokontrolera STM8S001J3 jest program komputerowy STM8CubeMX. Dzięki niemu programista może w prosty sposób (za pomocą graficznego interfejsu użytkownika) sprawdzić jakie są możliwe konfiguracje dla wszystkich portów oraz peryferiów mikrokontrolera. Tak jest również w przypadku układów licznikowych. Przykładowy scenariusz z trzema kanałami TIM2 pokazano na rysunku 3.

Funkcje SPL do sterowania układem licznikowym TIM2

Aby w prosty sposób skonfigurować i używać licznika TIM2 w układzie STM8S001J3, warto w aplikacji użyć bibliotek SPL (Standard Peripheral Library) przygotowanych dla mikrokontrolerów z rodziny STM8S. Pliki stm8s_tim2.h oraz stm8s_tim2.c udostępniają szereg funkcji do tego celu. Zestawienie najważniejszych funkcji zaprezentowano w tabeli 3.

Dodatkowo, każdy kanał TIM2 dysponuje osobnym zestawem funkcji, różniącym się tylko indeksem w nazwie funkcji. Funkcje te, na przykładzie kanału pierwszego, przedstawiono w tabeli 4.

Przykładowa aplikacja sterująca układem licznikowym TIM2

W celu stworzenia przykładowej aplikacji użyte zostało środowisko programistyczne STVD (ST Visual Develop) oraz kompilator Cosmic CXSTM8. Opis tych narzędzi, jak również instrukcja jak stworzyć za ich pomocą szablon nowego projektu wraz z dodaniem bibliotek SPL dostępne są w artykule numer 3 z tej serii (EP 2/2018). Korzystając ze wspomnianego szablonu projektu należy edytować kod pliku main.c, w którym umieszczony zostanie kod aplikacji.

Przykładowa aplikacja wykorzystuje układ licznikowy TIM2 do generowania sygnału PWM. Wybrany do tego celu został kanał trzeci dostępny na porcie mikrokontrolera PA3 (pin numer 5). Aplikacja zwiększa wypełnienie sygnału od 0 do 99% z. Zwiększanie odbywa się stopniowa – z krokiem 1%. Po osiągnięciu wypełnienia maksymalnego czynność zaczyna się od początku (nieskończona pętla). W celu zaimplementowania opisanej aplikacji wykonane zostaną następujące kroki w pliku main.c:

Utworzenie zmiennej Pulse, która użyta zostanie do przechowywania poziomu wypełnienia sygnału PWM (wartość początkowa 0).

Utworzenie funkcji opóźniającej delay().

Wywołanie funkcji opóźniającej delay(), co przeciwdziała przez kilka sekund ewentualnemu późniejszemu wyłączeniu interfejsu programowania i debugowania SWIM będącego efektem rekonfiguracji portów.

Wykonanie kodu konfiguracji portów wejścia/wyjścia, które nie są poł?czone z?wyprowadzeniami mikrokontrolera (kod wzięty z noty aplikacyjnej AN5047: Getting started with the STM8S001J3 microcontroller).

1. Wywołanie funkcji TIM2_Deinit() w celu wykonania konfiguracji domyślnej układu licznikowego TIM2.
2. Wywołanie funkcji TIM2_TimeBaseInit() w celu skonfigurowania podstawy czasu dla układu licznikowego TIM2.
3. Wywołanie funkcji TIM2_OC3Init() w celu skonfigurowania kanału trzeciego układu licznikowego TIM2 do pracy w trybie Output Compare.
4. Wywołanie funkcji TIM2_Cmd() w celu włączenia układu licznikowego TIM2.

Wewnątrz nieskończonej pętli while():

1. Wywołanie funkcji TIM2_SetCompare3 () w celu zmiany poziomu wypełnienia sygnału PWM zgodnie z wartością zmiennej Pulse.
2. Zwiększenie o 1 wartości zmiennej Pulse.
3. Sprawdzenie za pomocą instrukcji warunkowej if() czy zmienna Pulse osiągnęła wartość 99. Jeśli tak, wyzerowanie zmiennej.
4. Wywołanie funkcji opóźniającej delay() w celu wytworzenia odstępu czasu między kolejnymi zmianami poziomu wypełnienia sygnału PWM.

Kod zgodny z zaprezentowanym opisem pokazano w listingu 1. Działanie aplikacji obserwować można poprzez podłączenie diody LED do portu PA3 mikrokontrolera. Jasność świecenia diody LED odzwierciedla poziom wypełnienia sygnału PWM. Przy zerowym i niskim poziomie wypełnienia dioda LED nie emituje światła. Przy bardziej znacznym poziomie wypełnienia dioda zaczyna emitować światło. Wraz ze wzrostem poziomu wypełnienia poziom jasności diody LED również zwiększa się. Jasność maksymalna uzyskiwana jest dla maksymalnego poziomu wypełnienia sygnału PWM. Bardziej szczegółowo sygnał PWM można obserwować za pomocą oscyloskopu. Wygenerowany przez aplikację sygnał PWM z kilkoma przykładowymi poziomami wypełnień pokazano na rysunku 4.

Podsumowanie

W artykule przekazano podstawowe informacje o układzie licznikowym TIM2 mikrokontrolera STM8S001J3 wraz z opisem przykładowej aplikacji. Osoby chcące dowiedzieć się bardziej szczegółowych informacji powinny sięgnąć do dokumentacji technicznej producenta. Parametry i charakterystyka wszystkich układów licznikowych dostępne są w nocie katalogowej mikrokontrolera (datasheet). Z kolei schematy oraz opis wszystkich funkcjonalności i rejestrów znajduje się w podręczniku użytkownika mikrokontrolera (user manual RM0016). Dodatkowo szereg aplikacji testowych dostępny jest w dedykowanym podkatalogu bibliotek SPL: …STM8S_StdPeriph_LibProjectSTM8S_StdPeriph_ExamplesTIMx, gdzie x oznacza numer licznika.

Szymon Panecki
szymon.panecki@st.com

Artykuł ukazał się w
Elektronika Praktyczna
lipiec 2018
DO POBRANIA
Pobierz PDF Download icon
Materiały dodatkowe
Zobacz też
Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik styczeń 2020

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio styczeń 2020

Świat Radio

Magazyn użytkowników eteru

APA - Automatyka Podzespoły Aplikacje styczeń 2020

APA - Automatyka Podzespoły Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna styczeń 2020

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Praktyczny Kurs Elektroniki 2018

Praktyczny Kurs Elektroniki

24 pasjonujące projekty elektroniczne

Elektronika dla Wszystkich styczeń 2020

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów