Programowanie mikroprocesorów ( mikrokontrolerów )

PWM (Pulse Width Modulation)


1. Wstęp

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 = 3lub 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 = 1lub 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)





 
Wszelkie prawa zastrzeżone! Kopiowanie, powielanie i wykorzystywanie zdjęć, treści oraz jej fragmentów bez zgody autora zabronione.
© mikroprocesory.info.pl@gmail.com 2013.