- PWM (pulsbreddemodulation)
- PWM-stifter i ARM7-LPC2148
- PWM registrerer sig i ARM7-LPC2148
- Komponenter, der kræves
- Kredsløbsdiagram og forbindelser
- Programmering ARM7-LPC2148 til PWM
- Trin involveret i programmering af LPC2148 til PWM & ADC
Som vi ved, tager mikrocontrollere analog indgang fra analoge sensorer og bruger ADC (Analog til digital konverter) til at behandle disse signaler. Men hvad nu hvis en mikrocontroller ønsker at producere et analogt signal til at styre analoge styrede enheder som en servomotor, jævnstrømsmotor osv.? Mikrocontrollere producerer ikke udgangsspænding som 1V, 5V i stedet for de bruger en teknik kaldet PWM til drift af analoge enheder. Et eksempel på PWM er vores bærbare køleventilator (DC-motor), som skal styres hastigt i henhold til temperaturen, og det samme implementeres ved hjælp af PWM- teknik (Pulse Width Modulation) i bundkort.
I denne vejledning styrer vi lysstyrken på en LED ved hjælp af PWM i ARM7-LPC2148 mikrokontroller.
PWM (pulsbreddemodulation)
PWM er en god måde at styre de analoge enheder ved hjælp af digital værdi som at kontrollere motorens hastighed, lysstyrke på en led osv. Selvom PWM ikke giver ren analog output, men det genererer anstændige analoge impulser til at styre de analoge enheder. PWM modulerer faktisk bredden af en rektangulær pulsbølge for at få en variation i gennemsnitsværdien af den resulterende bølge.
PWM's driftscyklus
Den procentdel af tid, hvor PWM-signalet forbliver HØJ (til tiden) kaldes som driftscyklus. Hvis signalet altid er TIL, er det i 100% driftscyklus, og hvis det altid er slukket, er det 0% driftscyklus.
Arbejdscyklus = Tænd tid / (Tænd tid + Sluk tid)
PWM-stifter i ARM7-LPC2148
Billedet nedenfor viser PWM-udgangsstifterne på ARM7-LPC2148. Der er i alt seks ben til PWM.
PWM-kanal |
LPC2148 Port Pins |
PWM1 |
P0.0 |
PWM2 |
P0.7 |
PWM3 |
P0.1 |
PWM4 |
P0.8 |
PWM5 |
P0.21 |
PWM6 |
P0.9 |
PWM registrerer sig i ARM7-LPC2148
Før vi går ind i vores projekt, skal vi vide om PWM-registre i LPC2148.
Her er listen over registre, der bruges i LPC2148 til PWM
1. PWMPR: PWM Prescale Register
Brug: Det er et 32-bit register. Den indeholder antallet af gange (minus 1), som PCLK skal cykle, før PWM-timertælleren inkrementeres (Den indeholder faktisk den maksimale værdi af prescale-tæller).
2. PWMPC: PWM Prescaler-tæller
Brug: Det er et 32-bit register . Den indeholder den stigende tællerværdi. Når denne værdi er lig med PR-værdien plus 1, øges PWM-timertælleren (TC).
3. PWMTCR: PWM Timer Control Register
Anvendelse: Den indeholder Counter Enable, Counter Reset og PWM Enable kontrolbits. Det er et 8-bit register.
7: 4 |
3 |
2 |
1 |
0 |
RESERVERET |
PWM AKTIVERET |
RESERVERET |
TÆLLER NULSTIL |
TÆLLER AKTIVERET |
- PWM Enable: (Bit-3)
0- PWM deaktiveret
1- PWM aktiveret
- Counter Enable: (Bit-0)
0- Deaktiver tællere
1- Aktivér tæller
- Nulstilling af tæller: (Bit-1)
0- Gør ikke noget.
1- Nulstiller PWMTC & PWMPC på positiv kant af PCLK.
4. PWMTC: PWM- timertæller
Brug: Det er et 32-bit register. Den indeholder den aktuelle værdi af den stigende PWM-timer. Når Prescaler Counter (PC) når Prescaler Register (PR) -værdien plus 1, øges denne tæller.
5. PWMIR: PWM Interrupt Register
Anvendelse: Det er et 16-bit register. Den indeholder afbrydelsesflag for PWM Match Channels 0-6. Et afbrydelsesflag indstilles, når der opstår et afbrydelse for den kanal (MRx Interrupt), hvor X er kanalnummeret (0 til 6).
6. PWMMR0-PWMMR6: PWM Match Register
Brug: Det er et 32-bit register . Faktisk giver Match Channel-gruppen mulighed for at indstille 6 single-edge-kontrollerede eller 3 double-edge-kontrollerede PWM-udgange. Du kan ændre de syv matchkanaler for at konfigurere disse PWM-udgange, så de passer til dine krav i PWMPCR.
7. PWMMCR: PWM Match Control Register
Brug: Det er et 32-bit register. Den indeholder bitene Interrupt, Reset og Stop, der styrer den valgte Match Channel. En match forekommer mellem PWM-matchregistrene og PWM-timertællerne.
31:21 |
20 |
19 |
18 |
.. |
5 |
4 |
3 |
2 |
1 |
0 |
RESERVERET |
PWMMR6S |
PWMMR6R |
PWMMR6I |
.. |
PWMMR1S |
PWMMR1R |
PWMMR11 |
PWMMR0S |
PWMMR0R |
PWMMR01 |
Her er x fra 0 til 6
- PWMMRxI (Bit-0)
AKTIVER ELLER Deaktiver PWM-afbrydelser
0- Deaktiver PWM Match-afbrydelser.
1- Aktiver PWM Match-afbrydelse.
- PWMMRxR: (Bit-1)
RESET PWMTC - Timertællerværdi, når den matcher PWMRx
0- Gør intet.
1- Nulstiller PWMTC.
- PWMMRxS: (Bit 2)
STOP PWMTC & PWMPC, når PWMTC når Match-registerværdien
0- Deaktiver PWM-stopfunktionen.
1- Aktiver PWM Stop-funktionen.
8. PWMPCR: PWM-kontrolregister
Brug: Det er et 16-bit register. Den indeholder de bits, der muliggør PWM-udgange 0-6 og vælger enkelt- eller dobbeltkantkontrol for hver udgang.
31:15 |
14: 9 |
8: 7 |
6: 2 |
1: 0 |
UBRUGT |
PWMENA6-PWMENA1 |
UBRUGT |
PWMSEL6-PWMSEL2 |
UBRUGT |
- PWMSELx (x: 2 til 6)
- Single Edge-tilstand til PWMx
- 1- Double Edge Mode til PWMx.
- PWMENAx (x: 1 til 6)
- PWMx Deaktiver.
- 1- PWMx aktiveret.
9. PWMLER: PWM Latch Enable Register
Anvendelse: Det er et 8-bit register. Den indeholder Match x Latch bits for hver Match Channel.
31: 7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
UBRUGT |
LEN6 |
LEN5 |
LEN4 |
LEN3 |
LEN2 |
LEN1 |
LEN0 |
LENx (x: 0 til 6):
0- Deaktiver indlæsningen af nye
matchværdier 1- Indlæs de nye matchværdier fra (PWMMRx) PWMMatch Registrer, når timeren nulstilles.
Lad os nu begynde at opbygge hardwareopsætningen for at demonstrere Pulse Width Modulation i ARM-mikrocontroller.
Komponenter, der kræves
Hardware
- ARM7-LPC2148 Microcontroller
- 3,3 V spændingsregulator IC
- 10k Potentiometer
- LED (enhver farve)
- LCD (16x2) displaymodul
- Brødbræt
- Tilslutning af ledninger
Software
- Keil uVision5
- Flash Magic Tool
Kredsløbsdiagram og forbindelser
Forbindelser mellem LCD og ARM7-LPC2148
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Registrer Vælg) |
P0.6 |
E (Aktiver) |
P0.12 |
D4 (datapind 4) |
P0.13 |
D5 (Data pin 5) |
P0.14 |
D6 (datapind 6) |
P0.15 |
D7 (datapind 7) |
GND |
VSS, R / W, K |
+ 5V |
VDD, A |
Forbindelse mellem LED og ARM7-LPC2148
LED's ANODE er forbundet til PWM-udgangen (P0.0) på LPC2148, mens LED's CATHODE-pin er tilsluttet til GND-stift på LPC2148.
Forbindelse mellem ARM7-LPC2148 og potentiometer med 3,3 V spændingsregulator
3,3 V spændingsregulator IC |
Pin-funktion |
ARM-7 LPC2148 Pin |
1. venstre pin |
- Ve fra GND |
GND-pin |
2. centrum pin |
Reguleret + 3,3 V udgang |
Til potentiometer Input og potentiometer's output til P0.28 i LPC2148 |
3. højre pin |
+ Ve fra 5V INDGANG |
+ 5V |
Punkter, der skal bemærkes
1. En spændingsregulator på 3,3 V bruges her til at give den analoge indgangsværdi til ADC-stiften (P0.28) på LPC2148, og fordi vi bruger 5 V strøm, er vi nødt til at regulere spændingen med en spændingsregulator på 3,3 V.
2. Et potentiometer bruges til at variere spændingen mellem (0V til 3,3V) for at levere analog indgang (ADC) til LPC2148 pin P0.28
Programmering ARM7-LPC2148 til PWM
For at programmere ARM7-LPC2148 har vi brug for keil uVision & Flash Magic værktøj. Vi bruger USB-kabel til at programmere ARM7 Stick via mikro-USB-port. Vi skriver kode ved hjælp af Keil og opretter en hex-fil, og derefter blinkes HEX-filen til ARM7-stick ved hjælp af Flash Magic. Hvis du vil vide mere om installation af keil uVision og Flash Magic, og hvordan du bruger dem, skal du følge linket Kom godt i gang med ARM7 LPC2148 Microcontroller og programmer det ved hjælp af Keil uVision.
I denne vejledning bruger vi ADC og PWM-teknik til at kontrollere lysstyrken på LED'en. Her får LPC2148 analog indgang (0 til 3,3 V) via ADC-indgangsstift P0.28, så konverteres denne analoge indgang til digital værdi (0 til 1023). Derefter konverteres denne værdi igen til digital værdi (0 - 255), da PWM-output på LPC2148 kun har 8-bit opløsning (2 8). LED tilsluttes PWM pin P0.0, og lysstyrken på LED kan styres ved hjælp af potentiometeret. For at vide mere om ADC i ARM7-LPC2148, følg linket.
Trin involveret i programmering af LPC2148 til PWM & ADC
Trin 1: - Den allerførste ting er at konfigurere PLL til urgenerering, da den indstiller systemuret og det perifere ur på LPC2148 efter programmeringens behov. Den maksimale urfrekvens for LPC2148 er 60 MHz. Følgende linjer bruges til at konfigurere PLL-urgenerering.
ugyldigt initilizePLL (ugyldigt) // Funktion til brug af PLL til urgenerering { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; mens (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Trin 2: - Næste ting er at vælge PWM-ben og PWM-funktion af LPC2148 ved hjælp af PINSEL-register. Vi bruger PINSEL0, som vi bruger P0.0 til PWM-output på LPC2148.
PINSEL0 = 0x00000002; // Indstillingsstift P0.0 til PWM-udgang
Trin 3: - Dernæst skal vi NULSTILLE timerne ved hjælp af PWMTCR (Timer Control Register).
PWMTCR = (1 << 1); // Indstilling af PWM-timerstyring Registrer som nulstilling
Indstil derefter den forudskalningsværdi, der bestemmer opløsningen af PWM. Jeg sætter det til nul
PWMPR = 0X00; // Indstilling af PWM-forskalningsværdi
Trin 4: - Dernæst skal vi indstille PWMMCR (PWM match control register), da det indstiller operation som reset, afbryder for PWMMR0.
PWMMCR = (1 << 0) - (1 << 1); // Indstilling af PWM Match Control Register
Trin 5: - Den maksimale periode for PWM-kanalen indstilles ved hjælp af PWMMR.
PWMMR0 = PWMværdi; // Giv PWM-værdi Maksimal værdi
I vores tilfælde er den maksimale værdi 255 (for maksimal lysstyrke)
Trin 6: - Derefter skal vi indstille Latch Enable til de tilsvarende matchregistre ved hjælp af PWMLER
PWMLER = (1 << 0); // Enalbe PWM-lås
(Vi bruger PWMMR0) Så aktiver den tilsvarende bit ved at indstille 1 i PWMLER
Trin 7: - For at aktivere PWM-output til stiften skal vi bruge PWMTCR til at aktivere PWM-timertællere og PWM-tilstande.
PWMTCR = (1 << 0) - (1 << 3); // Aktivering af PWM- og PWM-tæller
Trin 8: - Nu skal vi hente potentiometerværdierne til indstilling af PWM's driftscyklus fra ADC-pin P0.28. Så vi bruger ADC-modul i LPC2148 til at konvertere potentiometre analog input (0 til 3,3 V) til ADC-værdier (0 til 1023).
Her konverterer vi værdierne fra 0-1023 til 0-255 ved at dividere den med 4, da PWM af LPC2148 har 8-bit opløsning (2 8).
Trin 9: - Til valg af ADC pin P0.28 i LPC2148, bruger vi
PINSEL1 = 0x01000000; // Indstilling af P0.28 som ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // Indstilling af ur og PDN til A / D-konvertering
Følgende linjer fanger den analoge indgang (0 til 3,3 V) og konverterer den til digital værdi (0 til 1023). Og så deles disse digitale værdier med 4 for at konvertere dem til (0 til 255) og til sidst tilføres som PWM-output i P0.0-pin i LPC2148, som LED'en er tilsluttet.
AD0CR - = (1 << 1); // Vælg AD0.1-kanal i ADC-registerets forsinkelsestid (10); AD0CR - = (1 << 24); // Start A / D-konvertering mens ((AD0DR1 & (1 << 31)) == 0); // Kontroller DONE bit i ADC Data register adcvalue = (AD0DR1 >> 6) & 0x3ff; // Få RESULTATET fra ADC-dataregisteret dutycycle = adcvalue / 4; // formel for at få dutycycle-værdier fra (0 til 255) PWMMR1 = dutycycle; // indstil dutycycle-værdi til PWM- matchregister PWMLER - = (1 << 1); // Aktiver PWM-output med dutycykelværdi
Trin 10: - Dernæst viser vi disse værdier i LCD-modulet (16X2). Så vi tilføjer følgende linjer for at initialisere LCD-displaymodulet
Ugyldig LCD_INITILIZE (ugyldig) // Funktion for at gøre klar LCD { IO0DIR = 0x0000FFF0; // Indstiller pin P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 som OUTPUT forsinkelsestid (20); LCD_SEND (0x02); // Initialiser lcd i 4-bit driftstilstand LCD_SEND (0x28); // 2 linjer (16X2) LCD_SEND (0x0C); // Vis på markør fra LCD_SEND (0x06); // Auto stigning markør LCD_SEND (0x01); // Vis klar LCD_SEND (0x80); // Første linje første position }
Da vi forbandt LCD i 4-bit tilstand med LPC2148, skal vi sende værdier, der skal vises som nibble for nibble (Upper Nibble & Lower Nibble). Så følgende linjer bruges.
ugyldigt LCD_DISPLAY (char * msg) // Funktion til at udskrive de tegn, der sendes en efter en { uint8_t i = 0; mens (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Sender øvre nibble IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH for at udskrive data IO0CLR = 0x00000020; // RW LOW Skriveforsinkelsestid (2); IO0CLR = 0x00000040; // EN = 0, RS og RW uændret (dvs. RS = 1, RW = 0) forsinkelsestid (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Sender nedre nibble IO0SET = 0x00000050; // RS & EN HØJ IO0CLR = 0x00000020; forsinkelsestid (2); IO0CLR = 0x00000040; forsinkelsestid (5); i ++; } }
For at vise disse ADC & PWM-værdier bruger vi følgende linjer i int main () -funktionen.
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", adcvalue); LCD_DISPLAY (displayadc); // Vis ADC-værdi (0 til 1023) LCD_SEND (0xC0); sprintf (ledoutput, "PWM OP =%. 2f", lysstyrke); LCD_DISPLAY (ledoutput); // Vis arbejdscyklusværdier fra (0 til 255)
Komplet kode og videobeskrivelse af vejledningen er angivet nedenfor.