- PWM (modulacija širine impulsa)
- PWM igle u ARM7-LPC2148
- PWM registri u ARM7-LPC2148
- Komponente potrebne
- Kružni dijagram i veze
- Programiranje ARM7-LPC2148 za PWM
- Koraci uključeni u programiranje LPC2148 za PWM i ADC
Kao što znamo, mikrokontroleri uzimaju analogni ulaz od analognih senzora i koriste ADC (analogni u digitalni pretvarač) za obradu tih signala. Ali što ako mikrokontroler želi proizvesti analogni signal za upravljanje analogno upravljanim uređajima poput servo motora, istosmjernog motora itd.? Mikrokontroleri ne proizvode izlazni napon poput 1V, 5V, već koriste tehniku koja se naziva PWM za rad analognih uređaja. Primjer PWM-a je ventilator za hlađenje našeg prijenosnog računala (istosmjerni motor) koji treba kontrolirati brzinu u skladu s temperaturom, a isti se implementira uporabom tehnike Pulse Width Modulation (PWM) na matičnim pločama.
U ovom uputstvu ćemo kontrolirati svjetlinu LED diode pomoću PWM-a u mikrokontroleru ARM7-LPC2148.
PWM (modulacija širine impulsa)
PWM je dobar način za upravljanje analognim uređajima pomoću digitalnih vrijednosti poput upravljanja brzinom motora, svjetlinom LED-a itd. Iako PWM ne pruža čisti analogni izlaz, ali generira pristojne analogne impulse za upravljanje analognim uređajima. PWM zapravo modulira širinu pravokutnog impulsnog vala kako bi dobio varijaciju u prosječnoj vrijednosti rezultirajućeg vala.
Radni ciklus PWM
Postotak vremena u kojem PWM signal ostaje VISOK (na vrijeme) naziva se radnim ciklusom. Ako je signal uvijek UKLJUČEN, on je u 100% radnom ciklusu, a ako je uvijek isključen, to je 0% radnog ciklusa.
Radni ciklus = Vrijeme UKLJUČIVANJA / (Vrijeme UKLJUČIVANJA + Vrijeme isključivanja)

PWM igle u ARM7-LPC2148
Na slici ispod prikazane su PWM izlazne igle ARM7-LPC2148. Ukupno ima šest pinova za PWM.

|
PWM kanal |
LPC2148 Pribadače |
|
PWM1 |
P0,0 |
|
PWM2 |
P0.7 |
|
PWM3 |
P0.1 |
|
PWM4 |
P0.8 |
|
PWM5 |
P0.21 |
|
PWM6 |
P0.9 |
PWM registri u ARM7-LPC2148
Prije ulaska u naš projekt moramo znati o PWM registrima u LPC2148.
Evo popisa registara koji se koriste u LPC2148 za PWM
1. PWMPR: PWM registar predskale
Upotreba: To je 32-bitni registar. Sadrži broj puta (minus 1) koji PCLK mora ciklizirati prije povećanja brojača PWM mjerača vremena (zapravo sadrži maksimalnu vrijednost brojača predskale).
2. PWMPC: PWM brojač predlazača
Upotreba: To je 32-bitni registar . Sadrži prirastajuću vrijednost brojača. Kada je ova vrijednost jednaka vrijednosti PR plus 1, brojač PWM mjerača vremena (TC) povećava se.
3. PWMTCR: PWM registar vremenskog mjerača
Upotreba: Sadrži kontrolne bitove Counter Enable, Counter Reset i PWM Enable. To je 8-bitni registar.
|
7: 4 |
3 |
2 |
1 |
0 |
|
REZERVIRANO |
Omogućiti PWM |
REZERVIRANO |
PONOVNO PONAŠANJE BROJILA |
BROJILO Omogućeno |
- Omogućavanje PWM-a: (Bit-3)
0- PWM onemogućen
1- PWM omogućen
- Omogući brojač: (Bit-0)
0- Onemogući brojače
1- Omogući brojač
- Resetiranje brojača: (Bit-1)
0- Ne poduzimajte ništa.
1- Resetira PWMTC i PWMPC na pozitivnom rubu PCLK.
4. PWMTC: PWM brojač odbrojavanja
Upotreba: To je 32-bitni registar. Sadrži trenutnu vrijednost priraštajućeg PWM timera. Kad brojač prescalera (PC) dosegne vrijednost registra PR (Prescaler Register - PR) plus 1, taj se brojač povećava.
5. PWMIR: PWM registar prekida
Upotreba: To je 16-bitni registar. Sadrži zastavice prekida za PWM Match kanale 0-6. Oznaka prekida postavlja se kada se za taj kanal dogodi prekid (MRx prekid) gdje je X broj kanala (0 do 6).
6. PWMMR0-PWMMR6: PWM registar podudaranja
Upotreba: To je 32-bitni registar . Zapravo grupa Match Channel omogućuje postavljanje 6 PWM izlaza kontroliranih s jednim ili 3 ruba s dva ruba. Možete izmijeniti sedam kanala podudaranja kako biste konfigurirali ove PWM izlaze kako bi odgovarali vašim zahtjevima u PWMPCR-u.
7. PWMMCR: PWM registar za kontrolu podudaranja
Upotreba: To je 32-bitni registar. Sadrži bitove prekida, resetiranja i zaustavljanja koji kontroliraju odabrani kanal podudaranja. Događa se između PWM registara podudaranja i PWM brojača.
|
31:21 |
20 |
19 |
18 |
.. |
5 |
4 |
3 |
2 |
1 |
0 |
|
REZERVIRANO |
PWMMR6S |
PWMMR6R |
PWMMR6I |
.. |
PWMMR1S |
PWMMR1R |
PWMMR11 |
PWMMR0S |
PWMMR0R |
PWMMR01 |
Ovdje je x od 0 do 6
- PWMMRxI (bit-0)
Omogućiti ili onemogućiti prekide PWM-a
0- Onemogući prekide PWM podudaranja.
1- Omogućiti prekid PWM podudaranja.
- PWMMRxR: (bit-1)
RESET PWMTC - Vrijednost brojača brojača kad god se podudara s PWMRx
0- Ne radite ništa.
1- Resetira PWMTC.
- PWMMRxS: (bit 2)
STOP PWMTC & PWMPC kada PWMTC dosegne vrijednost registra uparivanja
0- Onemogućite značajku zaustavljanja PWM-a.
1- Omogućite značajku zaustavljanja PWM-a.
8. PWMPCR: PWM kontrolni registar
Upotreba: To je 16-bitni registar. Sadrži bitove koji omogućuju PWM izlaze 0-6 i za svaki izlaz odabiru kontrolu s jednim ili dvostrukim rubom.
|
31:15 |
14: 9 |
8: 7 |
6: 2 |
1: 0 |
|
NEKORIŠTENO |
PWMENA6-PWMENA1 |
NEKORIŠTENO |
PWMSEL6-PWMSEL2 |
NEKORIŠTENO |
- PWMSELx (x: 2 do 6)
- Jednokraki način rada za PWMx
- 1- Način dvostrukog ruba za PWMx.
- PWMENAx (x: 1 do 6)
- PWMx onemogućen.
- 1- Omogućen PWMx.
9. PWMLER: Registar za omogućavanje zaključavanja PWM-a
Upotreba: To je 8-bitni registar. Sadrži bitove Match x Latch za svaki Match Match.
|
31: 7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
NEKORIŠTENO |
LEN6 |
LEN5 |
LEN4 |
LEN3 |
LEN2 |
LEN1 |
LEN0 |
LENx (x: 0 do 6):
0- Onemogućite učitavanje novih vrijednosti podudaranja
1- Učitajte nove vrijednosti podudaranja iz (PWMMRx) PWMMatch Registra kad se timer resetira.
Sada započinjemo s izradom hardverskih postavki za demonstraciju modulacije širine impulsa u ARM mikrokontroleru.
Komponente potrebne
Hardver
- ARM7-LPC2148 Mikrokontroler
- IC regulatora napona 3.3V
- 10k potenciometar
- LED (bilo koja boja)
- LCD (16x2) modul zaslona
- Breadboard
- Spajanje žica
Softver
- Keil uVision5
- Flash Magic Tool
Kružni dijagram i veze


Veze između LCD-a i ARM7-LPC2148
|
ARM7-LPC2148 |
LCD (16x2) |
|
P0.4 |
RS (odabir registra) |
|
P0.6 |
E (Omogući) |
|
P0.12 |
D4 (podatkovni pin 4) |
|
P0.13 |
D5 (podatkovni pin 5) |
|
P0.14 |
D6 (podatkovni pin 6) |
|
P0.15 |
D7 (podatkovni pin 7) |
|
GND |
VSS, R / W, K |
|
+ 5V |
VDD, A |
Veza između LED i ARM7-LPC2148
ANODE LED-a spojen je na PWM izlaz (P0.0) LPC2148, dok je LED-ov CATHODE pin spojen na GND pin LPC2148.
Veza između ARM7-LPC2148 i potenciometra s regulatorom napona od 3,3 V
|
IC regulatora napona 3.3V |
Funkcija pribadače |
Pribadača ARM-7 LPC2148 |
|
1.Lijeva igla |
- Ve iz GND-a |
GND pribadača |
|
2.Centre Pin |
Regulirani + 3.3V izlaz |
Na potenciometar Ulaz i izlaz potenciometra na P0,28 od LPC2148 |
|
3. Desna pribadača |
+ Ve od 5V ULAZNI |
+ 5V |
Bodovi koje treba zabilježiti
1. Ovdje se koristi regulator napona od 3.3V za pružanje analogne ulazne vrijednosti ADC pinu (P0.28) LPC2148, a budući da koristimo snagu od 5V, moramo regulirati napon regulatorom napona od 3.3V.
2. Potenciometar se koristi za promjenu napona između (0V do 3,3V) za pružanje analognog ulaza (ADC) na LPC2148 pin P0.28
Programiranje ARM7-LPC2148 za PWM
Za programiranje ARM7-LPC2148 potreban nam je alat keil uVision & Flash Magic. Koristimo USB kabel za programiranje ARM7 Stick putem mikro USB priključka. Napisujemo kod pomoću Keila i stvaramo hex datoteku, a zatim se HEX datoteka bljeska na ARM7 stick pomoću Flash Magic. Da biste saznali više o instaliranju keil uVision i Flash Magic, te kako ih koristiti, slijedite vezu Početak rada s mikrokontrolerom ARM7 LPC2148 i programirajte ga pomoću Keil uVision.
U ovom uputstvu koristit ćemo ADC i PWM tehniku za kontrolu svjetline LED-a. Ovdje se LPC2148 daje analogni ulaz (0 do 3,3 V) putem ADC ulaznog pina P0,28, a zatim se ovaj analogni ulaz pretvara u digitalnu vrijednost (0 do 1023). Tada se ta vrijednost ponovno pretvara u digitalnu vrijednost (0 - 255) jer PWM izlaz LPC2148 ima samo 8-bitnu razlučivost (2 8). LED je spojen na PWM pin P0.0 i svjetlinom LED-a može se upravljati pomoću potenciometra. Da biste saznali više o ADC-u u ARM7-LPC2148, slijedite vezu.
Koraci uključeni u programiranje LPC2148 za PWM i ADC
Korak 1: - Prva stvar je konfiguriranje PLL-a za generiranje takta jer postavlja sistemski sat i periferni sat LPC2148 prema potrebi programera. Maksimalna taktna frekvencija za LPC2148 je 60 MHz. Sljedeći se redovi koriste za konfiguriranje generiranja PLL sata.
void InitilizePLL (void) // Funkcija za korištenje PLL-a za generiranje sata { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; dok (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Korak 2: - Sljedeća stvar je odabir PWM pinova i PWM funkcije LPC2148 pomoću registra PINSEL. Koristimo PINSEL0 kao što koristimo P0.0 za PWM izlaz LPC2148.
PINSEL0 = 0x00000002; // Postavni pin P0.0 za PWM izlaz
Korak 3: - Dalje trebamo RESETIRATI mjerače vremena pomoću PWMTCR (Timer Control Register).
PWMTCR = (1 << 1); // Postavljanje registra PWM tajmera kao resetiranje brojača
A zatim postavite vrijednost predskale koja određuje razlučivost PWM-a. Postavljam na nulu
PWMPR = 0X00; // Postavljanje vrijednosti pred skale PWM-a
Korak 4: - Dalje moramo postaviti PWMMCR (PWM registar kontrole podudaranja) jer postavlja radnju poput resetiranja, prekida za PWMMR0.
PWMMCR = (1 << 0) - (1 << 1); // Postavljanje registra kontrole podudaranja PWM
Korak 5: - Maksimalno razdoblje PWM kanala postavlja se pomoću PWMMR.
PWMMR0 = PWMvrijednost; // Davanje PWM vrijednosti Maksimalna vrijednost
U našem slučaju maksimalna vrijednost je 255 (za maksimalnu svjetlinu)
Korak 6: - Dalje moramo postaviti Omogući zaključavanje na odgovarajuće registre podudaranja pomoću PWMLER-a
PWMLER = (1 << 0); // zasun za PWM Enalbe
(Koristimo PWMMR0) Dakle, omogućite odgovarajući bit postavljanjem 1 u PWMLER
Korak 7: - Da bismo omogućili PWM izlaz na pin, moramo koristiti PWMTCR za omogućavanje PWM brojača i PWM načina.
PWMTCR = (1 << 0) - (1 << 3); // Omogućavanje PWM i PWM brojača
Korak 8: - Sada moramo dobiti vrijednosti potenciometra za podešavanje radnog ciklusa PWM iz ADC pina P0.28. Dakle, koristimo ADC modul u LPC2148 za pretvaranje analognog ulaza potenciometara (0 do 3,3 V) u vrijednosti ADC (0 do 1023).
Ovdje pretvaramo vrijednosti od 0-1023 u 0-255 dijeljenjem s 4 jer PWM LPC2148 ima 8-bitnu razlučivost (2 8).
Korak 9: - Za odabir ADC pina P0.28 u LPC2148 koristimo
PINSEL1 = 0x01000000; // Postavljanje P0.28 kao ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // Postavljanje sata i PDN-a za A / D pretvorbu
Sljedeći redovi zahvaćaju analogni ulaz (0 do 3,3 V) i pretvaraju ga u digitalnu vrijednost (0 do 1023). A zatim se ove digitalne vrijednosti dijele s 4 da bi se pretvorile u (0 do 255) i napokon napajale kao PWM izlaz u P0.0 pinu LPC2148 na koji je spojena LED.
AD0CR - = (1 << 1); // Odaberite AD0.1 kanal u vremenu kašnjenja registra ADC (10); AD0CR - = (1 << 24); // Pokreni A / D pretvorbu while ((AD0DR1 & (1 << 31)) == 0); // Provjerite GOTOVO bit u ADC registru podataka adcvalue = (AD0DR1 >> 6) & 0x3ff; // Dobivanje REZULTATA iz ADC registra podataka dutycycle = adcvalue / 4; // formula za dobivanje vrijednosti radnog ciklusa od (0 do 255) PWMMR1 = radni ciklus; // postavimo vrijednost radnog ciklusa na PWM registar podudaranja PWMLER - = (1 << 1); // Omogući PWM izlaz s vrijednošću radnog ciklusa
Korak 10: - Sljedeće vrijednosti prikazujemo u modulu LCD (16X2). Stoga dodajemo sljedeće redove za inicijalizaciju modula LCD zaslona
Void LCD_INITILIZE (void) // Funkcija pripreme LCD-a { IO0DIR = 0x0000FFF0; // postavlja pin P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 kao IZLAZNO vrijeme odgode (20); LCD_SEND (0x02); // Inicijalizirajte lcd u 4-bitnom načinu rada LCD_SEND (0x28); // 2 retka (16X2) LCD_SEND (0x0C); // Prikaz na pokazivaču isključen LCD_SEND (0x06); // Kursor za automatsko povećanje LCD_SEND (0x01); // Prikažite jasan LCD_SEND (0x80); // Prva pozicija prvog retka }
Kako smo LCD u 4-bitnom načinu povezali s LPC2148, trebamo slati vrijednosti koje će se prikazivati grickajući po grickanje (gornji grickač i donji grickač). Dakle, koriste se sljedeći redovi.
void LCD_DISPLAY (char * msg) // Funkcija ispisa jednog po jednog poslanog znaka { uint8_t i = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // šalje gornji grickanje IO0SET = 0x00000050; // RS HIGH & Omogući HIGH za ispis podataka IO0CLR = 0x00000020; // RW LOW način zakašnjenja u načinu pisanja (2); IO0CLR = 0x00000040; // EN = 0, RS i RW nepromijenjeni (tj. RS = 1, RW = 0) vrijeme odgode (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // šalje donji grickanje IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; vrijeme odgode (2); IO0CLR = 0x00000040; vrijeme odgode (5); i ++; } }
Za prikaz tih vrijednosti ADC i PWM koristimo sljedeće redove u funkciji int main () .
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", adcvalue); LCD_DISPLAY (displayadc); // Prikaži ADC vrijednost (0 do 1023) LCD_SEND (0xC0); sprintf (izlazni izlaz, "PWM OP =%. 2f", svjetlina); LCD_DISPLAY (izlazni izlaz); // Prikazivanje vrijednosti radnog ciklusa od (0 do 255)

Kompletni kôd i video opis vodiča dati su u nastavku.
