- PWM (modulácia šírky impulzu)
- PWM piny v ARM7-LPC2148
- Registre PWM v ARM7-LPC2148
- Súčasti sú povinné
- Schéma zapojenia a zapojenia
- Programovanie ARM7-LPC2148 pre PWM
- Kroky spojené s programovaním LPC2148 pre PWM a ADC
Ako vieme, mikrokontroléry berú analógový vstup z analógových senzorov a na spracovanie týchto signálov používajú ADC (analógovo-digitálny prevodník). Ale čo keď chce mikrokontrolér produkovať analógový signál na riadenie analógovo ovládaných zariadení, ako je servomotor, jednosmerný motor atď.? Mikrokontroléry neprodukujú výstupné napätie ako 1V, 5V, namiesto toho používajú na prevádzkovanie analógových zariadení techniku zvanú PWM. Príkladom PWM je chladiaci ventilátor (jednosmerný motor) nášho notebooku, ktorý musí byť regulovaný rýchlosťou podľa teploty. To isté sa implementuje použitím techniky Pulse Width Modulation (PWM) na základných doskách.
V tomto tutoriále budeme riadiť jas LED pomocou PWM v mikrokontroléri ARM7-LPC2148.
PWM (modulácia šírky impulzu)
PWM je dobrý spôsob ovládania analógových zariadení pomocou digitálnych veličín, ako je riadenie rýchlosti motora, jasu LED atď. PWM síce neposkytuje čistý analógový výstup, ale na riadenie analógových zariadení generuje slušné analógové impulzy. PWM v skutočnosti moduluje šírku obdĺžnikovej impulznej vlny, aby sa získala odchýlka v priemernej hodnote výslednej vlny.
Pracovný cyklus PWM
Percento času, v ktorom signál PWM zostáva VYSOKÝ (v čase), sa nazýva pracovný cyklus. Ak je signál stále ZAPNUTÝ, je v 100% pracovnom cykle a ak je vždy vypnutý, je to 0% pracovný cyklus.
Pracovný cyklus = čas zapnutia / (čas zapnutia + čas vypnutia)
PWM piny v ARM7-LPC2148
Obrázok nižšie označuje výstupné piny PWM ARM7-LPC2148. Pre PWM existuje celkom šesť pinov.
Kanál PWM |
Piny portov LPC2148 |
PWM1 |
P0.0 |
PWM2 |
P0.7 |
PWM3 |
P0.1 |
PWM4 |
P0.8 |
PWM5 |
P0.21 |
PWM6 |
P0,9 |
Registre PWM v ARM7-LPC2148
Predtým, ako sa dostaneme do nášho projektu, potrebujeme vedieť o registroch PWM v LPC2148.
Tu je zoznam registrov použitých v LPC2148 pre PWM
1. PWMPR: Register PWM Prescale
Použitie: Je to 32-bitový register. Obsahuje počet, koľkokrát (mínus 1) musí PCLK cyklovať pred zvýšením počítadla časovača PWM (skutočne obsahuje maximálnu hodnotu počítadla predvoľby).
2. PWMPC: Počítadlo predvoľby PWM
Použitie: Je to 32-bitový register . Obsahuje prírastkovú hodnotu počítadla. Keď sa táto hodnota rovná hodnote PR plus 1, zvýši sa časovač PWM (TC).
3. PWMTCR: Register riadenia časovača PWM
Použitie: Obsahuje riadiace bity Counter Enable, Counter Reset a PWM Enable. Je to 8-bitový register.
7: 4 |
3 |
2 |
1 |
0 |
VYHRADENÉ |
PWM POVOLENÉ |
VYHRADENÉ |
OBNOVA POČÍTAČA |
POČÍTAČ POVOLENÝ |
- Povoliť PWM: (bit-3)
0- PWM deaktivované
1- PWM povolené
- Povoliť počítadlo: (bit-0)
0- Zakázať počítadlá
1- Povoliť počítadlo
- Reset počítadla: (Bit-1)
0- Nerobiť nič.
1- Resetuje PWMTC a PWMPC na kladnej hrane PCLK.
4. PWMTC: Počítadlo časovača PWM
Použitie: Je to 32-bitový register. Obsahuje aktuálnu hodnotu prírastkového časovača PWM. Keď počítadlo Prescaler (PC) dosiahne hodnotu Registra Prescaler (PR) plus 1, toto počítadlo sa zvýši.
5. PWMIR: PWM Interrupt Register
Použitie: Je to 16-bitový register. Obsahuje príznaky prerušenia pre PWM Match Channels 0-6. Príznak prerušenia sa nastaví, keď dôjde k prerušeniu pre daný kanál (MRx Interrupt), kde X je číslo kanálu (0 až 6).
6. PWMMR0-PWMMR6: Register zhody PWM
Použitie: Je to 32-bitový register . V skutočnosti skupina Match Channel umožňuje nastavenie 6 výstupov PWM riadených jednou hranou alebo 3 výstupov riadených dvoma hranami. Môžete upraviť sedem zhodných kanálov a nakonfigurovať tieto výstupy PWM tak, aby vyhovovali vašim požiadavkám v PWMPCR.
7. PWMMCR: PWM Match Control Register
Použitie: Je to 32-bitový register. Obsahuje bity prerušenia, vynulovania a zastavenia, ktoré riadia vybraný zhodný kanál. Medzi registrami zhody PWM a počítadlami časovača PWM nastane zhoda.
31:21 |
20 |
19 |
18 |
.. |
5 |
4 |
3 |
2 |
1 |
0 |
VYHRADENÉ |
PWMMR6S |
PWMMR6R |
PWMMR6I |
.. |
PWMMR1S |
PWMMR1R |
PWMMR11 |
PWMMR0S |
PWMMR0R |
PWMMR01 |
Tu x je od 0 do 6
- PWMMRxI (bit-0)
POVOLIŤ ALEBO ZAKÁZAŤ prerušenia PWM
0- Zakáže prerušenie zápasu PWM.
1- Povoliť prerušenie zápasu PWM.
- PWMMRxR: (bit-1)
RESET PWMTC - hodnota počítadla časovača, kedykoľvek sa zhoduje s PWMRx
0- Nerobiť nič.
1- Resetuje PWMTC.
- PWMMRxS: (bit 2)
ZASTAVTE PWMTC & PWMPC, keď PWMTC dosiahne hodnotu registra zhody
0- Zakáže funkciu zastavenia PWM.
1- Zapnite funkciu PWM Stop.
8. PWMPCR: PWM Control Register
Použitie: Je to 16-bitový register. Obsahuje bity, ktoré umožňujú PWM výstupy 0-6 a pre každý výstup vyberajú riadenie jednej alebo dvoch bočných strán.
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 jednej hrany pre PWMx
- 1 - Režim dvojitého okraja pre PWMx.
- PWMENAx (x: 1 až 6)
- PWMx Zakázať.
- 1 - PWMx povolené.
9. PWMLER: PWM Latch Enable Register
Použitie: Je to 8-bitový register. Obsahuje bity Match x Latch pre 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áže načítanie nových hodnôt zhody
1- Načíta nové hodnoty zhody z registra (PWMMRx) PWMMatch, keď sa vynuluje časovač.
Teraz začnime budovať hardvérové nastavenie, aby sme demonštrovali moduláciu šírky impulzu v mikrokontroléri ARM.
Súčasti sú povinné
Hardware
- Mikrokontrolér ARM7-LPC2148
- IC regulátora napätia 3,3 V
- 10k potenciometer
- LED (ľubovoľná farba)
- Modul displeja LCD (16 x 2)
- Nepál
- Pripojenie drôtov
Softvér
- Keil uVision5
- Flash Magic Tool
Schéma zapojenia a zapojenia
Prepojenia medzi LCD a ARM7-LPC2148
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Register Select) |
P0.6 |
E (Povoliť) |
P0.12 |
D4 (dátový kolík 4) |
P0.13 |
D5 (dátový kolík 5) |
P0.14 |
D6 (dátový kolík 6) |
P0.15 |
D7 (dátový kolík 7) |
GND |
VSS, R / W, K |
+ 5V |
VDD, A |
Prepojenie medzi LED a ARM7-LPC2148
LED dióda ANODE je pripojená k výstupu PWM (P0.0) LPC2148, zatiaľ čo pin CATHODE LED je pripojený k pinu GND LPC2148.
Prepojenie medzi ARM7-LPC2148 a potenciometrom s regulátorom napätia 3,3 V.
IC regulátora napätia 3,3 V |
Funkcia pripnutia |
ARM-7 LPC2148 kolík |
1. Ľavý kolík |
- Ve z GND |
GND pin |
2. Stredový kolík |
Regulovaný výstup +3,3 V. |
Na potenciometer Vstup a výstup potenciometra na P0,28 LPC2148 |
3. Pravý kolík |
+ Ve od 5V VSTUP |
+ 5V |
Body, ktoré je potrebné poznamenať
1. Regulátor napätia 3,3 V sa tu používa na zabezpečenie analógovej vstupnej hodnoty na kolík ADC (P0,28) LPC2148 a pretože používame napájanie 5V, musíme regulovať napätie regulátorom napätia 3,3V.
2. Potenciometer sa používa na zmenu napätia medzi (0 V až 3,3 V) na zabezpečenie analógového vstupu (ADC) na kolíku LPC2148 P0,28.
Programovanie ARM7-LPC2148 pre PWM
Na programovanie ARM7-LPC2148 potrebujeme keil uVision & Flash Magic nástroj. Na programovanie karty ARM7 Stick cez port micro USB používame kábel USB. Napíšeme kód pomocou Keila a vytvoríme hexadecimálny súbor. Potom sa HEX súbor nahrá na flash disk ARM7 pomocou Flash Magic. Ak sa chcete dozvedieť viac o inštalácii keil uVision a Flash Magic a o tom, ako ich používať, kliknite na odkaz Začíname s mikrokontrolérom ARM7 LPC2148 a naprogramujte ho pomocou Keil uVision.
V tomto tutoriále použijeme na riadenie jasu LED techniku ADC a PWM. Tu je LPC2148 daný analógový vstup (0 až 3,3 V) cez vstupný pin ADC P0,28, potom je tento analógový vstup prevedený na digitálnu hodnotu (0 až 1023). Potom sa táto hodnota znova prevedie na digitálnu hodnotu (0 - 255), pretože výstup PWM LPC2148 má iba 8-bitové rozlíšenie (2 8). LED je pripojená k PWM pinu P0.0 a jas LED je možné regulovať pomocou potenciometra. Ak sa chcete dozvedieť viac informácií o ADC v ARM7-LPC2148, kliknite na odkaz.
Kroky spojené s programovaním LPC2148 pre PWM a ADC
Krok 1: - Úplne prvá vec je nakonfigurovať PLL na generovanie hodín, pretože nastavuje systémové hodiny a periférne hodiny LPC2148 podľa potreby programátorov. Maximálna frekvencia hodín pre LPC2148 je 60Mhz. Nasledujúce riadky sa používajú na konfiguráciu generovania hodín PLL.
void initilizePLL (void) // Funkcia na použitie PLL na generovanie hodín { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; while (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Krok 2: - Ďalšou vecou je výber pinov PWM a funkcie PWM LPC2148 pomocou registra PINSEL. Používame PINSEL0, pretože používame P0.0 pre PWM výstup LPC2148.
PINSEL0 = 0x00000002; // Nastavovací kolík P0.0 pre výstup PWM
Krok 3: - Ďalej musíme RESETOVAŤ časovače pomocou PWMTCR (Timer Control Register).
PWMTCR = (1 << 1); // Nastavenie riadenia časovača PWM Zaregistrujte sa ako vynulovanie počítadla
A potom nastavte prednastavenú hodnotu, ktorá rozhoduje o rozlíšení PWM. Nastavujem to na nulu
PWMPR = 0X00; // Nastavenie hodnoty predvoľby PWM
Krok 4: - Ďalej musíme nastaviť PWMMCR (PWM kontrolný register zhodov), pretože nastavuje činnosť ako reset, prerušenia pre PWMMR0.
PWMMCR = (1 << 0) - (1 << 1); // Nastavenie registra kontroly zhody PWM
Krok 5: - Maximálna perióda kanálu PWM sa nastavuje pomocou PWMMR.
PWMMR0 = PWMvalue; // Poskytnutie hodnoty PWM Maximálna hodnota
V našom prípade je maximálna hodnota 255 (pre maximálny jas)
Krok 6: - Ďalej musíme pomocou príkazu PWMLER nastaviť funkciu Latch Enable na príslušné registre zhody
PWMLER = (1 << 0); // Západka Enalbe PWM
(Používame PWMMR0) Povolte teda zodpovedajúci bit nastavením 1 v PWMLER
Krok 7: - Ak chcete povoliť výstup PWM na pin, musíme použiť PWMTCR na povolenie počítadiel časovača PWM a režimov PWM.
PWMTCR = (1 << 0) - (1 << 3); // Povolenie počítadla PWM a PWM
Krok 8: - Teraz musíme získať hodnoty potenciometra pre nastavenie pracovného cyklu PWM z kolíka ADC P0.28. Preto používame modul ADC v LPC2148 na prevod analógového vstupu potenciometra (0 až 3,3 V) na hodnoty ADC (0 až 1023).
Tu prevádzame hodnoty z 0-1023 na 0-255 vydelením 4, pretože PWM LPC2148 má 8-bitové rozlíšenie (2 8).
Krok 9: - Na výber kolíka ADC P0.28 v LPC2148 použijeme
PINSEL1 = 0x01000000; // Nastavenie P0.28 ako ADC VSTUP AD0CR = ((((14) << 8) - (1 << 21)); // Nastavenie hodín a PDN pre A / D prevod
Nasledujúce riadky zachytávajú analógový vstup (0 až 3,3 V) a prevádzajú ho na digitálnu hodnotu (0 až 1023). Potom sú tieto digitálne hodnoty rozdelené na 4, aby sa previedli na (0 až 255), a nakoniec sú napájané ako výstup PWM na pin P0.0 LPC2148, na ktorom je pripojená LED.
AD0CR - = (1 << 1); // Vyberte kanál AD0.1 v registri ADC delaytime (10); AD0CR - = (1 << 24); // Spustenie A / D prevodu while ((AD0DR1 & (1 << 31)) == 0); // Skontrolujte bit Hotovo v ADC Data register adcvalue = (AD0DR1 >> 6) & 0x3ff; // Získajte VÝSLEDOK z dátového registra ADC dutycycle = adcvalue / 4; // vzorec na získanie hodnôt colného cyklu od (0 do 255) PWMMR1 = colný cyklus; // nastavenie hodnoty dutycycle na PWM match register PWMLER - = (1 << 1); // Povolí výstup PWM s hodnotou cyklu
Krok 10: - Ďalej tieto hodnoty zobrazíme na LCD (16X2) zobrazovacom module. Takže pridáme nasledujúce riadky na inicializáciu modulu LCD displeja
Void LCD_INITILIZE (void) // Funkcia prípravy LCD { IO0DIR = 0x0000FFF0; // Nastaví pin P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 ako OUTPUT delaytime (20); LCD_SEND (0x02); // Inicializácia lcd v 4-bitovom režime prevádzky LCD_SEND (0x28); // 2 riadky (16X2) LCD_SEND (0x0C); // Vypnuté zobrazenie kurzora LCD_SEND (0x06); // Automatický prírastok kurzora LCD_SEND (0x01); // Zobraziť jasný LCD_SEND (0x80); // Prvý riadok prvá pozícia }
Pretože sme pripojili LCD v 4-bitovom režime k LPC2148, musíme posielať hodnoty, ktoré sa majú zobrazovať ako nibble by nibble (Upper Nibble & Lower Nibble). Používajú sa teda nasledujúce riadky.
void LCD_DISPLAY (char * msg) // Funkcia pre tlač znakov odosielaných po jednom { uint8_t i = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Odošle horný nibble IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH na tlač údajov IO0CLR = 0x00000020; // RW LOW režim zápisu delaytime (2); IO0CLR = 0x00000040; // EN = 0, RS a RW nezmenené (tj. RS = 1, RW = 0) delaytime (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Odošle dolný nibble IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; delaytime (2); IO0CLR = 0x00000040; delaytime (5); i ++; } }
Na zobrazenie týchto hodnôt ADC a PWM používame nasledujúce riadky vo funkcii int main () .
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", adcvalue); LCD_DISPLAY (displayadc); // Zobraziť hodnotu ADC (0 až 1023) LCD_SEND (0xC0); sprintf (ledoutput, "PWM OP =%. 2f", jas); LCD_DISPLAY (ledoutput); // Zobraziť hodnoty pracovného cyklu od (0 do 255)
Kompletný kód a video popis tutoriálu sú uvedené nižšie.