- Podstawy sygnału PWM
- Konfiguracja sprzętu i wymagania
- Schemat obwodu ściemniania diod LED mikrokontrolera Nuvoton N76E003
- Piny PWM na mikrokontrolerze N76E003 Nuvoton
- Rejestry PWM i funkcje w mikrokontrolerze N76E003 Nuvoton
- Tryby pracy PWM w mikrokontrolerze Nuvoton N6E003
- Programowanie Nuvoton N76E003 dla PWM
- Flashowanie kodu i testowanie wyjścia
Modulacja szerokości impulsu (PWM) jest powszechnie stosowaną techniką w mikrokontrolerach do wytwarzania ciągłego sygnału impulsowego o określonej częstotliwości i cyklu pracy. Krótko mówiąc, PWM polega na zmianie szerokości impulsu przy stałej częstotliwości.
Sygnał PWM jest najczęściej używany do sterowania serwomotorem lub jasnością diody LED. Ponadto, ponieważ mikrokontrolery mogą dostarczać tylko logikę 1 (wysoki) lub logiczny 0 (niski) na swoich pinach wyjściowych, nie mogą zapewnić zmiennego napięcia analogowego, chyba że używany jest przetwornik cyfrowo-analogowy lub przetwornik cyfrowo-analogowy. W takim przypadku mikrokontroler można zaprogramować tak, aby wyprowadzał PWM ze zmiennym cyklem pracy, który można następnie przekształcić na zmienne napięcie analogowe. Wcześniej używaliśmy urządzeń peryferyjnych PWM w wielu innych mikrokontrolerach.
- 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
- Samouczek PWM z ESP32
W tym samouczku połączymy diodę LED, która będzie sterowana za pomocą tego sygnału PWM z mikrokontrolera N76E003. Ocenimy, jakiego rodzaju konfiguracji sprzętowej potrzebujemy i jak zaprogramować nasz mikrokontroler. Wcześniej zapoznajmy się z podstawami sygnału PWM.
Podstawy sygnału PWM
Na poniższym obrazku pokazano stały sygnał PWM.
Powyższy obraz to nic innego jak stała fala prostokątna z tym samym czasem włączenia i tym samym czasem wyłączenia. Załóżmy, że całkowity okres sygnału wynosi 1 sekundę. Zatem czas włączenia i wyłączenia wynosi 500 ms. Jeśli dioda LED jest podłączona do tego sygnału, dioda LED zaświeci się na 500 ms i zgaśnie na 500 ms. Dlatego w perspektywie, dioda LED zaświeci się z połową rzeczywistej jasności, jeśli zostanie włączona do bezpośredniego sygnału 5 V bez żadnego czasu wyłączenia.
Teraz, jak pokazano na powyższym obrazku, jeśli cykl pracy zostanie zmieniony, dioda LED zaświeci się z 25% rzeczywistej jasności, stosując tę samą zasadę, co omówiono wcześniej. Jeśli chcesz dowiedzieć się więcej i dowiedzieć się o modulacji szerokości impulsu (PWM), możesz zapoznać się z połączonym artykułem.
Konfiguracja sprzętu i wymagania
Jako wymaganie tego projektu jest sterowanie diodą LED za pomocą PWM. Wymagane jest połączenie diody LED z N76E003. Ponieważ dioda LED jest dostępna w płytce rozwojowej N76E003, zostanie użyta w tym projekcie. Żadne inne komponenty nie są wymagane.
Nie wspominając o tym, że potrzebujemy płytki rozwojowej opartej na mikrokontrolerze N76E003, a także programatora Nu-Link. Dodatkowy zasilacz 5 V może być wymagany, jeśli programator nie jest używany jako źródło zasilania.
Schemat obwodu ściemniania diod LED mikrokontrolera Nuvoton N76E003
Jak widać na poniższym schemacie, testowa dioda LED jest dostępna wewnątrz płytki rozwojowej i jest podłączona do portu 1.4. Po lewej stronie pokazane jest połączenie interfejsu programowania.
Piny PWM na mikrokontrolerze N76E003 Nuvoton
N76E003 ma 20 pinów, z których 10 może służyć jako PWM. Poniższe obrazy pokazują piny PWM podświetlone w czerwonym kwadratowym polu.
Jak widać, podświetlone piny PWM mogą być również używane do innych celów. Jednak ten inny cel pinów nie będzie dostępny, gdy kołki są skonfigurowane do wyjścia PWM. Pin 1.4, który jest używany jako pin wyjściowy PWM, utraci inne funkcje. Nie stanowi to jednak problemu, ponieważ w tym projekcie nie jest wymagana inna funkcjonalność.
Powodem wyboru pinu 1.4 jako pinu wyjściowego jest to, że wbudowana testowa dioda LED jest podłączona do tego pinu na płytce rozwojowej, więc nie potrzebujemy zewnętrznych diod LED. Jednak w tym mikrokontrolerze z 20 pinów, 10 pinów może być używanych jako pin wyjściowy PWM, a dowolne inne piny PWM mogą być używane do celów wyjściowych.
Rejestry PWM i funkcje w mikrokontrolerze N76E003 Nuvoton
N76E003 wykorzystuje zegar systemowy lub przepełnienie Timera 1 podzielone przez zegar PWM z preskalerem do wyboru w zakresie 1/1 ~ 1/128. Okres PWM można ustawić za pomocą 16-bitowego rejestru okresowego PWMPH i rejestru PWMPL.
Mikrokontroler ma sześć indywidualnych rejestrów PWM, które generują sześć sygnałów PWM o nazwach PG0, PG1, PG2, PG3, PG4 i PG5. Jednak okres jest taki sam dla każdego kanału PWM, ponieważ mają one ten sam 16-bitowy licznik okresu, ale cykl roboczy każdego PWM może różnić się od innych, ponieważ każdy PWM używa innego 16-bitowego rejestru cyklu roboczego o nazwie {PWM0H, PWM0L}, {PWM1H, PWM1L}, {PWM2H, PWM2L}, {PWM3H, PWM3L}, {PWM4H, PWM4L} i {PWM5H, PWM5L}. Tak więc w N76E003 sześć wyjść PWM może być generowanych niezależnie z różnymi cyklami pracy.
W przeciwieństwie do innych mikrokontrolerów, włączenie PWM nie powoduje automatycznego ustawienia pinów I / O na ich wyjściu PWM. Dlatego użytkownik musi skonfigurować tryb wyjścia we / wy.
Tak więc, cokolwiek jest wymagane dla aplikacji, pierwszym krokiem jest określenie lub wybranie jednego, dwóch lub nawet więcej niż dwóch pinów I / O jako wyjścia PWM. Po wybraniu jednego z pinów I / O należy ustawić tryb Push-Pull lub Quasi-dwukierunkowy do generowania sygnału PWM. Można to wybrać za pomocą rejestru PxM1 i PxM2. Te dwa rejestry ustawiają tryby I / O, gdzie x oznacza numer portu (na przykład Port P1.0 rejestr będzie P1M1 i P1M2, dla P3.0 będzie to P3M1 i P3M2 itd.)
Konfigurację można zobaczyć na poniższym obrazku-
Następnie następnym krokiem jest włączenie PWM w tym konkretnym pinie (pinach) I / O. W tym celu użytkownik musi ustawić rejestry PIOCON0 lub PIOCON1. Rejestr jest zależny od mapowania pinów, ponieważ PIOCON0 i PIOCON1 sterują różnymi pinami w zależności od sygnałów PWM. Konfigurację tych dwóch rejestrów można zobaczyć na poniższym obrazku-
Jak widać, powyższy rejestr kontroluje 6 konfiguracji. W pozostałej części użyj rejestru PIOCON1.
Zatem powyższy rejestr kontroluje pozostałe 4 konfiguracje.
Tryby pracy PWM w mikrokontrolerze Nuvoton N6E003
Kolejnym krokiem jest wybór trybów pracy PWM. Każdy PWM obsługuje trzy tryby pracy - niezależny, synchroniczny i włączony tryb Dead-Time.
Tryb niezależny zapewnia rozwiązanie, w którym sześć sygnałów PWM może być generowanych niezależnie. Jest to wymagane maksymalnie w przypadkach, gdy operacje związane z diodami LED lub brzęczyk muszą być włączone i kontrolowane.
Do synchronicznego trybu ustawia PG1 / 3/5 w tej samej mocy PWM w fazie, tak samo jak PG0 / 2/4, gdzie PG0 / 2/4 zapewnia niezależne sygnały PWM. Jest to wymagane głównie do sterowania silnikami trójfazowymi.
Tryb wstawiania czas martwy jest trochę skomplikowane i stosowane w rzeczywistych zastosowaniach samochodowych, zwłaszcza w zastosowaniach przemysłowych. W takich zastosowaniach, dodatkowe wyjście PWM musi być włożone w czasie „martwym”, co zapobiega uszkodzeniu urządzeń przełączających zasilanie, takich jak GPIB. Konfiguracje są ustawione w tym trybie w taki sposób, że PG0 / 2/4 zapewnia sygnały wyjściowe PWM w taki sam sposób, jak tryb niezależny, ale PG1 / 3/5 zapewnia odpowiednio „wyjściowe sygnały PWM” wyjścia PG0 / 2/4 i zignoruj rejestr pracy PG1 / 3/5.
Powyższe trzy tryby można wybrać za pomocą poniższej konfiguracji rejestru-
Następna konfiguracja to wybór typów PWM za pomocą rejestru PWMCON1.
Jak więc widzimy, dostępne są dwa typy PWM, które można wybrać za pomocą powyższego rejestru. W przypadku wyrównania zbocza, 16-bitowy licznik używa operacji z pojedynczym zboczem, zliczając od 0000H do ustawionej wartości {PWMPH, PWMPL}, a następnie zaczynając od 0000H. Przebieg wyjściowy jest wyrównany do lewej krawędzi.
Ale w trybie wyśrodkowanym 16-bitowy licznik używa operacji z podwójnym nachyleniem, zliczając w górę od 0000H do {PWMPH, PWMPL}, a następnie ponownie przechodzi od {PWMPH, PWMPL} do 0000H przez odliczanie w dół. Wyjście jest wyśrodkowane i jest przydatne do generowania nie nakładających się przebiegów. Teraz wreszcie operacje sterowania PWM, które można sprawdzić w poniższych rejestrach-
Aby ustawić źródło zegara, użyj rejestru sterującego zegara CKCON.
Sygnał wyjściowy PWM można również maskować za pomocą rejestru PMEN. Używając tego rejestru, użytkownik może maskować sygnał wyjściowy przez 0 lub 1.
Dalej jest rejestr sterowania PWM-
Powyższy rejestr jest przydatny do uruchamiania PWM, ładowania nowego okresu i obciążenia roboczego, sterowania Flagą PWM i kasowania Licznika PWM.
Powiązane konfiguracje bitów są pokazane poniżej:
Aby ustawić dzielnik zegara, użyj rejestru PWMCON1 jako dzielnika zegara PWM. Piąty bit jest używany dla grupowego PWM z włączonym trybem grupowym i zapewnia ten sam cykl pracy dla pierwszych trzech par PWM.
Programowanie Nuvoton N76E003 dla PWM
Kodowanie jest proste, a pełny kod użyty w tym samouczku można znaleźć na dole tej strony. Dioda LED jest podłączona do pinu P1.4. Dlatego pin P1.4 jest potrzebny do wyjścia PWM.
W programie głównym ustawienia są wykonywane w odpowiedniej kolejności. Poniższe linie kodów ustawiają PWM i konfigurują pin P1.4 jako wyjście PWM.
P14_PushPull_Mode;
Służy do ustawienia styku P1.4 w trybie przeciwsobnym. Jest to zdefiniowane w bibliotece Function_define.h jako
# zdefiniować P14_PushPull_Mode P1M1 & = ~ SET_BIT4; P1M2- = SET_BIT4 PWM1_P14_OUTPUT_ENABLE;
Kolejne wiersze służą do włączania PWM w pinie P1.4. Jest to również zdefiniowane w bibliotece Function_define.h jako
#define PWM1_P14_OUTPUT_ENABLE BIT_TMP = EA; EA = 0; TA = 0xAA; TA = 0x55; SFRS- = 0x01; PIOCON1- = 0x02; TA = 0xAA; TA = 0x55; SFRS & = 0xFE; EA = BIT_TMP //P1.4 as Wyjście PWM1 włącza PWM_IMDEPENDENT_MODE;
Poniższy kod służy do ustawiania PWM w trybie niezależnym. W bibliotece Function_define.h jest zdefiniowany jako
# zdefiniować PWM_IMDEPENDENT_MODE PWMCON1 & = 0x3F PWM_EDGE_TYPE;
Następnie musimy ustawić wyjście PWM typu EDGE. W bibliotece Function_define.h jest zdefiniowany jako
# zdefiniować PWM_EDGE_TYPE PWMCON1 & = ~ SET_BIT4 set_CLRPWM;
Następnie musimy wyczyścić wartość licznika PWM, który jest dostępny w bibliotece SFR_Macro.h-
# zdefiniować set_CLRPWM CLRPWM = 1
Następnie zegar PWM jest wybierany jako zegar Fsys, a zastosowany współczynnik podziału to podział 64.
PWM_CLOCK_FSYS; PWM_CLOCK_DIV_64;
Obie są zdefiniowane jako:
# zdefiniować PWM_CLOCK_FSYS CKCON & = 0xBF # zdefiniować PWM_CLOCK_DIV_64 PWMCON1- = 0x06; PWMCON1 & = 0xFE PWM_OUTPUT_ALL_NORMAL;
Poniższy wiersz kodu służy do maskowania wyjściowego sygnału PWM przez 0 zdefiniowane jako
# zdefiniować PWM_OUTPUT_ALL_NORMAL PNP = 0x00 set_PWM_period (1023);
Następnie musimy ustawić okres czasu sygnału PWM. Ta funkcja ustawia okres w rejestrze PWMPL i PWMPH. Ponieważ jest to rejestr 16-bitowy, funkcja wykorzystuje metodę przesuwania bitów do ustawiania okresu PWM.
void set_PWM_period (wartość int bez znaku) { PWMPL = (wartość & 0x00FF); PWMPH = ((wartość & 0xFF00) >> 8); }
Jednak poza okresem 1023 i 8-bitowym użytkownicy mogą również używać innych wartości. Wydłużenie okresu powoduje płynne ściemnianie lub blaknięcie.
set_PWMRUN;
Spowoduje to uruchomienie PWM zdefiniowanego w bibliotece SFR_Macro.h jako
# zdefiniować set_PWMRUN PWMRUN = 1
Następnie, w pętli while , dioda LED świeci się i gaśnie w sposób ciągły.
while (1) { for (wartość = 0; wartość <1024; wartość + = 10) { set_PWM1 (wartość); Timer1_Delay10ms (3); } for (wartość = 1023; wartość> 0; wartość - = 10) { set_PWM1 (wartość); Timer1_Delay10ms (2); } } }
Cykl pracy jest ustawiany przez set_PWM1 ();, funkcję, która ustawia cykl pracy w rejestrze PWM1L i PWM1H.
void set_PWM1 (wartość int bez znaku) { PWM1L = (wartość & 0x00FF); PWM1H = ((wartość & 0xFF00) >> 8); set_LOAD; }
Flashowanie kodu i testowanie wyjścia
Gdy kod jest gotowy, po prostu skompiluj go i prześlij do kontrolera. Jeśli jesteś nowy w środowisku, zapoznaj się z samouczkiem Nuvoton N76E003, aby poznać podstawy. Jak widać z poniższego wyniku, kod zwrócił 0 ostrzeżeń i 0 błędów i sflashował przy użyciu domyślnej metody flashowania przez Keil. Aplikacja zaczyna działać.
Przebudowa rozpoczęta: Projekt: PWM Przebuduj cel 'Cel 1' składanie STARTUP.A51… kompilowanie main.c… kompilowanie Delay.c… łączenie… Rozmiar programu: data = 35,1 xdata = 0 kod = 709 tworzenie hex z ". \ Objects \ pwm"… ". \ Objects \ pwm" - 0 błędów, 0 ostrzeżeń. Upłynął czas budowy: 00:00:05
Sprzęt jest podłączony do źródła zasilania i działał zgodnie z oczekiwaniami. Oznacza to, że jasność wbudowanej diody LED została zmniejszona, a następnie zwiększona, aby wskazać zmianę cyklu pracy PWM.
Pełne działanie tego samouczka można również znaleźć w poniższym filmie wideo. Mam nadzieję, że spodobał Ci się samouczek i nauczyłeś się czegoś przydatnego, jeśli masz jakieś pytania, zostaw je w sekcji komentarzy lub możesz skorzystać z naszych forów, aby uzyskać inne pytania techniczne.