- Co to jest sygnał PWM?
- PWM przy użyciu PIC16F877A:
- Programowanie PIC do generowania sygnałów PWM:
- Schemat i testowanie:
- Praca na sprzęcie:
To jest nasz 10 samouczek dotyczący nauki mikrokontrolerów PIC przy użyciu MPLAB i XC8. Do tej pory omówiliśmy wiele podstawowych samouczków, takich jak miganie diody LED za pomocą PIC, timery w PIC, interfejs LCD, interfejs 7-segmentowy, ADC za pomocą PIC itp. Jeśli jesteś absolutnym początkującym, odwiedź pełną listę samouczków PIC tutaj i zacząć naukę.
W tym samouczku dowiemy się, jak generować sygnały PWM za pomocą PIC PIC16F877A. Nasz PIC MCU ma specjalny moduł o nazwie Compare Capture module (CCP), który może być używany do generowania sygnałów PWM. Tutaj wygenerujemy PWM 5 kHz ze zmiennym cyklem pracy od 0% do 100%. Aby zmienić cykl pracy, używamy potencjometru, dlatego zaleca się zapoznanie się z samouczkiem ADC przed rozpoczęciem pracy z PWM. Moduł PWM używa również timerów do ustawiania częstotliwości, dlatego wcześniej dowiedz się, jak używać timerów. Ponadto w tym samouczku użyjemy obwodu RC i diody LED do konwersji wartości PWM na napięcie analogowe i wykorzystamy je do ściemnienia światła LED.
Co to jest sygnał PWM?
Modulacja szerokości impulsu (PWM) to sygnał cyfrowy, który jest najczęściej używany w obwodach sterujących. Ten sygnał jest ustawiony na wysoki (5 V) i niski (0 V) w określonym czasie i prędkości. 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. Jeśli sygnał jest zawsze włączony, to jest w 100% cyklu pracy, a jeśli jest zawsze wyłączony, to cykl pracy 0%.
Cykl pracy = czas włączenia / (czas włączenia + czas wyłączenia)
Częstotliwość PWM:
Częstotliwość sygnału PWM określa, jak szybko PWM kończy jeden okres. Jeden okres to całkowite WŁĄCZENIE i WYŁĄCZENIE sygnału PWM, jak pokazano na powyższym rysunku. W naszym tutorialu ustawimy częstotliwość na 5 kHz.
PWM przy użyciu PIC16F877A:
Sygnały PWM mogą być generowane w naszym mikrokontrolerze PIC za pomocą modułu CCP (Compare Capture PWM). Rozdzielczość naszego sygnału PWM wynosi 10 bitów, to znaczy dla wartości 0 będzie cykl pracy 0%, a dla wartości 1024 (2 ^ 10) 100%. W naszym PIC MCU (CCP1 i CCP2) znajdują się dwa moduły CCP, co oznacza, że możemy generować dwa sygnały PWM na dwóch różnych pinach (pin 17 i 16) jednocześnie, w naszym samouczku używamy CCP1 do generowania sygnałów PWM na pinie 17.
Następujące rejestry są używane do generowania sygnałów PWM za pomocą naszego PIC MCU:
- CCP1CON (rejestr kontrolny CCP1)
- T2CON (rejestr sterujący timera 2)
- PR2 (moduł timera 2 rejestru okresów)
- CCPR1L (CCP Register 1 Low)
Programowanie PIC do generowania sygnałów PWM:
W naszym programie odczytujemy napięcie analogowe 0-5v z potencjometru i mapujemy je na 0-1024 za pomocą naszego modułu ADC. Następnie generujemy sygnał PWM o częstotliwości 5000 Hz i zmieniamy jego cykl pracy w oparciu o wejściowe napięcie analogowe. Oznacza to, że 0-1024 zostanie przekonwertowane na cykl pracy 0% -100%. W tym samouczku założono, że nauczyłeś się już używać ADC w PIC, jeśli nie, przeczytaj to tutaj, ponieważ pominiemy szczegóły na ten temat w tym samouczku.
Tak więc, po ustawieniu bitów konfiguracyjnych i napisaniu programu do odczytu wartości analogowej, możemy przejść do PWM.
Podczas konfigurowania modułu CCP do pracy z PWM należy wykonać następujące kroki:
- Ustaw okres PWM wpisując do rejestru PR2.
- Ustaw cykl pracy PWM, zapisując do rejestru CCPR1L i bitów CCP1CON <5: 4>.
- Ustaw styk CCP1 jako wyjście, usuwając bit TRISC <2>.
- Ustaw wartość wstępnego skalowania TMR2 i włącz Timer2, pisząc do T2CON.
- Skonfiguruj moduł CCP1 do obsługi PWM.
Program ma dwie ważne funkcje do generowania sygnałów PWM. Jedną z nich jest funkcja PWM_Initialize (), która zainicjalizuje rejestry wymagane do ustawienia modułu PWM, a następnie ustawi częstotliwość, z jaką PWM powinien działać, drugą funkcją jest funkcja PWM_Duty (), która ustawi cykl pracy sygnału PWM w wymagane rejestry.
PWM_Initialize () {PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1; // Ustawienie formuł PR2 przy użyciu arkusza danych // Sprawia, że PWM działa w 5KHZ CCP1M3 = 1; CCP1M2 = 1; // Skonfiguruj moduł CCP1 T2CKPS0 = 1; T2CKPS1 = 0; TMR2ON = 1; // Skonfiguruj moduł timera TRISC2 = 0; // stwórz pin portu na C jako wyjście}
Powyższa funkcja to funkcja inicjalizacji PWM, w tej funkcji Moduł CCP1 jest ustawiony na używanie PWM, ustawiając bit CCP1M3 i CCP1M2 jako wysoki.
Preskaler modułu timera jest ustawiany przez ustawienie bitu T2CKPS0 na wysoką, a T2CKPS1 na najniższą, a bit TMR2ON jest ustawiony na uruchomienie timera.
Teraz musimy ustawić częstotliwość sygnału PWM. Wartość częstotliwości należy wpisać do rejestru PR2. Żądaną częstotliwość można ustawić za pomocą poniższych wzorów
Okres PWM = * 4 * TOSC * (Wartość przeskalowania TMR2)
Przekształcenie tych formuł w celu uzyskania PR2 da
PR2 = (Okres / (4 * Tosc * TMR2 Prescale)) - 1
Wiemy, że Period = (1 / PWM_freq) i Tosc = (1 / _XTAL_FREQ). W związku z tym…..
PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1;
Po ustawieniu częstotliwości ta funkcja nie musi być wywoływana ponownie, chyba że i dopóki nie będziemy musieli ponownie zmienić częstotliwości. W naszym poradniku przypisałem PWM_freq = 5000; abyśmy mogli uzyskać częstotliwość roboczą 5 kHz dla naszego sygnału PWM.
Teraz ustawmy cykl pracy PWM za pomocą poniższej funkcji
PWM_Duty (unsigned int duty) {if (duty <1023) {duty = ((float) duty / 1023) * (_ XTAL_FREQ / (PWM_freq * TMR2PRESCALE)); // O redukcji // duty = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE); CCP1X = cło & 1; // Zapisz pierwszy bit CCP1Y = obowiązek & 2; // Przechowaj 0-ty bit CCPR1L = duty >> 2; // Zapisz pozostałe 8 bitów}}
Nasz sygnał PWM ma rozdzielczość 10-bitową, stąd wartość ta nie może być przechowywana w jednym rejestrze, ponieważ nasz PIC ma tylko 8-bitowe linie danych. Tak więc używamy pozostałych dwóch bitów CCP1CON <5: 4> (CCP1X i CCP1Y) do przechowywania ostatnich dwóch LSB, a następnie zapisujemy pozostałe 8 bitów w rejestrze CCPR1L.
Czas cyklu pracy PWM można obliczyć przy użyciu poniższych wzorów:
Cykl pracy PWM = (CCPRIL: CCP1CON <5: 4>) * Tosc * (TMR2 Prescale Value)
Zmiana układu tych formuł w celu uzyskania wartości CCPR1L i CCP1CON da:
CCPRIL: CCP1Con <5: 4> = cykl pracy PWM / (Tosc * TMR2 Prescale Value)
Wartość naszego ADC będzie wynosić 0-1024, musimy to być w 0% -100%, stąd PWM Duty Cycle = duty / 1023. Dalej, aby przekształcić ten cykl pracy w okres czasu, musimy go pomnożyć przez okres (1 / PWM_freq)
Wiemy również, że Tosc = (1 / PWM_freq), stąd..
Duty = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE);
Rozwiązanie powyższego równania da nam:
Duty = ((float) duty / 1023) * (_XTAL_FREQ / (PWM_freq * TMR2PRESCALE));
Możesz sprawdzić cały program w sekcji Kod poniżej wraz ze szczegółowym wideo.
Schemat i testowanie:
Jak zwykle zweryfikujmy wynik za pomocą symulacji Proteus. Schemat połączeń jest przedstawiony poniżej.
Podłącz potencjometr do 7- tego kołka, aby podać napięcie 0-5. Moduł CCP1 ma pin 17 (RC2), tutaj generowane będzie PWM, które można zweryfikować za pomocą oscyloskopu cyfrowego. Ponadto, aby przekształcić to w zmienne napięcie, użyliśmy filtra RC i diody LED do weryfikacji wyjścia bez oscyloskopu.
Co to jest filtr RC?
Filtr RC lub filtr dolnoprzepustowy jest prosty układ z dwoma elementami pasywnymi mianowicie rezystora i kondensatora. Te dwa komponenty służą do filtrowania częstotliwości naszego sygnału PWM i przekształcania go w zmienne napięcie DC.
Jeśli zbadamy obwód, po przyłożeniu zmiennego napięcia na wejście R kondensator C zacznie się ładować. Opierając się teraz na wartości kondensatora, pełne naładowanie kondensatora zajmie trochę czasu, po naładowaniu zablokuje prąd stały (pamiętaj, że kondensatory blokują prąd stały, ale dopuszczają prąd zmienny), stąd napięcie wejściowe DC pojawi się na wyjściu. PWM wysokiej częstotliwości (sygnał AC) będzie uziemiony przez kondensator. W ten sposób czysty DC jest uzyskiwany na kondensatorze. Stwierdzono, że dla tego projektu odpowiednia jest wartość 1000Ohm i 1uf. Obliczanie wartości R i C obejmuje analizę obwodu za pomocą funkcji transferu, która jest poza zakresem tego samouczka.
Wyjście programu można zweryfikować za pomocą oscyloskopu cyfrowego, jak pokazano poniżej, zmieniać potencjometr, a cykl pracy PWM powinien się zmienić. Za pomocą woltomierza możemy również zauważyć napięcie wyjściowe obwodu RC. Jeśli wszystko działa zgodnie z oczekiwaniami, możemy przystąpić do naszego sprzętu. Następnie sprawdź wideo na końcu, aby zobaczyć pełny proces.
Praca na sprzęcie:
Konfiguracja sprzętu projektu jest bardzo prosta, po prostu zamierzamy ponownie użyć naszej tablicy PIC Perf pokazanej poniżej.
Będziemy również potrzebować potencjometru do podania napięcia analogowego, do mojego potencjometru dołączyłem kilka żeńskich przewodów końcowych (pokazanych poniżej), abyśmy mogli bezpośrednio podłączyć je do płytki PIC Perf.
Wreszcie, aby zweryfikować wyjście, potrzebujemy obwodu RC i diody LED, aby zobaczyć, jak działa sygnał PWM, po prostu użyłem małej płytki perf i przylutowałem obwód RC i diodę LED (do kontrolowania jasności), jak pokazano poniżej
Możemy zastosować proste przewody połączeniowe żeńskie i żeńskie i połączyć je zgodnie ze schematami pokazanymi powyżej. Po wykonaniu połączenia prześlij program do PIC za pomocą naszego pickit3 i powinieneś być w stanie uzyskać zmienne napięcie w oparciu o wejście potencjometru. Wyjście zmienne służy tutaj do sterowania jasnością diody LED.
Użyłem multimetru do pomiaru zmiennych wyjść, możemy również zauważyć, że jasność diody LED zmienia się dla różnych poziomów napięcia.
To wszystko zaprogramowaliśmy, aby odczytywać napięcie analogowe z POT i konwertować je na sygnały PWM, które z kolei zostały przekształcone w zmienne napięcie za pomocą filtra RC, a wynik jest weryfikowany za pomocą naszego sprzętu. Jeśli masz wątpliwości lub utkniesz gdzieś, skorzystaj z sekcji komentarzy poniżej, z przyjemnością Ci pomożemy. Cała praca polega na pracy w filmie.
Sprawdź również nasze inne samouczki PWM na innych mikrokontrolerach:
- Samouczek Raspberry Pi PWM
- PWM z Arduino Due
- Ściemniacz LED oparty na Arduino wykorzystujący PWM
- Ściemniacz LED mocy wykorzystujący mikrokontroler ATmega32