Programowanie mikrokontrolerów
mikrokontrolery24.pl
PWM (Pulse Width Modulation)
Spis treści
Poniżej opisane zostaną możliwości generowania sygnałyu PWM przez mikrokontrolery seri AVR na przykładzie Atmega328p. Postaram się przedstawić tryby działania oraz rejestry konfiguracyjne sterujące pracą generatora sygnału PWM w mikrokontrolerze.
2. Budowa i zasada działania generatora PWM
Poniżej przedstawiona została jednostka porównująca timera 8 bitowego mikrokontrolera Atmega320p. Jednostka porównująca bierze udział między innymi w kształtowaniu sygnału PWM. Ośmiobitowy cyfrowy komparator nieustannie porównuje wartość rejestru licznika timera TCNT0 z wartością wpisaną do rejestru OCR0A i OCR0B. Za każdym razem gdy rejestr licznika timera TCNT0 osiągnie wartość rejestru OCR0A lub OCR0B komparator wykrywa że wartości te są sobie równe i ustawia flagę OCF0A lub OCF0B w kolejnym cyklu zegarowym timera. Jeśli odpowiadające fladze przerwanie jest odblokowane zostaje wygenerowane przerwanie (Output Compare interrupt). Flagi OCF0A lub OCF0B są automatycznie kasowane po zrealizowaniu się przerwania. Flagi te można również skasować programowo wpisując do nich jedynkę. Jednostka generatora PWM (Waveform Generator) wykorzystuje sygnał o równości tych rejestrów do wygenerowania sygnału wyjściowego na pinach mikrokontrolera według określonych zasad konfigurowanych bitami odpowiadającymi za tryb pracy generatora PWM (bity WGM00:2) oraz bitów konfigurujących sposób pracy pinu wyjściowego (COM0x1:0).
Konstrukcja portu wyjściowego generatora sygnału PWM przedstawiona została poniżej. Pin wyjściowy mikrokontrolera w zależności od konfiguracji posiada różne funkcje, może pełnić funkcję standardowego portu wyjściowego mikrokontrolera jak również pełnić funkcje wyjścia sygnału PWM. O funkcji decyduje ustawienie bitów COMnx0:1 które podłączają nóżkę wyjściową mikrokontrolera bądź do standardowego układu wyjściowego portu mikrokontrolera bądź do układu OCnx generatora sygnału PWM.
3. Tryby pracy generatora sygnału PWM
Tryby pracy tzn. zachowanie się układu Timera / Countera zdefiniowane jest przez kombinację ustawień bitów dwóch rejestrów sterujących pracą timera / Countera, bitów (Waveform Generation mode) WGM02:0 oraz bitów (Compare Output mode) COM0x1:0.
Bity COM0x1:0 nie mają wpływu na proces zliczania odpowiedzialne sa za konfiguracje portu wyjściowego np negację sygnału wyjściowego sygnału PWM, za kotrole sposobu pracy generatora PWM głównie odpowiedzialne są bity WGM02:0.
3.1 Praca normalna timera (Tryb 0) (Normal Mode)
Przy wyłączonym module generującym sygnał PWM (WGM02:0 = 0) licznik timera zlicza impulsy zegarowe zawsze w górę aż do przepełnienia i startuje liczenie od zera generując jednocześnie flagę przepełnienia licznika (TOV0). W przypadku odblokowanego przerwania od przepełnienia się licznika zero zostaje wygenerowane to przerwanie a flaga TOV0 zostaje automatycznie wyzerowana po wykonaniu się tego przerwania. Tryb ten to standardowy tryb timera który może służyć np. do odmierzania czasu.
3.2 Zerowanie timera przy równych rejestrach (Tryb 2 CTC Mode) (Clear Timer on Compare Match)
W trybie tym ustawienia bitów konfiguracyjnych są następujące WGM00 = 0 , WGM01 = 1, WGM02 = 0 (WGMx2:0 = 2). Sposób generowania sygnału został przedstawiony na rysunku poniżej. Jak możemy zauważyć w trybie tym uzyskujemy sygnał PWM o stałym wypełnieniu 50% oraz zmiennej częstotliwości zależnej od wartości rejestru sterującego OCRnx. Jak można zauważyć największą częstotliwość uzyskamy dla wartości OCRnx = 0X00, a najmniejszą gdy OCRnx = 0xFF. Wartość rejestru OCRnx określa nam maksymalną wartość licznika (timera) przy której następuje zmiana stanu na nóżce wyjściowej sygnału PWM mikrokontrolera. W przypadku doliczenia countera (timera) do wartości nastawionej stan na nóżce mikrokontrolera zostaje zanegowany i tak co każde przepełnienie. Należy pamiętać że sygnał PWM pojawi się na nóżce mikrokontrolera tylko w przypadku gdy pin ten skonfigurowany jest jako pin wyjściowy mikrokontrolera za pomocą rejestrów kierunku portu (DDRx).
Częstotliwość generowanego sygnału PWM dla tego przypadku określone jest wzorem poniżej. Warto zauważyć że czętotliwość generowanego sygnału jest zmienna dla tego wariantu i zależy od wartości nastawionego wypełnienia (OCRnx). Poniżej wzór na obliczenie tej częstotiwości.
gdzie :
fclk_I/O - jest to częstotliwość taktowania mikrokotnrolera
N - jest to wartość prescalera (dzielnika częstotliwości) ustawionego dla danego timera w odpowiednim rejestrze
OCRnx - wartość rejestru sterującego wypełnieniem sygnału PWM
3.3 Tryb szybkiego PWM (Fast PWM Mode)
W trybie tym bity WGM00 = 0 , WGM01 = 1, WGM02 = 1 (normalny WGMx2:0 = 3) lub WGM00 = 1 , WGM01 = 1, WGM02 = 1 (zanegowany WGMx2:0 = 7). Sposób generowania sygnału został przedstawiony na rysunku poniżej. Tryb ten zapewnia generacje sygnału PWM o wysokiej częstotliwości. Dzięki generowaniu sygnału za pomocą jednego zbocza posiada dwa razy większą czestotliwość niż PWM z korekcją fazy (dwuzboczowy). Dzieki wysokiej częstotliwości umożliwia budowę układów mocy z mniejszymi komponentami (cewki, kondensatory). Generowany sygnał jak widać na rysunku generuje sygnał o stałej częstotliwości ze zmiennym wypełnieniem.
Częstotliwość generowanego sygnału w tym trybie przedstawia poniższy wzór:
gdzie :
fclk_I/O - jest to częstotliwość taktowania mikrokotnrolera
N - jest to wartość prescalera (dzielnika częstotliwości) ustawionego dla danego timera w odpowiednim rejestrze
3.4 Tryb PWM z korekcją fazową (Phase Correct PWM Mode)
W trybie tym bity WGM00 = 0 , WGM01 = 0, WGM02 = 1 (normalny WGMx2:0 = 1) lub WGM00 = 1 , WGM01 = 0, WGM02 = 1 (zanegowany WGMx2:0 = 5). Sposób generowania sygnału został przedstawiony na rysunku poniżej. jak widać na rysunku tryb ten posiada niższą czestotliwość niż w trybie szybkiego PWM ze względu na wykorzystywanie do generacji sygnału PWM dwóch zboczy. Wykorzystuje symetrię uzyskaną dzięki podwójnemu zboczu wykorzystywaną w aplikacjach sterowania silnikami lub falownikach.
Częstotliwość generowanego sygnału w tym trybie przedstawia poniższy wzór:
gdzie :
fclk_I/O - jest to częstotliwość taktowania mikrokotnrolera
N - jest to wartość prescalera (dzielnika częstotliwości) ustawionego dla danego timera w odpowiednim rejestrze
4. Podstawowe rejestry konfiguracyjne
Podstawowymi rejestrami sterującymi pracą generatora sygnału PWM są rejestry TCCR0A, TCCR0B oraz TIMSK0. Budowa i opis poszczgólnych bitów przedstawiony został poniżej.
Budowa rejestru TCCR0A
Budowa rejestru TCCR0B
Bity CS00:02 - odpowiedzialny za timer opisany w dziale o timerze (Mikroprocesory -> 8BIT TIMER/COUNTER)
Bity COM0B0:1 - w zalależności od wybranego trybu generacji sygnału PWM bity te pełnią następujące funkcje
Dla trybu pracy 0 normalnej timera (porównywanie z rejestrem OC0B)
COM0B1 | COM0B0 | Opis |
0 | 0 | Normalna praca portu. Sygnał PWM odcięty. |
0 | 1 | Przełącz OC0B przy zrównaniu się rejestrów |
1 | 0 | Wyzeruj OC0B przy zrównaniu się rejestrów |
1 | 1 | Ustaw OC0B przy zrównaniu się rejestrów |
Dla trybu pracy 3 i 7 (Szybki tryb PWM)
COM0B1 | COM0B0 | Opis |
0 | 0 | Normalna praca portu. Sygnał PWM odcięty. |
0 | 1 |
WGM02 = 0: Normalna praca portu. Sygnał PWM odcięty.
WGM02 = 1: Przełacz OC0B przy równych rejestrach |
1 | 0 | Wyzeruj OC0B przy zrównaniu rejestrów, ustaw przy dole (tryb nie odwracający) |
1 | 1 | Ustaw OC0B przy zrównaniu rejestrów, wyzeruj przy dole (tryb odwracający) |
Dla trybu pracy 1 i 5 (PWM z korekcją fazy)
COM0B1 | COM0B0 | Opis |
0 | 0 | Normalna praca portu. Sygnał PWM odcięty. |
0 | 1 | WGM02 = 0: Normalna praca portu. Sygnał PWM odcięty. WGM02 = 1: Przełacz OC0B przy zrównaniu rejestrów |
1 | 0 | Wyzeruj OC0B przy zrównaniu rejestrów gdy liczy w górę. Ustaw OC0B przy zrównaniu rejestrów gdy liczy w dół. |
1 | 1 | Ustaw OC0B przy zrównaniu rejestrów gdy liczy w górę. Wyzeruj OC0B przy zrównaniu rejestrów gdy liczy w dół. |
Bit COM0A0:1 - w zalależności od wybranego trybu generacji sygnału PWM bity te pełnią następujące funkcje
Dla trybu pracy 0 normalnej timera (porównywanie z rejestrem OC0B)
COM0A1 | COM0A0 | Opis |
0 | 0 | Normalna praca portu. Sygnał PWM odcięty. |
0 | 1 | Przełącz OC0A przy zrównaniu się rejestrów |
1 | 0 | Wyzeruj OC0A przy zrównaniu się rejestrów |
1 | 1 | Ustaw OC0A przy zrównaniu się rejestrów |
Dla trybu pracy 3 i 7 (Szybki tryb PWM)
COM0A1 | COM0A0 | Opis |
0 | 0 | Normalna praca portu. Sygnał PWM odcięty. |
0 | 1 | WGM02 = 0: Normalna praca portu. Sygnał PWM odcięty. WGM02 = 1: Przełacz OC0A przy równych rejestrach |
1 | 0 | Wyzeruj OC0A przy zrównaniu rejestrów, ustaw przy dole (tryb nie odwracający) |
1 | 1 | Ustaw OC0A przy zrównaniu rejestrów, wyzeruj przy dole (tryb odwracający) |
Dla trybu pracy 1 i 5 (PWM z korekcją fazy)
COM0A1 | COM0A0 | Opis |
0 | 0 | Normalna praca portu. Sygnał PWM odcięty. |
0 | 1 | WGM02 = 0: Normalna praca portu. Sygnał PWM odcięty. WGM02 = 1: Przełacz OC0A przy zrównaniu rejestrów |
1 | 0 | Wyzeruj OC0A przy zrównaniu rejestrów gdy liczy w górę. Ustaw OC0A przy zrównaniu rejestrów gdy liczy w dół. |
1 | 1 | Ustaw OC0A przy zrównaniu rejestrów gdy liczy w górę. Wyzeruj OC0A przy zrównaniu rejestrów gdy liczy w dół. |
WGM00:02 - bity odpowiedzialne za wybór trybu pracy generatora sygnału PWM. W zależności od ustawienia tych bitów generowany sygnał PWM będzie w następujący sposób:
Tryb | WGM2 | WGM1 | WGM0 | Nazwa trybu | Top | Aktualizacja OCRx | Flaga przerwania |
0 | 0 | 0 | 0 | Normalny | 0xFF | Natychmiast | Max |
1 | 0 | 0 | 1 | PWM, korekcja fazy | 0xFF | Top | Bottom |
2 | 0 | 1 | 0 | Zerowanie przy równych rejestrach | OCRA | Natychmiast | Max |
3 | 0 | 1 | 1 | Szybki PWM | 0xFF | Bottom | Max |
4 | 1 | 0 | 0 | Zarezerwowane | - | - | - |
5 | 1 | 0 | 1 | PWM, korekcja fazy | OCRA | Top | Bottom |
6 | 1 | 1 | 0 | Zarezerwowane | - | - | - |
7 | 1 | 1 | 1 | Szybki PWM | OCRA | Bottom | Top |
Bit FOC0A - bit ten jest tylko aktywny kiedy bity WGM ustawione są w trybie normalnym (nie PWM). Dla zapewnienia pełnej kompatybilności bit ten musi być ustawiony na zero w przypadku gdy timer pracuje jako generatro sygnału PWM. Bit ten gdy jest ustawiony na 1 wymusza tryb porównywania rejestrów nadpisując generowanie sygnału PWM. Bit ten przy odczytywaniu zawsze odczytywany jest jako zero.
Bit FOC0B - bit ten jest tylko aktywny kiedy bity WGM ustawione są w trybie normalnym (nie PWM). Dla zapewnienia pełnej kompatybilności bit ten musi być ustawiony na zero w przypadku gdy timer pracuje jako generatro sygnału PWM. Bit ten gdy jest ustawiony na 1 wymusza tryb porównywania rejestrów nadpisując generowanie sygnału PWM. Bit ten przy odczytywaniu zawsze odczytywany jest jako zero.
Budowa rejestru TIMSK0
Bit TOIE0 - odpowiedzialny za timer opisany w dziale o timerze (Mikroprocesory -> 8BIT TIMER/COUNTER)
Bit OCIE0A - jesli ten bit jest ustawiony na "1" i bit 7 Global Interrupt Enable (Ogólne zezwolenie na przerwanie) w SREG (Status Register) jest ustawiony na "1" wówczas przerwanie od Compare Match A jest aktywne. (Compare Match to zdarzenie gdy rejestr Timera / Countera zrówna się z wartością w rejestrze porównawczym OCR0A - Output Compare Register A)
Bit OCIE0B - jesli ten bit jest ustawiony na "1" i bit 7 Global Interrupt Enable (Ogólne zezwolenie na przerwanie) w SREG (Status Register) jest ustawiony na "1" wówczas przerwanie od Compare Match B jest aktywne. (Compare Match to zdarzenie gdy rejestr Timera / Countera zrówna się z wartością w rejestrze porównawczym OCR0B - Output Compare Register B)
Budowa rejestru TIFR0
Bit TOV0 - odpowiedzialny za timer opisany w dziale o timerze (Mikroprocesory -> 8BIT TIMER/COUNTER)
Bit OCF0B - jest to flaga przerwania ustawiana kiedy wartość rejestru Timera / Countera przekroczy wartość rejestru OCR0B. Przerwania zostane ewygenerowane kiedy bit OCF0B zostanie ustawiony na "1" oraz kolejno bit I w SREG będzie ustawiony na "1", OCIE0B będzie ustawiony na "1".
Bit OCF0A - jest to flaga przerwania ustawiana kiedy wartość rejestru Timera / Countera przekroczy wartość rejestru OCR0A. Przerwania zostane ewygenerowane kiedy bit OCF0A zostanie ustawiony na "1" oraz kolejno bit I w SREG będzie ustawiony na "1", OCIE0A będzie ustawiony na "1".
5. Tematy Powiązane (Uruchomienie PWM)
28.03.2020
09-lip-2024 19:45:49 CEST
© mikroprocesory.info.pl@gmail.com 2013.