- PWM (modulacja szerokości impulsu)
- Piny PWM w ARM7-LPC2148
- Rejestry PWM w ARM7-LPC2148
- Wymagane składniki
- Schemat obwodu i połączenia
- Programowanie ARM7-LPC2148 dla PWM
- Kroki związane z programowaniem LPC2148 dla PWM i ADC
Jak wiemy mikrokontrolery pobierają sygnał analogowy z czujników analogowych i wykorzystują przetwornik ADC (przetwornik analogowo-cyfrowy) do przetwarzania tych sygnałów. Ale co, jeśli mikrokontroler chce wytwarzać sygnał analogowy do sterowania urządzeniami sterowanymi analogowo, takimi jak silnik serwo, silnik prądu stałego itp.? Mikrokontrolery nie wytwarzają napięcia wyjściowego takiego jak 1 V, 5 V zamiast tego używają techniki zwanej PWM do obsługi urządzeń analogowych. Przykładem PWM jest wentylator chłodzący naszego laptopa (silnik prądu stałego), który wymaga regulacji prędkości w zależności od temperatury, i to samo jest realizowane za pomocą techniki modulacji szerokości impulsu (PWM) w płytach głównych.
W tym samouczku będziemy sterować jasnością diody LED za pomocą PWM w mikrokontrolerze ARM7-LPC2148.
PWM (modulacja szerokości impulsu)
PWM to dobry sposób na sterowanie urządzeniami analogowymi za pomocą wartości cyfrowych, takich jak sterowanie prędkością silnika, jasnością diody itp. Chociaż PWM nie zapewnia czystego wyjścia analogowego, ale generuje przyzwoite analogowe impulsy do sterowania urządzeniami analogowymi. PWM faktycznie moduluje szerokość prostokątnej fali impulsu, aby uzyskać zmianę średniej wartości powstałej fali.
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)
Piny PWM w ARM7-LPC2148
Poniższy obrazek pokazuje piny wyjściowe PWM w ARM7-LPC2148. Łącznie jest sześć pinów dla PWM.
Kanał PWM |
Piny portu LPC2148 |
PWM1 |
P0.0 |
PWM2 |
P0.7 |
PWM3 |
P0.1 |
PWM4 |
P0.8 |
PWM5 |
P0.21 |
PWM6 |
P0.9 |
Rejestry PWM w ARM7-LPC2148
Przed przystąpieniem do naszego projektu musimy wiedzieć o rejestrach PWM w LPC2148.
Oto lista rejestrów używanych w LPC2148 dla PWM
1. PWMPR: Rejestr przeskalowania PWM
Zastosowanie: Jest to rejestr 32-bitowy. Zawiera liczbę cykli (minus 1), które PCLK muszą wykonać przed zwiększeniem licznika czasu PWM (w rzeczywistości przechowuje maksymalną wartość licznika przeskalowania).
2. PWMPC: licznik preskalera PWM
Zastosowanie: Jest to rejestr 32-bitowy . Zawiera rosnącą wartość licznika. Kiedy ta wartość jest równa wartości PR plus 1, licznik zegara PWM (TC) jest zwiększany.
3. PWMTCR: Rejestr sterujący zegarem PWM
Użycie: Zawiera bity sterujące Włączenie licznika, Reset licznika i Włączenie PWM. Jest to rejestr 8-bitowy.
7: 4 |
3 |
2 |
1 |
0 |
ZAREZERWOWANY |
PWM WŁĄCZ |
ZAREZERWOWANY |
ZEROWANIE LICZNIKA |
LICZNIK WŁĄCZONY |
- Włącz PWM: (Bit-3)
0- PWM wyłączone
1- PWM włączone
- Licznik włączony: (Bit-0)
0- Wyłącz liczniki
1- Włącz licznik
- Reset licznika: (Bit-1)
0 - Nic nie rób.
1- Resetuje PWMTC i PWMPC na dodatnim zboczu PCLK.
4. PWMTC: Licznik czasu PWM
Zastosowanie: Jest to rejestr 32-bitowy. Zawiera aktualną wartość zwiększającego się timera PWM. Gdy licznik preskalera (PC) osiągnie wartość rejestru preskalera (PR) plus 1, licznik ten jest zwiększany.
5. PWMIR: Rejestr przerwań PWM
Użyj: jest to rejestr 16-bitowy. Zawiera flagi przerwań dla kanałów dopasowania PWM 0-6. Flaga przerwania jest ustawiana, gdy wystąpi przerwanie dla tego kanału (przerwanie MRx), gdzie X jest numerem kanału (od 0 do 6).
6. PWMMR0-PWMMR6: Rejestr dopasowania PWM
Zastosowanie: Jest to rejestr 32-bitowy . W rzeczywistości grupa Match Channel umożliwia ustawienie 6 sterowanych pojedynczo lub 3 sterowanych obustronnie wyjść PWM. Możesz zmodyfikować siedem kanałów dopasowania, aby skonfigurować te wyjścia PWM tak, aby odpowiadały Twoim wymaganiom w PWMPCR.
7. PWMMCR: Rejestr kontroli dopasowania PWM
Zastosowanie: Jest to rejestr 32-bitowy. Zawiera bity przerwania, resetowania i zatrzymania, które kontrolują wybrany kanał dopasowania. Dopasowanie występuje między rejestrami dopasowania PWM i licznikami zegara PWM.
31:21 |
20 |
19 |
18 |
.. |
5 |
4 |
3 |
2 |
1 |
0 |
ZAREZERWOWANY |
PWMMR6S |
PWMMR6R |
PWMMR6I |
.. |
PWMMR1S |
PWMMR1R |
PWMMR11 |
PWMMR0S |
PWMMR0R |
PWMMR01 |
Tutaj x wynosi od 0 do 6
- PWMMRxI (bit-0)
WŁĄCZ LUB WYŁĄCZ Przerwania PWM
0- Wyłącz przerwania dopasowania PWM.
1- Włącz przerwanie dopasowania PWM.
- PWMMRxR: (Bit-1)
RESET PWMTC - Wartość licznika timera zawsze, gdy pasuje do PWMRx
0- Nic nie rób.
1- Resetuje PWMTC.
- PWMMRxS: (bit 2)
STOP PWMTC i PWMPC, gdy PWMTC osiągnie wartość rejestru dopasowania
0- Wyłącz funkcję zatrzymania PWM.
1- Włącz funkcję PWM Stop.
8. PWMPCR: Rejestr sterowania PWM
Zastosowanie: Jest to rejestr 16-bitowy. Zawiera bity, które włączają wyjścia PWM 0-6 i wybierają sterowanie pojedynczymi lub podwójnymi zboczami dla każdego wyjścia.
31:15 |
14: 9 |
8: 7 |
6: 2 |
1: 0 |
NIE UŻYWANY |
PWMENA6-PWMENA1 |
NIE UŻYWANY |
PWMSEL6-PWMSEL2 |
NIE UŻYWANY |
- PWMSELx (x: 2 do 6)
- Tryb pojedynczej krawędzi dla PWMx
- 1- Tryb podwójnej krawędzi dla PWMx.
- PWMENAx (x: 1 do 6)
- Wyłącz PWMx.
- 1- PWMx włączone.
9. PWMLER: Rejestr włączania zatrzasku PWM
Zastosowanie: jest to rejestr 8-bitowy. Zawiera bity Match x Latch dla każdego Match Channel.
31: 7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
NIE UŻYWANY |
LEN6 |
LEN5 |
LEN4 |
LEN3 |
LEN2 |
LEN1 |
LEN0 |
LENx (x: 0 do 6):
0 - Wyłącz ładowanie nowych wartości dopasowania
1 - Załaduj nowe wartości dopasowania z rejestru PWMMatch (PWMMRx) po zresetowaniu licznika czasu.
Teraz zacznijmy budować konfigurację sprzętową, aby zademonstrować modulację szerokości impulsu w mikrokontrolerze ARM.
Wymagane składniki
Sprzęt komputerowy
- Mikrokontroler ARM7-LPC2148
- 3.3 V Regulator napięcia IC
- Potencjometr 10 k
- LED (dowolny kolor)
- Moduł wyświetlacza LCD (16x2)
- Płytka prototypowa
- Podłączanie przewodów
Oprogramowanie
- Keil uVision5
- Flash Magic Tool
Schemat obwodu i połączenia
Połączenia między wyświetlaczem LCD a ARM7-LPC2148
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (wybór rejestru) |
P0.6 |
E (Włącz) |
P0.12 |
D4 (styk danych 4) |
P0.13 |
D5 (styk danych 5) |
P0.14 |
D6 (styk danych 6) |
P0.15 |
D7 (styk danych 7) |
GND |
VSS, R / W, K. |
+ 5V |
VDD, A |
Połączenie między diodą LED a ARM7-LPC2148
Dioda LED ANODA jest podłączona do wyjścia PWM (P0.0) LPC2148, podczas gdy pin KATODA LED jest podłączony do pinu GND LPC2148.
Połączenie między ARM7-LPC2148 a potencjometrem z regulatorem napięcia 3,3 V.
3.3 V Regulator napięcia IC |
Funkcja pinów |
ARM-7 LPC2148 Pin |
1. lewy kołek |
- Ve z GND |
Pin GND |
2. kołek środkowy |
Regulowane wyjście + 3,3 V. |
Do wejścia potencjometru i wyjścia potencjometru do P0.28 w LPC2148 |
3. prawy pin |
+ Ve od 5 V. WEJŚCIE |
+ 5V |
Punkty, na które należy zwrócić uwagę
1. Regulator napięcia 3,3 V jest tutaj używany, aby zapewnić analogową wartość wejściową do pinu ADC (P0.28) LPC2148, a ponieważ używamy zasilania 5 V, musimy regulować napięcie za pomocą regulatora napięcia 3,3 V.
2. Potencjometr służy do zmiany napięcia w zakresie od (0 V do 3,3 V), aby zapewnić wejście analogowe (ADC) do styku P0.28 złącza LPC2148.
Programowanie ARM7-LPC2148 dla PWM
Aby zaprogramować ARM7-LPC2148 potrzebujemy narzędzia keil uVision & Flash Magic. Używamy kabla USB do programowania ARM7 Stick przez port micro USB. Piszemy kod za pomocą Keila i tworzymy plik hex, a następnie plik HEX jest sflashowany do pendrive'a ARM7 przy użyciu Flash Magic. Aby dowiedzieć się więcej o instalacji keil uVision i Flash Magic oraz o tym, jak z nich korzystać, kliknij łącze Pierwsze kroki z mikrokontrolerem ARM7 LPC2148 i zaprogramuj go za pomocą Keil uVision.
W tym samouczku użyjemy techniki ADC i PWM do sterowania jasnością diody LED. Tutaj LPC2148 otrzymuje wejście analogowe (0 do 3,3 V) za pośrednictwem pinu wejściowego ADC P0.28, następnie to wejście analogowe jest konwertowane na wartość cyfrową (0 do 1023). Następnie ta wartość jest ponownie konwertowana na wartość cyfrową (0 - 255), ponieważ wyjście PWM LPC2148 ma tylko 8-bitową rozdzielczość (2 8). Dioda LED jest podłączona do pinu PWM P0.0, a jasność diody można regulować za pomocą potencjometru. Aby dowiedzieć się więcej o ADC w ARM7-LPC2148, kliknij łącze.
Kroki związane z programowaniem LPC2148 dla PWM i ADC
Krok 1: - Pierwszą rzeczą jest skonfigurowanie PLL do generowania zegara, ponieważ ustawia zegar systemowy i zegar peryferyjny LPC2148 zgodnie z potrzebami programistów. Maksymalna częstotliwość zegara dla LPC2148 to 60 MHz. Poniższe linie służą do konfiguracji generowania zegara PLL.
void initilizePLL (void) // Funkcja wykorzystująca PLL do generowania zegara { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; podczas gdy (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Krok 2: - Następną rzeczą jest wybranie pinów PWM i funkcji PWM LPC2148 za pomocą rejestru PINSEL. Używamy PINSEL0, ponieważ używamy P0.0 do wyjścia PWM LPC2148.
PINSEL0 = 0x00000002; // Ustawienie pinu P0.0 dla wyjścia PWM
Krok 3: - Następnie musimy ZRESETOWAĆ timery za pomocą PWMTCR (Rejestr Kontroli Czasu).
PWMTCR = (1 << 1); // Ustawienie rejestru sterowania timerem PWM jako reset licznika
Następnie ustaw wartość przeskalowania, która decyduje o rozdzielczości PWM. Ustawiam to na zero
PWMPR = 0X00; // Ustawianie wartości prescale PWM
Krok 4: - Następnie musimy ustawić PWMMCR (rejestr kontrolny dopasowania PWM), ponieważ ustawia działanie, takie jak reset, przerwania dla PWMMR0.
PWMMCR = (1 << 0) - (1 << 1); // Ustawianie rejestru kontroli dopasowania PWM
Krok 5: - Maksymalny okres kanału PWM jest ustawiany za pomocą PWMMR.
PWMMR0 = PWMvalue; // Podanie wartości PWM Wartość maksymalna
W naszym przypadku maksymalna wartość to 255 (dla maksymalnej jasności)
Krok 6: - Następnie musimy ustawić Latch Enable na odpowiednie rejestry dopasowania za pomocą PWMLER
PWMLER = (1 << 0); // Zatrzask Enalbe PWM
(Używamy PWMMR0) Więc włącz odpowiedni bit, ustawiając 1 w PWMLER
Krok 7: - Aby włączyć wyjście PWM do pinu, musimy użyć PWMTCR do włączenia liczników PWM Timer i trybów PWM.
PWMTCR = (1 << 0) - (1 << 3); // Włączanie PWM i licznika PWM
Krok 8: - Teraz musimy uzyskać wartości potencjometrów do ustawienia cyklu pracy PWM z pinu P0.28 ADC. Używamy więc modułu ADC w LPC2148 do konwersji potencjometrów wejścia analogowego (0 do 3,3 V) na wartości ADC (0 do 1023).
Tutaj konwertujemy wartości z 0-1023 na 0-255, dzieląc je przez 4, ponieważ PWM z LPC2148 ma rozdzielczość 8-bitową (2 8).
Krok 9: - Do wybrania pinu P0.28 ADC w LPC2148 używamy
PINSEL1 = 0x01000000; // Ustawienie P0.28 jako ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // Ustawianie zegara i PDN do konwersji A / D
Kolejne wiersze przechwytują wejście analogowe (od 0 do 3,3 V) i przekształcają je na wartość cyfrową (od 0 do 1023). A następnie te wartości cyfrowe są dzielone przez 4, aby zamienić je na (od 0 do 255) i ostatecznie podawane jako wyjście PWM na pin P0.0 LPC2148, do którego jest podłączona dioda LED.
AD0CR - = (1 << 1); // Wybierz kanał AD0.1 w czasie opóźnienia rejestru ADC (10); AD0CR - = (1 << 24); // Rozpocznij konwersję A / D while ((AD0DR1 & (1 << 31)) == 0); // Sprawdź bit DONE w rejestrze danych ADC adcvalue = (AD0DR1 >> 6) & 0x3ff; // Pobierz WYNIK z rejestru danych ADC dutycycle = adcvalue / 4; // formuła obliczająca wartości cyklu roboczego od (0 do 255) PWMMR1 = cykl pracy; // ustaw wartość cyklu roboczego na PWM rejestr dopasowania PWMLER - = (1 << 1); // Włącz wyjście PWM z wartością cyklu roboczego
Krok 10: - Następnie wyświetlamy te wartości w module wyświetlacza LCD (16X2). Więc dodajemy następujące wiersze, aby zainicjować moduł wyświetlacza LCD
Void LCD_INITILIZE (void) // Funkcja do przygotowania wyświetlacza LCD { IO0DIR = 0x0000FFF0; // Ustawia pin P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 jako opóźnienie wyjścia OUTPUT (20); LCD_SEND (0x02); // Inicjalizacja lcd w 4-bitowym trybie pracy LCD_SEND (0x28); // 2 linie ( 16X2 ) LCD_SEND (0x0C); // Wyświetl kursor wyłączony LCD_SEND (0x06); // Kursor automatycznego inkrementacji LCD_SEND (0x01); // Wyświetl wyczyść LCD_SEND (0x80); // Pierwsza pozycja w pierwszej linii }
Ponieważ połączyliśmy wyświetlacz LCD w trybie 4-bitowym z LPC2148, musimy wysłać wartości, które mają być wyświetlane jako półbajt przez półbajt (górny półbajt i dolny półbajt). Więc używane są następujące wiersze.
void LCD_DISPLAY (char * msg) // Funkcja do drukowania znaków wysyłanych jeden po drugim { uint8_t i = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Wysyła górny półbajt IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH, aby wydrukować dane IO0CLR = 0x00000020; // RW LOW Czas opóźnienia trybu zapisu (2); IO0CLR = 0x00000040; // EN = 0, RS i RW niezmienione (tj. RS = 1, RW = 0) czas opóźnienia (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Wysyła niższy półbajt IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; czas opóźnienia (2); IO0CLR = 0x00000040; czas opóźnienia (5); i ++; } }
Aby wyświetlić te wartości ADC i PWM, używamy następujących wierszy w funkcji int main () .
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", adcvalue); LCD_DISPLAY (displayadc); // Wyświetl wartość ADC (od 0 do 1023) LCD_SEND (0xC0); sprintf (wyjście led, "PWM OP =%. 2f", jasność); LCD_DISPLAY (wyjście led); // Wyświetl wartości cyklu pracy od (0 do 255)
Pełny kod i opis wideo samouczka podano poniżej.