- Piny PWM w mikrokontrolerze AVR Atmega16
- Co to jest sygnał PWM?
- Wymagane składniki
- Schemat obwodu
- Programowanie Atmega16 dla PWM
Modulacja szerokości impulsu (PWM) to potężna technika, w której szerokość impulsu zmienia się, utrzymując stałą częstotliwość. Technika ta jest obecnie stosowana w wielu systemach sterowania. Zastosowanie PWM nie jest ograniczone i jest wykorzystywane w szerokim zakresie zastosowań, takich jak sterowanie prędkością silnika, pomiary, sterowanie mocą, komunikacja itp. W technice PWM można łatwo wygenerować analogowy sygnał wyjściowy za pomocą sygnałów cyfrowych. Ten samouczek pomoże ci zrozumieć PWM, jego terminologię i jak możemy go zaimplementować za pomocą mikrokontrolera. W tym samouczku zademonstrujemy PWM z mikrokontrolerem AVR Atmega16 poprzez zmianę intensywności diody LED.
Aby szczegółowo zrozumieć podstawy PWM, przejdź do naszych poprzednich samouczków na temat PWM z różnymi mikrokontrolerami:
- ARM7-LPC2148 Samouczek PWM: Sterowanie jasnością diody LED
- Modulacja szerokości impulsu (PWM) przy użyciu MSP430G2: kontrolowanie jasności diody LED
- Generowanie PWM za pomocą mikrokontrolera PIC z MPLAB i XC8
- Modulacja szerokości impulsu (PWM) w STM32F103C8: Sterowanie prędkością wentylatora DC
- Generowanie sygnałów PWM na pinach GPIO Mikrokontrolera PIC
- Samouczek Raspberry Pi PWM
Piny PWM w mikrokontrolerze AVR Atmega16
Atmega16 ma cztery dedykowane piny PWM. Te piny to PB3 (OC0), PD4 (OC1B), PD5 (OC1A), PD7 (OC2).
Ponadto ATMega16 dwa liczniki 8-bitowe oraz jeden 16-bitowy licznik. Timer0 i Timer2 to 8-bitowe timery, podczas gdy Timer1 to 16-bitowe timery. Aby wygenerować PWM, musimy mieć przegląd timerów, ponieważ timery są używane do generowania PWM. Jak wiemy, częstotliwość to liczba cykli na sekundę, z jaką działa zegar. Zatem wyższa częstotliwość da nam szybszy zegar. Podczas generowania PWM szybsza częstotliwość PWM zapewni lepszą kontrolę nad wyjściem, ponieważ może szybciej reagować na nowe cykle pracy PWM.
W tym samouczku Atmega16 PWM użyjemy Timer2. Możesz wybrać dowolny cykl pracy. Jeśli nie wiesz, co to jest cykl pracy w PWM, omówmy krótko.
Co to jest sygnał PWM?
Modulacja szerokości impulsu (PWM) to sygnał cyfrowy, który jest najczęściej używany w obwodach sterujących. Czas, w którym sygnał pozostaje wysoki, nazywany jest „czasem włączenia”, a czas, w którym sygnał pozostaje niski, nazywany jest „czasem wyłączenia”. Istnieją dwa ważne parametry PWM, jak omówiono poniżej:
Cykl pracy PWM
Procent czasu, w którym sygnał PWM pozostaje WYSOKI (w czasie) jest nazywany cyklem pracy.
Podobnie jak w przypadku impulsu 100 ms, jeśli sygnał jest WYSOKI przez 50 ms i NISKI przez 50 ms, oznacza to, że impuls był w połowie WYSOKI, a w połowie NISKI. Można więc powiedzieć, że cykl pracy wynosi 50%. Podobnie, jeśli impuls jest w stanie WYSOKIM 25 ms i 75 ms w stanie NISKIM po 100 ms, wówczas cykl pracy wyniesie 25%. Zauważ, że obliczamy tylko czas trwania stanu WYSOKI. Możesz zapoznać się z poniższym obrazkiem w celu zrozumienia wizualnego. Wzór na cykl pracy jest zatem następujący:
Cykl pracy (%) = Czas włączenia / (Czas włączenia + Czas wyłączenia)
Tak więc, zmieniając cykl pracy, możemy zmienić szerokość PWM, co powoduje zmianę jasności diody LED. Będziemy mieć pokaz użycia różnych cykli pracy w kontrolowaniu jasności diody LED. Sprawdź film demonstracyjny na końcu tego samouczka.
Po wybraniu cyklu pracy kolejnym krokiem byłoby wybranie trybu PWM. Tryb PWM określa, jak chcesz, aby PWM działało. Istnieją głównie 3 rodzaje trybów PWM. Są to następujące:
- Szybki PWM
- Faza poprawna PWM
- PWM z poprawną fazą i częstotliwością
Szybki PWM jest używany tam, gdzie zmiana fazy nie ma znaczenia. Używając Fast PWM, możemy szybko wyprowadzać wartości PWM. Szybkiego PWM nie można używać tam, gdzie zmiana fazy wpływa na działanie, takie jak sterowanie silnikiem, dlatego w takich zastosowaniach używane są inne tryby PWM. Ponieważ będziemy kontrolować Jasność diody LED, gdzie zmiana fazy nie wpłynie zbytnio, użyjemy trybu Fast PWM.
Teraz, aby wygenerować PWM, będziemy sterować wewnętrznym zegarem, aby zliczał, a następnie ustawiamy z powrotem na zero przy określonej liczbie, więc licznik będzie odliczał, a następnie ustawia się z powrotem do zera w kółko. To ustawia okres. Mamy teraz możliwość kontrolowania impulsu, włączania impulsu o określonej liczbie w liczniku czasu, gdy rośnie. Gdy licznik wróci do 0, wyłącz puls. Jest to duża elastyczność, ponieważ zawsze możesz uzyskać dostęp do licznika timera i zapewnić różne impulsy za pomocą jednego timera. Jest to świetne rozwiązanie, gdy chcesz sterować wieloma diodami LED jednocześnie. Teraz zacznijmy łączyć jedną diodę LED z Atmega16 dla PWM.
Sprawdź wszystkie projekty związane z PWM tutaj.
Wymagane składniki
- Układ scalony mikrokontrolera AVR Atmega16
- Oscylator kwarcowy 16 MHz
- Dwa kondensatory 100nF
- Dwa kondensatory 22pF
- Naciśnij przycisk
- Przewody połączeniowe
- Płytka prototypowa
- USBASP v2.0
- 2 diody LED (dowolny kolor)
Schemat obwodu
Używamy OC2 dla PWM, czyli Pin21 (PD7). Więc podłącz jedną diodę LED do pinu PD7 Atmega16.
Programowanie Atmega16 dla PWM
Kompletny program znajduje się poniżej. Nagraj program w Atmega16 za pomocą JTAG i Atmel studio i zobacz efekt PWM na LED. Jego jasność będzie rosnąć i maleć powoli z powodu zmieniającego się cyklu pracy PWM. Sprawdź wideo podane na końcu.
Rozpocznij programowanie Atmega16 od ustawienia rejestru Timer2. Bity rejestru Timer2 są następujące i możemy odpowiednio ustawić lub zresetować bity.
Teraz omówimy wszystkie bity Timera2, abyśmy mogli uzyskać pożądane PWM za pomocą napisanego programu.
Rejestr Timer2 składa się głównie z czterech części:
FOC2 (Force Output Compare for Timer2): Bit FOC2 jest ustawiany, gdy bity WGM określają tryb inny niż PWM.
WGM2 (tryb generowania fali dla timera 2): Te bity sterują sekwencją zliczania licznika, źródłem maksymalnej (TOP) wartości licznika oraz typem generowania przebiegu, który ma być używany.
COM2 (Porównaj tryb wyjścia dla timera2): Te bity sterują zachowaniem wyjścia. Pełny opis bitów jest wyjaśniony poniżej.
TCCR2 - = (1 <
Ustaw bity WGM20 i WGM21 jako WYSOKIE, aby aktywować tryb szybki PWM. WGM oznacza tryb generowania przebiegów. Bity wyboru są jak poniżej.
WGM00 |
WGM01 |
Praca w trybie Timer2 |
0 |
0 |
Tryb normalny |
0 |
1 |
CTC (Clear Timer On Compare Match) |
1 |
0 |
PWM, poprawna faza |
1 |
1 |
Szybki tryb PWM |
Więcej informacji na temat trybu generowania przebiegów można znaleźć w oficjalnym arkuszu danych Atmega16.
TCCR2 - = (1 <
Nie używaliśmy też żadnego skalowania wstępnego, więc ustawiliśmy rejestr źródła zegara na „001”.
Bity wyboru zegara są następujące:
CS22 |
CS21 |
CS20 |
Opis |
0 |
0 |
0 |
Brak źródła zegara (Timer / licznik zatrzymany) |
0 |
0 |
1 |
clk T2S / (bez wstępnego skalowania) |
0 |
1 |
0 |
Clk T2S / 8 (z preskalera) |
0 |
1 |
1 |
Clk T2S / 32 (z preskalera) |
1 |
0 |
0 |
Clk T2S / 64 (z preskalera) |
1 |
0 |
1 |
Clk T2S / 128 (z preskalera) |
1 |
1 |
0 |
Clk T2S / 256 (z preskalera) |
1 |
1 |
1 |
Clk T2S / 1024 (z preskalera) |
Również OC2 jest czyszczone przy dopasowaniu porównania, ustawiając bit COM21 na „1”, a COM20 na „0”.
Poniżej podano opcje wyboru trybu porównania wyjścia (COM) dla trybu Fast PWM:
COM21 |
COM21 |
Opis |
0 |
0 |
Normalna praca portu, odłączony OC2. |
0 |
1 |
Zarezerwowany |
1 |
0 |
Wyczyść OC2 w porównaniu do meczu, ustaw OC2 na TOP |
1 |
1 |
Ustaw OC2 dla porównania, wyczyść OC2 na TOP |
Zwiększ cykl pracy od 0% do 100%, aby jasność rosła w czasie. Weź wartość z zakresu 0-255 i wyślij na pin OCR2.
for (duty = 0; duty <255; duty ++) // od 0 do maksymalnego cyklu pracy { OCR2 = duty; // powoli zwiększaj jasność diody LED _delay_ms (10); }
Podobnie zmniejsz cykl pracy ze 100% do 0%, aby stopniowo zmniejszać jasność diody LED.
for (duty = 0; duty> 255; duty--) // max to 0 duty cycle { OCR2 = duty; // powoli zmniejszaj jasność diody LED _delay_ms (10); }
To kończy nasz samouczek dotyczący korzystania z PWM w Atmega16 / 32.