- PWM (pulsbreddsmodulering)
- PWM-stift i ARM7-LPC2148
- PWM registrerar sig i ARM7-LPC2148
- Komponenter krävs
- Kretsschema och anslutningar
- Programmering ARM7-LPC2148 för PWM
- Steg involverade i programmering av LPC2148 för PWM & ADC
Som vi vet tar mikrokontroller analoga ingångar från analoga sensorer och använder ADC (Analog till Digital omvandlare) för att bearbeta dessa signaler. Men vad händer om en mikrokontroller vill producera en analog signal för att styra analoga enheter som en servomotor, likströmsmotor etc.? Mikrokontroller producerar inte utspänning som 1V, 5V istället använder de en teknik som kallas PWM för att driva analoga enheter. Ett exempel på PWM är vår bärbara datorns kylfläkt (DC-motor) som måste hastighetsstyras enligt temperaturen, och detsamma implementeras med hjälp av PWM- teknik (Pulse Width Modulation) i moderkort.
I denna handledning kommer vi att styra ljusstyrkan på en LED med hjälp av PWM i ARM7-LPC2148 mikrokontroller.
PWM (pulsbreddsmodulering)
PWM är ett bra sätt att styra de analoga enheterna med hjälp av digitala värden som att styra motorns hastighet, ljusstyrka hos en lysdiod etc. Även om PWM inte ger ren analog utgång, genererar den anständiga analoga pulser för att styra de analoga enheterna. PWM modulerar faktiskt bredden på en rektangulär pulsvåg för att få en variation i medelvärdet för den resulterande vågen.
PWM: s arbetscykel
Procentandelen tid under vilken PWM-signalen förblir HÖG (i tid) kallas som arbetscykel. Om signalen alltid är PÅ är den i 100% arbetscykel och om den alltid är av är den 0% arbetscykel.
Driftscykel = Slå PÅ-tid / (Slå PÅ-tid + Stäng av tid)
PWM-stift i ARM7-LPC2148
Bilden nedan visar PWM-utgångsstiftet på ARM7-LPC2148. Det finns totalt sex stift för PWM.
PWM-kanal |
LPC2148 Portstift |
PWM1 |
P0.0 |
PWM2 |
P0.7 |
PWM3 |
P0.1 |
PWM4 |
P0.8 |
PWM5 |
P0.21 |
PWM6 |
P0.9 |
PWM registrerar sig i ARM7-LPC2148
Innan vi går in i vårt projekt måste vi veta om PWM-register i LPC2148.
Här är listan över register som används i LPC2148 för PWM
1. PWMPR: PWM förskalregister
Användning: Det är ett 32-bitarsregister. Den innehåller antalet gånger (minus 1) som PCLK måste cykla innan PWM-timerräknaren ökas (den har faktiskt maximalt värde för förskalningsräknare).
2. PWMPC: PWM Prescaler Counter
Användning: Det är ett 32-bitarsregister . Den innehåller det ökande räknarvärdet. När detta värde är lika med PR-värdet plus 1, ökas PWM Timer Counter (TC).
3. PWMTCR: PWM Timer Control Register
Användning: Den innehåller Counter Enable, Counter Reset och PWM Enable control bits. Det är ett 8-bitars register.
7: 4 |
3 |
2 |
1 |
0 |
RESERVERAD |
PWM AKTIVERAD |
RESERVERAD |
RÄKNARE ÅTERSTÄLL |
RÄKNARE AKTIVERAD |
- PWM Aktivera: (Bit-3)
0- PWM inaktiverad
1- PWM aktiverad
- Counter Enable: (Bit-0)
0- Inaktivera räknare
1- Aktivera räknare
- Återställning av räknare: (Bit-1)
0- Gör ingenting.
1- Återställer PWMTC & PWMPC på positiv kant av PCLK.
4. PWMTC: PWM-timerräknare
Användning: Det är ett 32-bitarsregister. Den innehåller det aktuella värdet för den ökande PWM-timern. När Prescaler Counter (PC) når Prescaler Register (PR) -värdet plus 1, ökas denna räknare.
5. PWMIR: PWM-avbrottsregister
Användning: Det är ett 16-bitarsregister. Den innehåller avbrottsflaggorna för PWM Match Channels 0-6. En avbrottsflagga ställs in när ett avbrott inträffar för den kanalen (MRx Interrupt) där X är kanalnumret (0 till 6).
6. PWMMR0-PWMMR6: PWM Match Register
Användning: Det är ett 32-bitarsregister . I själva verket tillåter Match Channel-gruppen att ställa in 6 enkantkontrollerade eller 3 dubbelkantade PWM-utgångar. Du kan ändra de sju matchningskanalerna för att konfigurera dessa PWM-utgångar så att de passar dina krav i PWMPCR.
7. PWMMCR: PWM Match Control Register
Användning: Det är ett 32-bitarsregister. Den innehåller bitarna Interrupt, Reset och Stop som styr den valda matchningskanalen. En matchning sker mellan PWM-matchregistret och PWM-timerräknare.
31:21 |
20 |
19 |
18 |
.. |
5 |
4 |
3 |
2 |
1 |
0 |
RESERVERAD |
PWMMR6S |
PWMMR6R |
PWMMR6I |
.. |
PWMMR1S |
PWMMR1R |
PWMMR11 |
PWMMR0S |
PWMMR0R |
PWMMR01 |
Här är x från 0 till 6
- PWMMRxI (Bit-0)
AKTIVERA eller INAKTIVERA PWM-avbrott
0 - Inaktivera PWM Match-avbrott.
1- Aktivera PWM-matchningsavbrott.
- PWMMRxR: (Bit-1)
RESET PWMTC - Timerräknarvärde när det matchar PWMRx
0- Gör ingenting.
1- Återställer PWMTC.
- PWMMRxS: (Bit 2)
STOPP PWMTC & PWMPC när PWMTC når matchregistrets värde
0 - Inaktivera PWM-stoppfunktionen.
1- Aktivera PWM-stoppfunktionen.
8. PWMPCR: PWM-kontrollregister
Användning: Det är ett 16-bitarsregister. Den innehåller bitarna som möjliggör PWM-utgångar 0-6 och väljer enkel- eller dubbelkantkontroll för varje utgång.
31:15 |
14: 9 |
8: 7 |
6: 2 |
1: 0 |
OANVÄND |
PWMENA6-PWMENA1 |
OANVÄND |
PWMSEL6-PWMSEL2 |
OANVÄND |
- PWMSELx (x: 2 till 6)
- Single Edge-läge för PWMx
- 1 - Dubbelkantläge för PWMx.
- PWMENAx (x: 1 till 6)
- PWMx Inaktivera.
- 1- PWMx aktiverat.
9. PWMLER: PWM Latch Enable Register
Användning: Det är ett 8-bitarsregister. Den innehåller Match x Latch-bitarna för varje Match Channel.
31: 7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
OANVÄND |
LEN6 |
LEN5 |
LEN4 |
LEN3 |
LEN2 |
LEN1 |
LEN0 |
LENx (x: 0 till 6):
0- Inaktivera laddningen av nya matchningsvärden
1- Ladda de nya matchningsvärdena från (PWMMRx) PWMMatch Registrera när timern återställs.
Nu kan vi börja bygga hårdvaruinstallationen för att demonstrera Pulse Width Modulation i ARM-mikrokontroller.
Komponenter krävs
Hårdvara
- ARM7-LPC2148 mikrokontroller
- 3,3 V spänningsregulator IC
- 10k potentiometer
- LED (valfri färg)
- LCD (16x2) displaymodul
- Bakbord
- Anslutande ledningar
programvara
- Keil uVision5
- Flash Magic Tool
Kretsschema och anslutningar
Anslutningar mellan LCD och ARM7-LPC2148
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Registrera Välj) |
P0.6 |
E (Aktivera) |
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 |
Anslutning mellan LED och ARM7-LPC2148
LED: s ANODE är ansluten till PWM-utgången (P0.0) på LPC2148, medan LED: s CATHODE-stift är ansluten till GND-stift på LPC2148.
Anslutning mellan ARM7-LPC2148 och potentiometer med 3,3 V spänningsregulator
3,3 V spänningsregulator IC |
Pin-funktion |
ARM-7 LPC2148 Pin |
1. vänster stift |
- Ve från GND |
GND-stift |
2.Centre Pin |
Reglerad + 3,3 V utgång |
Till potentiometer Ingång och potentiometers utgång till P0.28 i LPC2148 |
3. höger stift |
+ Ve från 5V INMATNING |
+ 5V |
Poäng att notera
1. En spänningsregulator på 3,3V används här för att tillhandahålla ett analogt ingångsvärde till ADC-stiftet (P0.28) på LPC2148 och eftersom vi använder 5V effekt måste vi reglera spänningen med en spänningsregulator på 3,3V.
2. En potentiometer används för att variera spänningen mellan (0V till 3,3V) för att ge analog ingång (ADC) till LPC2148-stift P0.28
Programmering ARM7-LPC2148 för PWM
För att programmera ARM7-LPC2148 behöver vi keil uVision & Flash Magic-verktyget. Vi använder USB-kabel för att programmera ARM7 Stick via mikro-USB-port. Vi skriver kod med Keil och skapar en hex-fil och sedan blinkar HEX-filen till ARM7-stick med Flash Magic. Om du vill veta mer om installation av Keil uVision och Flash Magic och hur du använder dem följer du länken Komma igång med ARM7 LPC2148 Microcontroller och programmerar den med Keil uVision.
I denna handledning kommer vi att använda ADC- och PWM-teknik för att styra ljusstyrkan på lysdioden. Här ges LPC2148 analog ingång (0 till 3,3 V) via ADC-ingångsstift P0.28, sedan konverteras denna analoga ingång till digitalt värde (0 till 1023). Därefter konverteras detta värde igen till digitalt värde (0 - 255) eftersom PWM-utgången på LPC2148 endast har 8-bitars upplösning (2 8). LED är ansluten till PWM-stift P0.0 och ljusstyrkan på LED kan styras med potentiometern. För att lära dig mer om ADC i ARM7-LPC2148, följ länken.
Steg involverade i programmering av LPC2148 för PWM & ADC
Steg 1: - Det allra första är att konfigurera PLL för klockgenerering eftersom den ställer in systemklockan och den perifera klockan för LPC2148 enligt vad programmerare behöver. Den maximala klockfrekvensen för LPC2148 är 60 MHz. Följande rader används för att konfigurera PLL-klockgenerering.
void initilizePLL (void) // Funktion för att använda PLL för klockgenerering { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; medan (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Steg 2: - Nästa sak är att välja PWM-stift och PWM-funktion för LPC2148 genom att använda PINSEL-registret. Vi använder PINSEL0 som vi använder P0.0 för PWM-utdata från LPC2148.
PINSEL0 = 0x00000002; // Inställningsstift P0.0 för PWM-utgång
Steg 3: - Därefter måste vi ÅTERSTÄLLA timern med PWMTCR (Timer Control Register).
PWMTCR = (1 << 1); // Ställa in PWM Timer Control Registrera som räknareåterställning
Och ställ sedan in förskalningsvärdet som bestämmer upplösningen för PWM. Jag sätter den till noll
PWMPR = 0X00; // Ställa in PWM-förskalningsvärde
Steg 4: - Därefter måste vi ställa in PWMMCR (PWM match control register) eftersom det ställer in operation som återställning, avbryter för PWMMR0.
PWMMCR = (1 << 0) - (1 << 1); // Ställa in PWM Match Control Register
Steg 5: - Den maximala perioden för PWM-kanalen ställs in med PWMMR.
PWMMR0 = PWMvärde; // Ge PWM-värde Maximalt värde
I vårt fall är det maximala värdet 255 (för maximal ljusstyrka)
Steg 6: - Därefter måste vi ställa in Latch Enable till motsvarande matchregister med PWMLER
PWMLER = (1 << 0); // Enalbe PWM-spärr
(Vi använder PWMMR0) Aktivera motsvarande bit genom att ställa in 1 i PWMLER
Steg 7: - För att aktivera PWM-utgången till stiftet måste vi använda PWMTCR för att aktivera PWM-timerräknare och PWM-lägen.
PWMTCR = (1 << 0) - (1 << 3); // Aktiverar PWM- och PWM-räknare
Steg 8: - Nu måste vi hämta potentiometervärdena för att ställa in PWM: s arbetscykel från ADC-stift P0.28. Så vi använder ADC-modulen i LPC2148 för att konvertera potentiometers analoga ingång (0 till 3,3 V) till ADC-värden (0 till 1023).
Här konverterar vi värdena från 0-1023 till 0-255 genom att dela det med 4 eftersom PWM för LPC2148 har 8-bitars upplösning (2 8).
Steg 9: - För att välja ADC-stift P0.28 i LPC2148 använder vi
PINSEL1 = 0x01000000; // Ställa in P0.28 som ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // Ställa in klocka och PDN för A / D-konvertering
Följande rader fångar den analoga ingången (0 till 3,3 V) och konverterar den till digitalt värde (0 till 1023). Och sedan delas dessa digitala värden med 4 för att konvertera dem till (0 till 255) och slutligen matas som PWM-utgång i P0.0-stift på LPC2148 som lysdioden är ansluten till.
AD0CR - = (1 << 1); // Välj AD0.1-kanal i ADC-registerfördröjningstiden (10); AD0CR - = (1 << 24); // Starta A / D-omvandlingen medan ((AD0DR1 & (1 << 31)) == 0); // Kontrollera Klar bit i ADC- dataregisteret adcvalue = (AD0DR1 >> 6) & 0x3ff; // Få RESULTAT från ADC- dataregistret dutycycle = adcvalue / 4; // formel för att få dutycykelvärden från (0 till 255) PWMMR1 = dutycykel; // ställa in dutycykelvärde till PWM- matchregister PWMLER - = (1 << 1); // Aktivera PWM-utdata med dutycykelvärde
Steg 10: - Därefter visar vi dessa värden i LCD-skärmen (16X2). Så vi lägger till följande rader för att initialisera LCD-skärmmodulen
Ogiltig LCD_INITILIZE (ogiltig) // Funktion för att förbereda LCD-skärmen { IO0DIR = 0x0000FFF0; // Ställer in stift P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 som UTGÅNGSfördröjningstid (20); LCD_SEND (0x02); // Initiera lcd i 4-bitars driftsätt LCD_SEND (0x28); // 2 rader (16X2) LCD_SEND (0x0C); // Visa på markören av LCD_SEND (0x06); // Autoinkrement- markör LCD_SEND (0x01); // Visa tydlig LCD_SEND (0x80); // Första raden första position }
När vi kopplade LCD i 4-bitars läge med LPC2148 måste vi skicka värden för att visas som nibble för nibble (Upper Nibble & Lower Nibble). Så följande rader används.
ogiltig LCD_DISPLAY (char * msg) // Funktion för att skriva ut de tecken som skickas en efter en { uint8_t i = 0; medan (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Skickar övre nibble IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH för att skriva ut data IO0CLR = 0x00000020; // RW LOW Skrivfördröjningstid (2); IO0CLR = 0x00000040; // EN = 0, RS och RW oförändrade (dvs. RS = 1, RW = 0) fördröjningstid (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Skickar lägre nibble IO0SET = 0x00000050; // RS & EN HÖG IO0CLR = 0x00000020; fördröjning (2); IO0CLR = 0x00000040; fördröjningstid (5); i ++; } }
För att visa dessa ADC- och PWM-värden använder vi följande rader i int main () -funktionen.
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", adcvalue); LCD_DISPLAY (displayadc); // Visa ADC-värde (0 till 1023) LCD_SEND (0xC0); sprintf (ledoutput, "PWM OP =%. 2f", ljusstyrka); LCD_DISPLAY (ledoutput); // Visa arbetscykelvärden från (0 till 255)
Komplett kod och videobeskrivning av handledningen ges nedan.