- PWM (modulacija širine impulza)
- PWM zatiči v ARM7-LPC2148
- Registri PWM v ARM7-LPC2148
- Potrebne komponente
- Shema vezja in povezave
- Programiranje ARM7-LPC2148 za PWM
- Koraki pri programiranju LPC2148 za PWM in ADC
Kot vemo, mikrokrmilniki prevzamejo analogni vhod iz analognih senzorjev in za obdelavo teh signalov uporabljajo ADC (analogno-digitalni pretvornik). Kaj pa, če želi mikrokrmilnik proizvajati analogni signal za nadzor analogno vodenih naprav, kot so servo motor, enosmerni motor itd.? Mikrokrmilniki ne proizvajajo izhodne napetosti, kot je 1V, 5V, temveč za upravljanje analognih naprav uporabljajo tehniko, imenovano PWM. Primer PWM je hladilni ventilator (enosmerni motor) našega prenosnega računalnika, ki ga je treba nadzorovati glede na temperaturo, enako pa je uporabljeno s pomočjo tehnike Pulse Width Modulation (PWM) na matičnih ploščah.
V tej vadnici bomo nadzirali svetlost LED z uporabo PWM v mikrokrmilniku ARM7-LPC2148.
PWM (modulacija širine impulza)
PWM je dober način za nadzor analognih naprav z digitalno vrednostjo, kot so nadzor hitrosti motorja, svetlost LED itd. Čeprav PWM ne zagotavlja čistega analognega izhoda, vendar generira dostojne analogne impulze za nadzor analognih naprav. PWM dejansko modulira širino pravokotnega pulznega vala, da bi dosegel spremembo povprečne vrednosti nastalega vala.
Delovni cikel PWM
Odstotek časa, v katerem signal PWM ostane VISOK (pravočasno), se imenuje delovni cikel. Če je signal vedno vklopljen, je v 100% obratovalnem ciklu in če je vedno izklopljen, je 0% obratovalni cikel.
Delovni cikel = čas vklopa / (čas vklopa + čas izklopa)
PWM zatiči v ARM7-LPC2148
Spodnja slika prikazuje izhodne zatiče PWM ARM7-LPC2148. Za PWM je skupno šest zatičev.
Kanal PWM |
LPC2148 Priključki za vrata |
PWM1 |
P0,0 |
PWM2 |
P0.7 |
PWM3 |
P0.1 |
PWM4 |
P0.8 |
PWM5 |
P0.21 |
PWM6 |
P0.9 |
Registri PWM v ARM7-LPC2148
Preden začnemo sodelovati v našem projektu, moramo vedeti o registrih PWM v LPC2148.
Tu je seznam registrov, ki se uporabljajo v LPC2148 za PWM
1. PWMPR: register predkale PWM
Uporaba: To je 32-bitni register. Vsebuje, kolikokrat (minus 1) mora PCLK pred povečanjem števca števca PWM (dejansko vsebuje največjo vrednost števca predkale) preklopiti.
2. PWMPC: števec za prednapenjanje PWM
Uporaba: To je 32-bitni register . Vsebuje naraščajočo vrednost števca. Ko je ta vrednost enaka vrednosti PR plus 1, se števec števca PWM (TC) poveča.
3. PWMTCR: Register nadzora časovnika PWM
Uporaba: Vsebuje kontrolne bitove Omogoči števec, Ponastavi števec in PWM Omogoči. To je 8-bitni register.
7: 4 |
3. |
2. |
1. |
0 |
REZERVIRANO |
Omogoči PWM |
REZERVIRANO |
ŠTEVILKA PONASTAVI |
ŠTEVILEC OMOGOČEN |
- Omogočanje PWM: (Bit-3)
0- PWM onemogočen
1- PWM omogočen
- Omogoči števec: (Bit-0)
0- Onemogoči števce
1- Omogoči števec
- Ponastavitev števca: (Bit-1)
0- Ne naredi ničesar.
1- Ponastavi PWMTC in PWMPC na pozitivni rob PCLK.
4. PWMTC: števec števca PWM
Uporaba: To je 32-bitni register. Vsebuje trenutno vrednost naraščajočega časovnika PWM. Ko števec preskalerja (PC) doseže vrednost registra PR (Prescaler Register - PR) plus 1, se ta števec poveča.
5. PWMIR: register prekinitev PWM
Uporaba: To je 16-bitni register. Vsebuje zastavice za prekinitve za kanale ujemanja PWM 0-6. Zastavica prekinitve se nastavi, ko pride do prekinitve za ta kanal (MRx prekinitev), kjer je X številka kanala (0 do 6).
6. PWMMR0-PWMMR6: Register ujemanja PWM
Uporaba: To je 32-bitni register . Skupina Match Channel dejansko omogoča nastavitev 6 izhodov PWM z nadzorom z enim robom ali 3 z dvojnim robom. Sedem kanalov za ujemanje lahko spremenite tako, da te izhodne nastavitve PWM konfigurirate tako, da ustrezajo vašim zahtevam v PWMPCR.
7. PWMMCR: Register nadzora ujemanja PWM
Uporaba: To je 32-bitni register. Vsebuje bitove Prekinitev, Ponastavitev in Ustavitev, ki nadzorujejo izbrani kanal ujemanja. Med registri ujemanja PWM in števci PWM Timer pride do ujemanja.
31:21 |
20. |
19. |
18. |
.. |
5. |
4. |
3. |
2. |
1. |
0 |
REZERVIRANO |
PWMMR6S |
PWMMR6R |
PWMMR6I |
.. |
PWMMR1S |
PWMMR1R |
PWMMR11 |
PWMMR0S |
PWMMR0R |
PWMMR01 |
Tu je x od 0 do 6
- PWMMRxI (bit-0)
Omogoči ali onemogoči prekinitve PWM
0- Onemogoči prekinitve PWM Match.
1- Omogoči prekinitev PWM Match.
- PWMMRxR: (bit-1)
RESET PWMTC - Vrednost števca časovnika, kadar koli se ujema s PWMRx
0- Ne naredi ničesar.
1- Ponastavi PWMTC.
- PWMMRxS: (bit 2)
STOP PWMTC in PWMPC, ko PWMTC doseže vrednost registra ujemanja
0- Onemogočite funkcijo zaustavitve PWM.
1- Omogočite funkcijo PWM Stop.
8. PWMPCR: nadzorni register PWM
Uporaba: To je 16-bitni register. Vsebuje bite, ki omogočajo izhodne vrednosti PWM 0-6 in za vsak izhod izberejo nadzor z enim ali dvojnim robom.
31:15 |
14: 9 |
8: 7 |
6: 2 |
1: 0 |
NEUPORABLJENO |
PWMENA6-PWMENA1 |
NEUPORABLJENO |
PWMSEL6-PWMSEL2 |
NEUPORABLJENO |
- PWMSELx (x: 2 do 6)
- Način z enim robom za PWMx
- 1- Način dvojnega roba za PWMx.
- PWMENAx (x: 1 do 6)
- PWMx Onemogoči.
- 1- PWMx omogočen.
9. PWMLER: Register za omogočanje zaklepanja PWM
Uporaba: To je 8-bitni register. Vsebuje bite Match x Latch za vsak kanal Match.
31: 7 |
6. |
5. |
4. |
3. |
2. |
1. |
0 |
NEUPORABLJENO |
LEN6 |
LEN5 |
LEN4 |
LEN3 |
LEN2 |
LEN1 |
LEN0 |
LENx (x: 0 do 6):
0- Onemogočite nalaganje novih vrednosti ujemanja
1- Naložite nove vrednosti ujemanja iz (PWMMRx) PWMMatch Register, ko se časovnik ponastavi.
Zdaj lahko začnemo graditi nastavitev strojne opreme za prikaz modulacije širine impulza v mikrokrmilniku ARM.
Potrebne komponente
Strojna oprema
- Mikrokrmilnik ARM7-LPC2148
- 3.3V napetostni regulator IC
- 10k potenciometer
- LED (poljubna barva)
- Zaslonski modul LCD (16x2)
- Breadboard
- Povezovanje žic
Programska oprema
- Keil uVision5
- Flash Magic Tool
Shema vezja in povezave
Povezave med LCD in ARM7-LPC2148
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (izbira registra) |
P0.6 |
E (Omogoči) |
P0.12 |
D4 (podatkovni zatič 4) |
P0.13 |
D5 (podatkovni zatič 5) |
P0.14 |
D6 (podatkovni zatič 6) |
P0.15 |
D7 (podatkovni zatič 7) |
GND |
VSS, R / W, K |
+ 5V |
VDD, A |
Povezava med LED in ARM7-LPC2148
LED ANODE je povezan z izhodom PWM (P0.0) LPC2148, medtem ko je pin CATHODE LED povezan z GND pin LPC2148.
Povezava med ARM7-LPC2148 in potenciometrom z napetostnim regulatorjem 3,3 V
3.3V napetostni regulator IC |
Funkcija zatiča |
Pin ARM-7 LPC2148 |
1. Levi zatič |
- Ve iz GND |
Zatič GND |
2. Center Pin |
Reguliran + 3.3V izhod |
Na potenciometer Vhod in izhod potenciometra na P0,28 LPC2148 |
3. Desni zatič |
+ Ve od 5V VHOD |
+ 5V |
Točke, ki jih je treba upoštevati
1. Tukaj se uporablja napetostni regulator 3,3 V za zagotavljanje analogne vhodne vrednosti na ADC zatič (P0,28) LPC2148 in ker uporabljamo 5 V napajanja, moramo napetost uravnavati z napetostnim regulatorjem 3,3 V.
2. Potenciometer se uporablja za spreminjanje napetosti med (0V do 3,3V) za zagotovitev analognega vhoda (ADC) na LPC2148 pin P0.28
Programiranje ARM7-LPC2148 za PWM
Za programiranje ARM7-LPC2148 potrebujemo orodje keil uVision & Flash Magic. Za programiranje ARM7 Stick preko mikro USB vrat uporabljamo kabel USB. Kodo napišemo s pomočjo Keila in ustvarimo šestnajstiško datoteko, nato pa datoteko HEX z Flash Magic utripnemo na ARM7. Če želite izvedeti več o namestitvi keil uVision in Flash Magic ter kako jih uporabljati, sledite povezavi Uvod v mikrokrmilnik ARM7 LPC2148 in ga programirajte s pomočjo Keil uVision.
V tej vadnici bomo za nadzor svetlosti LED uporabili tehniko ADC in PWM. Tu ima LPC2148 analogni vhod (0 do 3,3 V) prek vhodnega zatiča ADC P0,28, nato pa se ta analogni vhod pretvori v digitalno vrednost (0 do 1023). Nato se ta vrednost ponovno pretvori v digitalno vrednost (0 - 255), saj ima izhod PWM LPC2148 le 8-bitno ločljivost (2 8). LED je priključen na PWM pin P0.0 in svetlost LED je mogoče nadzirati s pomočjo potenciometra. Če želite izvedeti več o ADC v ARM7-LPC2148, sledite povezavi.
Koraki pri programiranju LPC2148 za PWM in ADC
1. korak: - Najprej je treba PLL konfigurirati za generiranje ure, saj nastavi sistemsko uro in zunanjo uro LPC2148, kot to potrebujejo programerji. Največja taktna frekvenca za LPC2148 je 60 MHz. Naslednje vrstice se uporabljajo za konfiguriranje generacije ure PLL.
void InitilizePLL (void) // Funkcija za uporabo PLL za generiranje ure { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; medtem ko (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
2. korak: - Naslednja stvar je, da s pomočjo registra PINSEL izberete zatiči PWM in funkcijo PWM LPC2148. PINSEL0 uporabljamo kot P0.0 za PWM izhod LPC2148.
PINSEL0 = 0x00000002; // Nastavitveni zatič P0.0 za izhod PWM
3. korak: - Nato moramo PONASTAVITI merilnike časa s pomočjo PWMTCR (Timer Control Register).
PWMTCR = (1 << 1); // Nastavitev registra PWM Timer Control kot ponastavitve števca
Nato nastavite vrednost predkale, ki določa ločljivost PWM. Nastavim na nič
PWMPR = 0X00; // Nastavitev vrednosti predkaliranja PWM
4. korak: - Nato moramo nastaviti PWMMCR (register za nadzor ujemanja PWM), saj nastavi delovanje, kot je ponastavitev, prekinitve za PWMMR0.
PWMMCR = (1 << 0) - (1 << 1); // Nastavitev registra nadzora ujemanja PWM
5. korak: - Najdaljše obdobje kanala PWM se nastavi s pomočjo PWMMR.
PWMMR0 = vrednost PWM; // Dajanje vrednosti PWM Največja vrednost
V našem primeru je največja vrednost 255 (za največjo svetlost)
6. korak: - Nato moramo nastaviti nastavitev Latch Enable na ustrezne registre ujemanja s pomočjo PWMLER
PWMLER = (1 << 0); // Zapiralo PWM Enalbe
(Uporabljamo PWMMR0) Torej omogočite ustrezni bit, tako da nastavite 1 v PWMLER
7. korak: - Da omogočimo izhod PWM na zatič, moramo uporabiti PWMTCR za omogočanje števcev PWM Timer in načinov PWM.
PWMTCR = (1 << 0) - (1 << 3); // Omogočanje števca PWM in PWM
Korak 8: - Zdaj moramo dobiti vrednosti potenciometra za nastavitev delovnega cikla PWM iz ADC zatiča P0.28. Zato uporabljamo modul ADC v LPC2148 za pretvorbo analognega vhoda potenciometrov (0 do 3,3 V) v vrednosti ADC (0 do 1023).
Tu pretvorimo vrednosti od 0-1023 v 0-255, tako da jo delimo s 4, saj ima PWM LPC2148 8-bitno ločljivost (2 8).
9. korak: - Za izbiro ADC zatiča P0.28 v LPC2148 uporabljamo
PINSEL1 = 0x01000000; // Nastavitev P0.28 kot ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // Nastavitev ure in PDN za A / D pretvorbo
Naslednje vrstice zajemajo analogni vhod (od 0 do 3,3 V) in ga pretvorijo v digitalno vrednost (od 0 do 1023). Nato se te digitalne vrednosti delijo s 4, da se pretvorijo v (0 do 255) in se na koncu napajajo kot izhod PWM v P0,0 pin LPC2148, na katerega je priključena LED.
AD0CR - = (1 << 1); // izberemo kanal AD0.1 v času zakasnitve registra ADC (10); AD0CR - = (1 << 24); // Zaženi A / D pretvorbo medtem ((AD0DR1 & (1 << 31)) == 0); // Preveri bit DONE v ADC Data register adcvalue = (AD0DR1 >> 6) & 0x3ff; // Pridobite REZULTAT iz registra podatkov ADC dutycycle = adcvalue / 4; // formula za pridobitev vrednosti delovnega cikla od (0 do 255) PWMMR1 = delovni cikel; // nastavimo vrednost delovnega cikla na register ujemanja PWM PWMLER - = (1 << 1); // Omogoči izhod PWM z vrednostjo delovnega cikla
Korak 10: - Nato te vrednosti prikažemo v zaslonskem modulu LCD (16X2). Torej dodamo naslednje vrstice za inicializacijo modula LCD zaslona
Void LCD_INITILIZE (void) // Funkcija za pripravo LCD-ja { IO0DIR = 0x0000FFF0; // Nastavi pin P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 kot ČAS zakasnitve IZHOD (20); LCD_SEND (0x02); // inicializiramo lcd v 4-bitnem načinu delovanja LCD_SEND (0x28); // 2 vrstici (16X2) LCD_SEND (0x0C); // Prikaz na kazalcu izklopljen LCD_SEND (0x06); // Samodejni prirastek kurzorja LCD_SEND (0x01); // Prikaži jasen LCD_SEND (0x80); // Prva pozicija prve vrstice }
Ker smo LCD v 4-bitnem načinu povezali z LPC2148, moramo vrednosti poslati tako, da se prikazujejo kot grizljanje po grizljanju (zgornje in spodnje grizljanje). Tako se uporabljajo naslednje vrstice.
void LCD_DISPLAY (char * msg) // Funkcija za tiskanje znakov, poslanih enega za drugim { uint8_t i = 0; medtem ko (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // pošlje zgornji grizljaj IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH za tiskanje podatkov IO0CLR = 0x00000020; // RW LOW način zakasnitve v načinu pisanja (2); IO0CLR = 0x00000040; // EN = 0, RS in RW nespremenjeni (tj. RS = 1, RW = 0) čas zakasnitve (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // pošlje spodnji griz IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; čas zakasnitve (2); IO0CLR = 0x00000040; čas zakasnitve (5); i ++; } }
Za prikaz vrednosti ADC in PWM uporabimo naslednje vrstice v funkciji int main () .
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", adcvalue); LCD_DISPLAY (displayadc); // Prikaži vrednost ADC (0 do 1023) LCD_SEND (0xC0); sprintf (ledoutput, "PWM OP =%. 2f", svetlost); LCD_DISPLAY (ledoutput); // Prikaži vrednosti delovnega cikla od (0 do 255)
Popolna koda in video opis vadnice so navedeni spodaj.