- PWM (pulsbreddemodulering)
- PWM-pinner i ARM7-LPC2148
- PWM registrerer seg i ARM7-LPC2148
- Komponenter kreves
- Kretsdiagram og tilkoblinger
- Programmering ARM7-LPC2148 for PWM
- Fremgangsmåte involvert i programmering av LPC2148 for PWM og ADC
Som vi vet tar mikrokontrollere analoge innganger fra analoge sensorer og bruker ADC (Analog til Digital omformer) for å behandle disse signalene. Men hva om en mikrokontroller vil produsere et analogt signal for å kontrollere analoge drevne enheter som en servomotor, DC-motor osv.? Mikrokontrollere produserer ikke utgangsspenning som 1V, 5V, i stedet bruker de en teknikk som kalles PWM for drift av analoge enheter. Et eksempel på PWM er den kjøleviften (DC-motoren) til den bærbare datamaskinen som må hastighetsstyres i henhold til temperaturen, og det samme implementeres ved hjelp av PWM- teknikken (Pulse Width Modulation) i hovedkort.
I denne opplæringen vil vi kontrollere lysstyrken til en LED ved hjelp av PWM i ARM7-LPC2148 mikrokontroller.
PWM (pulsbreddemodulering)
PWM er en god måte å kontrollere de analoge enhetene ved å bruke digital verdi som å kontrollere motorens hastighet, lysstyrken til en ledd osv. Selv om PWM ikke gir ren analog utgang, men det genererer anstendige analoge pulser for å kontrollere de analoge enhetene. PWM modulerer faktisk bredden på en rektangulær pulsbølge for å få en variasjon i gjennomsnittsverdien til den resulterende bølgen.
Driftssyklus for PWM
Prosentandelen av tid PWM-signalet forblir HØY (i tide) kalles som driftssyklus. Hvis signalet alltid er PÅ, er det i 100% driftssyklus, og hvis det alltid er av, er det 0% driftssyklus.
Driftssyklus = Slå på tid / (Slå på tid + slå av tid)
PWM-pinner i ARM7-LPC2148
Bildet nedenfor viser PWM-utgangspinnene til ARM7-LPC2148. Det er totalt seks pinner for 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 seg i ARM7-LPC2148
Før vi går inn i prosjektet vårt, må vi vite om PWM-registrene i LPC2148.
Her er listen over registre som brukes i LPC2148 for PWM
1. PWMPR: PWM Prescale Register
Bruk: Det er et 32-biters register. Den inneholder antall ganger (minus 1) PCLK må sykle før du øker PWM-timer-telleren (den inneholder faktisk maksimal verdi for forhåndsskaleringsteller).
2. PWMPC: PWM Prescaler-teller
Bruk: Det er et 32-biters register . Den inneholder den økende motverdien. Når denne verdien er lik PR-verdien pluss 1, økes PWM Timer Counter (TC).
3. PWMTCR: PWM Timer Control Register
Bruk: Den inneholder Counter Enable, Counter Reset og PWM Enable control bits. Det er et 8-biters register.
7: 4 |
3 |
2 |
1 |
0 |
RESERVERT |
PWM AKTIVERT |
RESERVERT |
TILBAKESTILLING |
TELLER AKTIVERT |
- PWM Enable: (Bit-3)
0- PWM deaktivert
1- PWM aktivert
- Aktivering av teller: (Bit-0)
0- Deaktiver tellere
1- Aktiver teller
- Tilbakestilling av teller: (Bit-1)
0- Gjør ingenting.
1- Tilbakestiller PWMTC og PWMPC på positiv kant av PCLK.
4. PWMTC: PWM Timer Counter
Bruk: Det er et 32-biters register. Den inneholder gjeldende verdi av den økende PWM-timeren. Når Prescaler Counter (PC) når Prescaler Register (PR) -verdien pluss 1, økes denne telleren.
5. PWMIR: PWM Interrupt Register
Bruk: Det er et 16-biters register. Den inneholder avbruddsflaggene for PWM Match Channels 0-6. Et avbruddsflagg settes når det oppstår et avbrudd for den kanalen (MRx Interrupt) der X er kanalnummeret (0 til 6).
6. PWMMR0-PWMMR6: PWM Match Register
Bruk: Det er et 32-biters register . Match Channel-gruppen tillater faktisk å sette 6 ensidige eller 3 dobbeltsidige PWM-utganger. Du kan endre de syv matchkanalene for å konfigurere disse PWM-utgangene for å dekke dine behov i PWMPCR.
7. PWMMCR: PWM Match Control Register
Bruk: Det er et 32-biters register. Den inneholder bitene Interrupt, Reset og Stop som kontrollerer den valgte Match Channel. Det samsvarer mellom PWM-kampregistrene og PWM-timer-tellere.
31:21 |
20 |
19 |
18 |
.. |
5 |
4 |
3 |
2 |
1 |
0 |
RESERVERT |
PWMMR6S |
PWMMR6R |
PWMMR6I |
.. |
PWMMR1S |
PWMMR1R |
PWMMR11 |
PWMMR0S |
PWMMR0R |
PWMMR01 |
Her er x fra 0 til 6
- PWMMRxI (Bit-0)
AKTIVER ELLER Deaktiver PWM-avbrudd
0- Deaktiver PWM Match-avbrudd.
1- Aktiver avbrudd i PWM-kamp.
- PWMMRxR: (Bit-1)
RESET PWMTC - Tellerverdien når den samsvarer med PWMRx
0- Gjør ingenting.
1- Tilbakestiller PWMTC.
- PWMMRxS: (bit 2)
STOPP PWMTC & PWMPC når PWMTC når Match-registerverdien
0- Deaktiver PWM-stoppfunksjonen.
1- Aktiver PWM Stop-funksjonen.
8. PWMPCR: PWM-kontrollregister
Bruk: Det er et 16-biters register. Den inneholder bitene som aktiverer PWM-utganger 0-6 og velger enkel- eller dobbeltkantkontroll for hver utgang.
31:15 |
14: 9 |
8: 7 |
6: 2 |
1: 0 |
UBRUKT |
PWMENA6-PWMENA1 |
UBRUKT |
PWMSEL6-PWMSEL2 |
UBRUKT |
- PWMSELx (x: 2 til 6)
- Single Edge-modus for PWMx
- 1- Dobbel kantmodus for PWMx.
- PWMENAx (x: 1 til 6)
- PWMx Deaktiver.
- 1- PWMx aktivert.
9. PWMLER: PWM Latch Enable Register
Bruk: Det er et 8-biters register. Den inneholder Match x Latch bits for hver Match Channel.
31: 7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
UBRUKT |
LEN6 |
LEN5 |
LEN4 |
LEN3 |
LEN2 |
LEN1 |
LEN0 |
LENx (x: 0 til 6):
0- Deaktiver innlasting av nye
matchverdier 1- Last de nye matchverdiene fra (PWMMRx) PWMMatch Registrer når timeren tilbakestilles.
Nå kan vi begynne å bygge maskinvareoppsettet for å demonstrere Pulse Width Modulation i ARM-mikrokontroller.
Komponenter kreves
Maskinvare
- ARM7-LPC2148 mikrokontroller
- 3,3V spenningsregulator IC
- 10k potensiometer
- LED (hvilken som helst farge)
- LCD (16x2) skjermmodul
- Brettbrett
- Koble ledninger
Programvare
- Keil uVision5
- Flash Magic Tool
Kretsdiagram og tilkoblinger
Forbindelser mellom LCD og ARM7-LPC2148
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Register Select) |
P0.6 |
E (Aktiver) |
P0.12 |
D4 (datapinne 4) |
P0.13 |
D5 (datapinne 5) |
P0.14 |
D6 (datapinne 6) |
P0.15 |
D7 (datapinne 7) |
GND |
VSS, R / W, K |
+ 5V |
VDD, A |
Forbindelse mellom LED og ARM7-LPC2148
LEDs ANODE er koblet til PWM-utgangen (P0.0) på LPC2148, mens LEDs CATHODE-pin er koblet til GND-stift på LPC2148.
Forbindelse mellom ARM7-LPC2148 og potensiometer med 3,3V spenningsregulator
3,3V spenningsregulator IC |
Pin-funksjon |
ARM-7 LPC2148 Pin |
1. venstre pin |
- Ve fra GND |
GND-pinne |
2. sentrum pin |
Regulert + 3.3V utgang |
Til potensiometer Inngang og potensiometer utgang til P0.28 i LPC2148 |
3. høyre pin |
+ Ve fra 5V INNGANG |
+ 5V |
Poeng å merke seg
1. En spenningsregulator på 3,3 V brukes her for å gi analog inngangsverdi til ADC-pinnen (P0.28) på LPC2148, og fordi vi bruker 5V strøm, må vi regulere spenningen med en spenningsregulator på 3,3V.
2. Et potensiometer brukes til å variere spenningen mellom (0V til 3,3V) for å gi analog inngang (ADC) til LPC2148 pin P0.28
Programmering ARM7-LPC2148 for PWM
For å programmere ARM7-LPC2148 trenger vi keil uVision & Flash Magic verktøy. Vi bruker USB-kabel til å programmere ARM7 Stick via mikro-USB-port. Vi skriver kode ved hjelp av Keil og lager en hex-fil, og deretter blinkes HEX-filen til ARM7-pinne ved hjelp av Flash Magic. Hvis du vil vite mer om å installere keil uVision og Flash Magic og hvordan du bruker dem, kan du følge lenken Komme i gang med ARM7 LPC2148 Microcontroller og programmere den ved hjelp av Keil uVision.
I denne opplæringen vil vi bruke ADC og PWM-teknikk for å kontrollere lysstyrken på LED-en. Her får LPC2148 analog inngang (0 til 3,3 V) via ADC-inngangspinne P0.28, deretter konverteres denne analoge inngangen til digital verdi (0 til 1023). Deretter blir denne verdien igjen konvertert til digital verdi (0 - 255) da PWM-utgang på LPC2148 bare har 8-biters oppløsning (2 8). LED er koblet til PWM-pinne P0.0, og lysstyrken på LED-en kan styres ved hjelp av potensiometeret. For å vite mer om ADC i ARM7-LPC2148, følg lenken.
Fremgangsmåte involvert i programmering av LPC2148 for PWM og ADC
Trinn 1: - Det aller første er å konfigurere PLL for klokkegenerering når den stiller inn systemklokken og den perifere klokken til LPC2148 etter hvert som programmerere trenger. Maksimal klokkefrekvens for LPC2148 er 60Mhz. Følgende linjer brukes til å konfigurere PLL-klokkegenerering.
void initilizePLL (void) // Funksjon for å bruke PLL for klokkegenerering { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; mens (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Trinn 2: - Neste ting er å velge PWM-pinner og PWM-funksjonen til LPC2148 ved å bruke PINSEL-registeret. Vi bruker PINSEL0 som vi bruker P0.0 for PWM-utgang fra LPC2148.
PINSEL0 = 0x00000002; // Innstillingsstift P0.0 for PWM-utgang
Trinn 3: - Neste må vi NULLSTILL timerne ved hjelp av PWMTCR (Timer Control Register).
PWMTCR = (1 << 1); // Stille inn PWM Timer Control Registrer som tilbakestilling av teller
Og sett deretter forhåndsskalaverdien som bestemmer oppløsningen til PWM. Jeg setter den til null
PWMPR = 0X00; // Innstilling av PWM-forhåndsskalaverdi
Trinn 4: - Neste må vi sette PWMMCR (PWM match control register) når det setter drift som reset, avbryter for PWMMR0.
PWMMCR = (1 << 0) - (1 << 1); // Stille inn PWM Match Control Register
Trinn 5: - Maksimumsperioden for PWM-kanalen stilles inn ved bruk av PWMMR.
PWMMR0 = PWMverdi; // Gi PWM-verdi Maksimal verdi
I vårt tilfelle er maksimumsverdien 255 (for maksimal lysstyrke)
Trinn 6: - Deretter må vi sette Latch Enable til de tilsvarende kampregistrene ved hjelp av PWMLER
PWMLER = (1 << 0); // Enalbe PWM-sperre
(Vi bruker PWMMR0) Så aktiver den tilsvarende biten ved å sette 1 i PWMLER
Trinn 7: - For å aktivere PWM-utgangen til pinnen, må vi bruke PWMTCR for å aktivere PWM Timer-tellere og PWM-modus.
PWMTCR = (1 << 0) - (1 << 3); // Aktivere PWM- og PWM-teller
Trinn 8: - Nå må vi hente potensiometerverdiene for å stille PWM-driftssyklus fra ADC-pinne P0.28. Så vi bruker ADC-modulen i LPC2148 for å konvertere potensiometre analog inngang (0 til 3,3 V) til ADC-verdiene (0 til 1023).
Her konverterer vi verdiene fra 0-1023 til 0-255 ved å dele den med 4 da PWM på LPC2148 har 8-biters oppløsning (2 8).
Trinn 9: - For å velge ADC-pinne P0.28 i LPC2148, bruker vi
PINSEL1 = 0x01000000; // Innstilling av P0.28 som ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // Innstilling av klokke og PDN for A / D-konvertering
Følgende linjer fanger den analoge inngangen (0 til 3,3 V) og konverterer den til digital verdi (0 til 1023). Og så deles disse digitale verdiene med 4 for å konvertere dem til (0 til 255) og til slutt mates som PWM-utgang i P0.0-pinnen på LPC2148 som LED-en er koblet til.
AD0CR - = (1 << 1); // Velg AD0.1-kanal i ADC-registerforsinkelsestid (10); AD0CR - = (1 << 24); // Start A / D-konvertering mens ((AD0DR1 & (1 << 31)) == 0); // Sjekk FERDIG bit i ADC Data register adcvalue = (AD0DR1 >> 6) & 0x3ff; // Få RESULTATET fra ADC-dataregisteret dutycycle = adcvalue / 4; // formel for å få dutycycle-verdier fra (0 til 255) PWMMR1 = dutycycle; // sett tollsyklusverdi til PWM matchregister PWMLER - = (1 << 1); // Aktiver PWM-utgang med dutyycle-verdi
Trinn 10: - Neste viser vi disse verdiene i LCD-modulen (16X2). Så vi legger til følgende linjer for å initialisere LCD-skjermmodulen
Ugyldig LCD_INITILIZE (ugyldig) // Funksjon for å gjøre klar LCD-skjermen { IO0DIR = 0x0000FFF0; // Stiller pin P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 som UTGANG forsinkelsestid (20); LCD_SEND (0x02); // Initier lcd i 4-biters modus LCD_SEND (0x28); // 2 linjer (16X2) LCD_SEND (0x0C); // Vis på markøren av LCD_SEND (0x06); // Automatisk økningsmarkør LCD_SEND (0x01); // Vis klar LCD_SEND (0x80); // Første linje førsteplass }
Da vi koblet LCD i 4-biters modus med LPC2148, må vi sende verdier som skal vises som nibble for nibble (Upper Nibble & Lower Nibble). Så følgende linjer brukes.
ugyldig LCD_DISPLAY (char * msg) // Funksjon for å skrive ut tegnene som sendes en etter en { uint8_t i = 0; mens (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Sender Upper nibble IO0SET = 0x00000050; // RS HIGH & AKTIVER HIGH for å skrive ut data IO0CLR = 0x00000020; // RW LOW Skrivemodus forsinkelsestid (2); IO0CLR = 0x00000040; // EN = 0, RS og RW uendret (dvs. RS = 1, RW = 0) forsinkelsestid (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Sender nedre knabb IO0SET = 0x00000050; // RS & EN HØY IO0CLR = 0x00000020; forsinkelsestid (2); IO0CLR = 0x00000040; forsinkelsestid (5); i ++; } }
For å vise disse ADC- og PWM-verdiene bruker vi følgende linjer i int main () -funksjonen.
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", adcvalue); LCD_DISPLAY (displayadc); // Vis ADC-verdi (0 til 1023) LCD_SEND (0xC0); sprintf (ledoutput, "PWM OP =%. 2f", lysstyrke); LCD_DISPLAY (ledoutput); // Vis verdier for belastningssyklus fra (0 til 255)
Fullstendig kode og videobeskrivelse av opplæringen er gitt nedenfor.