- PWM (Pulse Width Modulation)
- PWM piny v ARM7-LPC2148
- Registry PWM v ARM7-LPC2148
- Požadované komponenty
- Schéma zapojení a zapojení
- Programování ARM7-LPC2148 pro PWM
- Kroky zapojené do programování LPC2148 pro PWM a ADC
Jak víme, mikrokontroléry přijímají analogový vstup z analogových senzorů a ke zpracování těchto signálů používají ADC (analogově-digitální převodník). Ale co když chce mikrokontrolér produkovat analogový signál pro ovládání analogově ovládaných zařízení, jako je servomotor, stejnosměrný motor atd.? Mikrokontroléry neprodukují výstupní napětí jako 1V, 5V, místo toho používají pro provoz analogových zařízení techniku zvanou PWM. Příkladem PWM je chladicí ventilátor (stejnosměrný motor) našeho notebooku, který musí být řízen rychlostí podle teploty, a to samé je implementováno pomocí techniky PWM (Pulse Width Modulation) na základních deskách.
V tomto tutoriálu budeme řídit jas LED pomocí PWM v mikrokontroléru ARM7-LPC2148.
PWM (Pulse Width Modulation)
PWM je dobrý způsob, jak ovládat analogová zařízení pomocí digitálních hodnot, jako je ovládání rychlosti motoru, jasu LED atd. Ačkoli PWM neposkytuje čistý analogový výstup, ale generuje slušné analogové impulsy pro ovládání analogových zařízení. PWM ve skutečnosti moduluje šířku obdélníkové pulzní vlny, aby získala odchylku průměrné hodnoty výsledné vlny.
Pracovní cyklus PWM
Procento času, ve kterém signál PWM zůstává VYSOKÝ (v čase), se nazývá pracovní cyklus. Pokud je signál vždy zapnutý, je ve 100% pracovním cyklu a pokud je vždy vypnutý, je to 0% pracovní cyklus.
Pracovní cyklus = čas zapnutí / (čas zapnutí + čas vypnutí)
PWM piny v ARM7-LPC2148
Obrázek níže ukazuje výstupní piny PWM ARM7-LPC2148. Pro PWM je celkem šest pinů.
Kanál PWM |
Piny portů LPC2148 |
PWM1 |
P0.0 |
PWM2 |
P0.7 |
PWM3 |
P0.1 |
PWM4 |
P0.8 |
PWM5 |
P0.21 |
PWM6 |
P0.9 |
Registry PWM v ARM7-LPC2148
Než se dostaneme do našeho projektu, musíme vědět o registrech PWM v LPC2148.
Zde je seznam registrů používaných v LPC2148 pro PWM
1. PWMPR: PWM Prescale Register
Použití: Je to 32bitový registr. Obsahuje počet, kolikrát (mínus 1) musí PCLK cyklovat před zvýšením počitadla časovače PWM (ve skutečnosti drží maximální hodnotu počitadla předvolby).
2. PWMPC: PWM Prescaler Counter
Použití: Je to 32bitový registr . Obsahuje hodnotu přírůstkového čítače. Když se tato hodnota rovná hodnotě PR plus 1, zvýší se čítač časovače PWM (TC).
3. PWMTCR: PWM Timer Control Register
Použití: Obsahuje řídicí bity Counter Enable, Counter Reset a PWM Enable. Jedná se o 8bitový registr.
7: 4 |
3 |
2 |
1 |
0 |
REZERVOVÁNO |
PWM POVOLIT |
REZERVOVÁNO |
RESET POČÍTAČE |
POČÍTAČ POVOLEN |
- PWM Enable: (Bit-3)
0- PWM deaktivováno
1- PWM povoleno
- Counter Enable: (Bit-0)
0- Zakázat čítače
1- Povolit čítače
- Reset čítače: (Bit-1)
0- Nedělat nic.
1- Resetuje PWMTC a PWMPC na kladné hraně PCLK.
4. PWMTC: PWM Timer Counter
Použití: Je to 32bitový registr. Obsahuje aktuální hodnotu přírůstkového časovače PWM. Když čítač Prescaler (PC) dosáhne hodnoty registru Prescaler (PR) plus 1, tento čítač se zvýší.
5. PWMIR: PWM Interrupt Register
Použití: Je to 16bitový registr. Obsahuje příznaky přerušení pro PWM Match Channels 0-6. Příznak přerušení je nastaven, když dojde k přerušení pro daný kanál (MRx Interrupt), kde X je číslo kanálu (0 až 6).
6. PWMMR0-PWMMR6: Registr shody PWM
Použití: Je to 32bitový registr . Ve skutečnosti skupina Match Channel umožňuje nastavení 6 výstupů PWM řízených jednou hranou nebo 3 výstupů řízených dvěma hranami. Sedm shodných kanálů můžete upravit a nakonfigurovat tyto výstupy PWM tak, aby vyhovovaly vašim požadavkům v PWMPCR.
7. PWMMCR: PWM Match Control Register
Použití: Je to 32bitový registr. Obsahuje bity Interrupt, Reset a Stop, které řídí vybraný Match Channel. Dochází ke shodě mezi registry shody PWM a čítači časovače PWM.
31:21 |
20 |
19 |
18 |
.. |
5 |
4 |
3 |
2 |
1 |
0 |
REZERVOVÁNO |
PWMMR6S |
PWMMR6R |
PWMMR6I |
.. |
PWMMR1S |
PWMMR1R |
PWMMR11 |
PWMMR0S |
PWMMR0R |
PWMMR01 |
Zde x je od 0 do 6
- PWMMRxI (bit-0)
POVOLIT NEBO ZAKÁZAT přerušení PWM
0- Zakázat PWM Match přerušení.
1 - Povolit přerušení zápasu PWM.
- PWMMRxR: (bit-1)
RESET PWMTC - hodnota čítače časovače, kdykoli se shoduje s PWMRx
0- Nedělejte nic.
1- Resetuje PWMTC.
- PWMMRxS: (bit 2)
ZASTAVTE PWMTC & PWMPC, když PWMTC dosáhne hodnoty registru shody
0- Zakažte funkci zastavení PWM.
1- Povolte funkci PWM Stop.
8. PWMPCR: PWM Control Register
Použití: Je to 16bitový registr. Obsahuje bity, které umožňují PWM výstupy 0-6 a pro každý výstup volí ovládání s jednou nebo dvěma hranami.
31:15 |
14: 9 |
8: 7 |
6: 2 |
1: 0 |
NEPOUŽITÝ |
PWMENA6-PWMENA1 |
NEPOUŽITÝ |
PWMSEL6-PWMSEL2 |
NEPOUŽITÝ |
- PWMSELx (x: 2 až 6)
- Režim Single Edge pro PWMx
- 1 - Režim dvojité hrany pro PWMx.
- PWMENAx (x: 1 až 6)
- PWMx Zakázat.
- 1- PWMx povoleno.
9. PWMLER: PWM Latch Enable Register
Použití: Je to 8bitový registr. Obsahuje bity Match x Latch pro každý Match Channel.
31: 7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
NEPOUŽITÝ |
LEN6 |
LEN5 |
LEN4 |
LEN3 |
LEN2 |
LEN1 |
LEN0 |
LENx (x: 0 až 6):
0- Zakázat načítání nových hodnot shody
1- Načíst nové hodnoty shody z (PWMMRx) PWMMatch Registru, když se vynuluje časovač.
Nyní pojďme začít stavět nastavení hardwaru, abychom předvedli modulaci šířky pulzu v mikrokontroléru ARM.
Požadované komponenty
Hardware
- Mikrokontrolér ARM7-LPC2148
- IC regulátoru napětí 3,3 V
- 10k potenciometr
- LED (libovolná barva)
- Modul LCD (16x2)
- Nepájivá deska
- Připojení vodičů
Software
- Keil uVision5
- Flash Magic Tool
Schéma zapojení a zapojení
Propojení mezi LCD a ARM7-LPC2148
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Register Select) |
P0.6 |
E (Povolit) |
P0.12 |
D4 (datový kolík 4) |
P0.13 |
D5 (datový kolík 5) |
P0.14 |
D6 (datový kolík 6) |
P0.15 |
D7 (datový kolík 7) |
GND |
VSS, R / W, K |
+ 5V |
VDD, A |
Spojení mezi LED a ARM7-LPC2148
LED ANODE je připojen k výstupu PWM (P0.0) LPC2148, zatímco pin CATHODE LED je připojen k GND kolíku LPC2148.
Spojení mezi ARM7-LPC2148 a potenciometrem s regulátorem napětí 3,3V
IC regulátoru napětí 3,3 V |
Pin funkce |
ARM-7 LPC2148 Pin |
1. Levý kolík |
- Ve z GND |
GND kolík |
2. Středový kolík |
Regulovaný výstup +3,3 V. |
Na potenciometr Vstup a výstup potenciometru na P0,28 LPC2148 |
3. Pravý kolík |
+ Ve od 5V VSTUP |
+ 5V |
Body, které je třeba poznamenat
1. Regulátor napětí 3,3 V se zde používá k poskytování analogové vstupní hodnoty na kolík ADC (P0,28) LPC2148 a protože používáme napájení 5V, musíme regulovat napětí regulátorem napětí 3,3V.
2. Potenciometr se používá pro změnu napětí mezi (0 V až 3,3 V), aby se zajistil analogový vstup (ADC) na LPC2148 pin P0.28
Programování ARM7-LPC2148 pro PWM
K programování ARM7-LPC2148 potřebujeme nástroj Keil uVision & Flash Magic. Používáme USB kabel k programování ARM7 Stick přes micro USB port. Napíšeme kód pomocí Keila a vytvoříme hexadecimální soubor a poté se soubor HEX přenese na flash disk ARM7 pomocí Flash Magic. Chcete-li se dozvědět více o instalaci keil uVision a Flash Magic a o tom, jak je používat, přejděte na odkaz Začínáme s mikrokontrolérem ARM7 LPC2148 a naprogramujte jej pomocí Keil uVision.
V tomto tutoriálu použijeme k řízení jasu LED techniku ADC a PWM. Zde je LPC2148 dán analogový vstup (0 až 3,3 V) přes vstupní pin ADC P0,28, poté je tento analogový vstup převeden na digitální hodnotu (0 až 1023). Poté je tato hodnota znovu převedena na digitální hodnotu (0-255), protože výstup PWM LPC2148 má pouze 8bitové rozlišení (2 8). LED je připojena k PWM pinu P0.0 a jas LED lze ovládat pomocí potenciometru. Chcete-li se dozvědět více o ADC v ARM7-LPC2148, klikněte na odkaz.
Kroky zapojené do programování LPC2148 pro PWM a ADC
Krok 1: - Úplně první věcí je konfigurace PLL pro generování hodin, protože nastavuje systémové hodiny a periferní hodiny LPC2148 podle potřeby programátorů. Maximální taktovací frekvence pro LPC2148 je 60Mhz. Následující řádky se používají ke konfiguraci generování hodin PLL.
void initilizePLL (void) // Funkce pro použití PLL pro generování hodin { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; while (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Krok 2: - Další věcí je výběr pinů PWM a funkce PWM LPC2148 pomocí registru PINSEL. Používáme PINSEL0, protože používáme P0.0 pro PWM výstup LPC2148.
PINSEL0 = 0x00000002; // Nastavení pinu P0.0 pro výstup PWM
Krok 3: - Dále musíme RESETOVAT časovače pomocí PWMTCR (Timer Control Register).
PWMTCR = (1 << 1); // Nastavení řízení časovače PWM Zaregistrujte se jako reset čítače
A pak nastavte přednastavenou hodnotu, která rozhoduje o rozlišení PWM. Nastavuji to na nulu
PWMPR = 0X00; // Nastavení hodnoty předvolby PWM
Krok 4: - Dále musíme nastavit PWMMCR (PWM match control register), protože nastavuje operace jako reset, přerušení pro PWMMR0.
PWMMCR = (1 << 0) - (1 << 1); // Nastavení PWM Match Control Register
Krok 5: - Maximální doba kanálu PWM se nastavuje pomocí PWMMR.
PWMMR0 = PWMvalue; // Uvedení hodnoty PWM Maximální hodnota
V našem případě je maximální hodnota 255 (pro maximální jas)
Krok 6: - Dále musíme pomocí PWMLER nastavit Latch Enable na odpovídající registry shody
PWMLER = (1 << 0); // Západka Enalbe PWM
(Používáme PWMMR0) Povolte tedy odpovídající bit nastavením 1 v PWMLER
Krok 7: - Chcete - li povolit výstup PWM na pin, musíme použít PWMTCR pro povolení čítačů časovače PWM a režimů PWM.
PWMTCR = (1 << 0) - (1 << 3); // Povolení čítače PWM a PWM
Krok 8: - Nyní musíme získat hodnoty potenciometru pro nastavení pracovního cyklu PWM z kolíku ADC P0.28. Proto používáme modul ADC v LPC2148 pro převod analogového vstupu potenciometru (0 až 3,3 V) na hodnoty ADC (0 až 1023).
Zde převádíme hodnoty z 0-1023 na 0-255 dělením 4, protože PWM LPC2148 má 8-bitové rozlišení (2 8).
Krok 9: - Pro výběr kolíku ADC P0.28 v LPC2148 používáme
PINSEL1 = 0x01000000; // Nastavení P0.28 jako ADC VSTUP AD0CR = (((14) << 8) - (1 << 21)); // Nastavení hodin a PDN pro A / D převod
Následující řádky zachycují analogový vstup (0 až 3,3 V) a převádějí jej na digitální hodnotu (0 až 1023). A pak jsou tyto digitální hodnoty rozděleny 4, aby se převedly na (0 až 255), a nakonec přiváděny jako PWM výstup na pin P0.0 LPC2148, ke kterému je připojena LED.
AD0CR - = (1 << 1); // Vyberte kanál AD0.1 v registru ADC delaytime (10); AD0CR - = (1 << 24); // Spusťte A / D převod while ((AD0DR1 & (1 << 31)) == 0); // Zkontrolujte bit DONE v ADC Data register adcvalue = (AD0DR1 >> 6) & 0x3ff; // Získejte VÝSLEDEK z datového registru ADC dutycycle = adcvalue / 4; // vzorec pro získání hodnot dutycycle od (0 do 255) PWMMR1 = dutycycle; // nastavit hodnotu dutycycle na PWM match register PWMLER - = (1 << 1); // Povolit výstup PWM s hodnotou dutycycle
Krok 10: - Dále tyto hodnoty zobrazíme na LCD (16X2) zobrazovacím modulu. Přidáme tedy následující řádky k inicializaci modulu LCD displeje
Void LCD_INITILIZE (void) // Funkce pro přípravu LCD { IO0DIR = 0x0000FFF0; // Nastaví pin P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 jako OUTPUT delaytime (20); LCD_SEND (0x02); // Inicializace lcd ve 4bitovém provozním režimu LCD_SEND (0x28); // 2 řádky (16X2) LCD_SEND (0x0C); // Vypnout zobrazení kurzoru LCD_SEND (0x06); // Automatický přírůstek kurzoru LCD_SEND (0x01); // Zobrazit jasný LCD_SEND (0x80); // První řádek první pozice }
Protože jsme připojili LCD ve 4bitovém režimu k LPC2148, musíme posílat hodnoty, které se budou zobrazovat jako nibble by nibble (Upper Nibble & Lower Nibble). Používají se tedy následující řádky.
void LCD_DISPLAY (char * msg) // Funkce pro tisk posílaných znaků jeden po druhém { uint8_t i = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Odešle horní okusování IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH pro tisk dat IO0CLR = 0x00000020; // RW LOW Režim zápisu delaytime (2); IO0CLR = 0x00000040; // EN = 0, RS a RW beze změny (tj. RS = 1, RW = 0) delaytime (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Odesílá spodní okusování IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; delaytime (2); IO0CLR = 0x00000040; delaytime (5); i ++; } }
K zobrazení těchto hodnot ADC a PWM používáme následující řádky ve funkci int main () .
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", adcvalue); LCD_DISPLAY (displayadc); // Zobrazit hodnotu ADC (0 až 1023) LCD_SEND (0xC0); sprintf (ledoutput, "PWM OP =%. 2f", jas); LCD_DISPLAY (ledoutput); // Zobrazení hodnot pracovního cyklu od (0 do 255)
Kompletní kód a popis videa tutoriálu jsou uvedeny níže.