- PWM (pulsbreedtemodulatie)
- PWM-pinnen in ARM7-LPC2148
- PWM registreert in ARM7-LPC2148
- Componenten vereist
- Schakelschema en aansluitingen
- Programmering ARM7-LPC2148 voor PWM
- Stappen voor het programmeren van LPC2148 voor PWM & ADC
Zoals we weten, nemen microcontrollers analoge input van analoge sensoren en gebruiken ze ADC (analoog naar digitaal converter) om die signalen te verwerken. Maar wat als een microcontroller een analoog signaal wil produceren om analoog bediende apparaten zoals een servomotor, gelijkstroommotor enz. Te besturen? Microcontrollers produceren geen uitgangsspanning zoals 1V, 5V, maar gebruiken een techniek genaamd PWM voor het bedienen van analoge apparaten. Een voorbeeld van PWM is de koelventilator van onze laptop (gelijkstroommotor) die in snelheid moet worden geregeld op basis van de temperatuur, en hetzelfde wordt geïmplementeerd door gebruik te maken van de Pulse Width Modulation (PWM) -techniek in moederborden.
In deze tutorial zullen we de helderheid van een LED regelen met behulp van de PWM in ARM7-LPC2148 microcontroller.
PWM (pulsbreedtemodulatie)
PWM is een goede manier om de analoge apparaten te besturen met behulp van digitale waarden, zoals het regelen van de motorsnelheid, de helderheid van een led etc. Hoewel PWM geen pure analoge output levert, genereert het fatsoenlijke analoge pulsen om de analoge apparaten te besturen. PWM moduleert feitelijk de breedte van een rechthoekige pulsgolf om een variatie in de gemiddelde waarde van de resulterende golf te krijgen.
Inschakelduur van de PWM
Het percentage van de tijd waarin het PWM-signaal HOOG (op tijd) blijft, wordt de duty-cycle genoemd. Als het signaal altijd AAN is, is het in 100% inschakelduur en als het altijd uit is, is het 0% inschakelduur.
Duty Cycle = Inschakeltijd / (Inschakeltijd + Uitschakeltijd)
PWM-pinnen in ARM7-LPC2148
De onderstaande afbeelding geeft de PWM-uitgangspennen van ARM7-LPC2148 weer. Er zijn in totaal zes pinnen voor PWM.
PWM-kanaal |
LPC2148 Poortpennen |
PWM1 |
P0.0 |
PWM2 |
P0.7 |
PWM3 |
P0.1 |
PWM4 |
P0.8 |
PWM5 |
P0.21 |
PWM6 |
P0.9 |
PWM registreert in ARM7-LPC2148
Voordat we aan ons project beginnen, moeten we de PWM-registers in LPC2148 kennen.
Hier is de lijst met registers die in LPC2148 voor PWM worden gebruikt
1. PWMPR: PWM Prescale Register
Gebruik: het is een 32-bits register. Het bevat het aantal keren (minus 1) dat PCLK moet doorlopen voordat de PWM-timerteller wordt verhoogd (het bevat eigenlijk de maximale waarde van de voorverkoopteller).
2. PWMPC: PWM-voorkalkerteller
Gebruik: Het is een 32-bits register . Het bevat de oplopende tellerwaarde. Wanneer deze waarde gelijk is aan de PR-waarde plus 1, wordt de PWM-timerteller (TC) verhoogd.
3. PWMTCR: PWM Timer Control Register
Gebruik: Het bevat de besturingsbits Counter Enable, Counter Reset en de PWM Enable. Het is een 8-bits register.
7: 4 |
3 |
2 |
1 |
0 |
GERESERVEERD |
PWM INSCHAKELEN |
GERESERVEERD |
TELLER RESET |
TELLER INSCHAKELEN |
- PWM inschakelen: (Bit-3)
0- PWM uitgeschakeld
1- PWM ingeschakeld
- Teller inschakelen: (Bit-0)
0- Tellers uitschakelen
1- Teller inschakelen
- Teller reset: (Bit-1)
0- Niets doen.
1- Reset PWMTC & PWMPC op positieve rand van PCLK.
4. PWMTC: PWM- timerteller
Gebruik: het is een 32-bits register. Het bevat de huidige waarde van de oplopende PWM-timer. Wanneer de Prescaler Counter (PC) de Prescaler Register (PR) waarde plus 1 bereikt, wordt deze teller opgehoogd.
5. PWMIR: PWM-onderbrekingsregister
Gebruik: het is een 16-bits register. Het bevat de interruptvlaggen voor PWM-wedstrijdkanalen 0-6. Een interruptvlag wordt ingesteld wanneer er een interrupt optreedt voor dat kanaal (MRx Interrupt) waarbij X het kanaalnummer is (0 tot 6).
6. PWMMR0-PWMMR6: PWM-overeenkomstregister
Gebruik: het is een 32-bits register . In feite maakt de Match Channel-groep het mogelijk om 6 enkelzijdige gecontroleerde of 3 dubbelzijdige PWM-uitgangen in te stellen. U kunt de zeven matchkanalen wijzigen om deze PWM-uitgangen te configureren om aan uw vereisten in PWMPCR te voldoen.
7. PWMMCR: PWM Match Control Register
Gebruik: het is een 32-bits register. Het bevat de interrupt-, reset- en stopbits die het geselecteerde matchkanaal regelen. Er vindt een overeenkomst plaats tussen de PWM-overeenkomstregisters en PWM-timertellers.
31:21 |
20 |
19 |
18 |
.. |
5 |
4 |
3 |
2 |
1 |
0 |
GERESERVEERD |
PWMMR6S |
PWMMR6R |
PWMMR6I |
.. |
PWMMR1S |
PWMMR1R |
PWMMR11 |
PWMMR0S |
PWMMR0R |
PWMMR01 |
Hier is x van 0 tot 6
- PWMMRxI (Bit-0)
PWM-onderbrekingen IN- OF UITSCHAKELEN
0- Schakel PWM-wedstrijdonderbrekingen uit.
1- Schakel PWM Match-interrupt in.
- PWMMRxR: (Bit-1)
RESET PWMTC - Timer-tellerwaarde wanneer deze overeenkomt met PWMRx
0- Niets doen.
1- Reset de PWMTC.
- PWMMRxS: (Bit 2)
STOP PWMTC & PWMPC wanneer PWMTC de Match-registerwaarde bereikt
0- Schakel de PWM-stopfunctie uit.
1- Schakel de PWM Stop-functie in.
8. PWMPCR: PWM-controleregister
Gebruik: het is een 16-bits register. Het bevat de bits die PWM-uitgangen 0-6 inschakelen en voor elke uitgang enkele of dubbele besturing selecteren.
31:15 |
14: 9 |
8: 7 |
6: 2 |
1: 0 |
ONGEBRUIKT |
PWMENA6-PWMENA1 |
ONGEBRUIKT |
PWMSEL6-PWMSEL2 |
ONGEBRUIKT |
- PWMSELx (x: 2 tot 6)
- Single Edge-modus voor PWMx
- 1- Double Edge Mode voor PWMx.
- PWMENAx (x: 1 tot 6)
- PWMx uitschakelen.
- 1- PWMx ingeschakeld.
9. PWMLER: PWM Latch Enable Register
Gebruik: het is een 8-bits register. Het bevat de Match x Latch-bits voor elk Match-kanaal.
31: 7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
ONGEBRUIKT |
LEN6 |
LEN5 |
LEN4 |
LEN3 |
LEN2 |
LEN1 |
LEN0 |
LENx (x: 0 tot 6):
0- Schakel het laden van nieuwe Match-waarden uit.
1- Laad de nieuwe Match-waarden van (PWMMRx) PWMMatch-register wanneer de timer wordt gereset.
Laten we nu beginnen met het bouwen van de hardware-instellingen om de pulsbreedtemodulatie in de ARM-microcontroller te demonstreren.
Componenten vereist
Hardware
- ARM7-LPC2148 Microcontroller
- 3.3V Spanningsregelaar IC
- 10k Potentiometer
- LED (elke kleur)
- LCD (16x2) weergavemodule
- Breadboard
- Verbindingsdraden
Software
- Keil uVision5
- Flash Magic Tool
Schakelschema en aansluitingen
Verbindingen tussen LCD en ARM7-LPC2148
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Registreer selecteren) |
P0.6 |
E (inschakelen) |
P0.12 |
D4 (gegevenspin 4) |
P0.13 |
D5 (gegevenspin 5) |
P0.14 |
D6 (gegevenspin 6) |
P0.15 |
D7 (gegevenspin 7) |
GND |
VSS, R / W, K |
+ 5V |
VDD, A |
Verbinding tussen LED en ARM7-LPC2148
LED's ANODE is verbonden met de PWM-uitgang (P0.0) van LPC2148, terwijl LED's CATHODE-pin is verbonden met GND-pin van LPC2148.
Verbinding tussen ARM7-LPC2148 en potentiometer met 3.3V spanningsregelaar
3.3V Spanningsregelaar IC |
Pin-functie |
ARM-7 LPC2148 Speld |
1. linker pin |
- Ve van GND |
GND-pin |
2. middelste pin |
Gereguleerde + 3.3V-uitgang |
Naar de ingang van de potentiometer en de uitgang van de potentiometer naar P0.28 van LPC2148 |
3. juiste pin |
+ Ve van 5V INVOER |
+ 5V |
Punten om op te merken
1. Een spanningsregelaar van 3.3V wordt hier gebruikt om analoge ingangswaarde te leveren aan de ADC pin (P0.28) van LPC2148 en omdat we 5V stroom gebruiken, moeten we de spanning regelen met een spanningsregelaar van 3.3V.
2. Een potentiometer wordt gebruikt om de spanning te variëren tussen (0V tot 3,3V) om analoge ingang (ADC) te leveren aan LPC2148 pin P0.28
Programmering ARM7-LPC2148 voor PWM
Om ARM7-LPC2148 te programmeren, hebben we de tool uVision & Flash Magic nodig. We gebruiken een USB-kabel om de ARM7 Stick te programmeren via een micro-USB-poort. We schrijven code met Keil en maken een hex-bestand en vervolgens wordt het HEX-bestand met Flash Magic naar de ARM7-stick geflitst. Om meer te weten over het installeren van keil uVision en Flash Magic en hoe u ze kunt gebruiken, volgt u de link Aan de slag met ARM7 LPC2148 Microcontroller en programmeert u deze met Keil uVision.
In deze tutorial zullen we ADC- en PWM-techniek gebruiken om de helderheid van de LED te regelen. Hier krijgt LPC2148 analoge invoer (0 tot 3,3V) via ADC-invoerpin P0.28, waarna deze analoge invoer wordt omgezet in digitale waarde (0 tot 1023). Vervolgens wordt deze waarde opnieuw omgezet in digitale waarde (0 - 255), aangezien de PWM-uitvoer van LPC2148 slechts 8-bits resolutie heeft (2 8). LED is aangesloten op PWM-pin P0.0 en de helderheid van de LED kan worden geregeld met behulp van de potentiometer. Volg de link om meer te weten over ADC in ARM7-LPC2148.
Stappen voor het programmeren van LPC2148 voor PWM & ADC
Stap 1: - Het allereerste is om de PLL voor klokgeneratie te configureren, aangezien het de systeemklok en perifere klok van LPC2148 instelt volgens de behoeften van programmeurs. De maximale klokfrequentie voor LPC2148 is 60 MHz. De volgende regels worden gebruikt om de PLL-klokgeneratie te configureren.
void initilizePLL (void) // Functie om PLL te gebruiken voor klokgeneratie { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; terwijl (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Stap 2: - Het volgende is om de PWM-pinnen en PWM-functie van LPC2148 te selecteren met behulp van PINSEL-register. We gebruiken PINSEL0 zoals we P0.0 gebruiken voor PWM-uitvoer van LPC2148.
PINSEL0 = 0x00000002; // Instelpen P0.0 voor PWM-uitvoer
Stap 3: - Vervolgens moeten we de timers RESETTEN met behulp van PWMTCR (Timer Control Register).
PWMTCR = (1 << 1); // PWM Timer Control Register instellen als teller reset
En stel vervolgens de voorverkoopwaarde in die de resolutie van PWM bepaalt. Ik zet het op nul
PWMPR = 0X00; // Instellen van PWM-voorschaalwaarde
Stap 4: - Vervolgens moeten we de PWMMCR (PWM match control register) instellen aangezien het de werking instelt zoals reset, interrupts voor PWMMR0.
PWMMCR = (1 << 0) - (1 << 1); // PWM Match Control Register instellen
Stap 5: - De maximale periode van het PWM-kanaal wordt ingesteld met PWMMR.
PWMMR0 = PWMwaarde; // PWM-waarde geven Maximale waarde
In ons geval is de maximale waarde 255 (voor maximale helderheid)
Stap 6: - Vervolgens moeten we de Latch Enable instellen op de corresponderende matchregisters met PWMLER
PWMLER = (1 << 0); // Enalbe PWM-vergrendeling
(We gebruiken PWMMR0) Dus schakel het corresponderende bit in door 1 in PWMLER in te stellen
Stap 7: - Om de PWM-uitvoer naar de pin in te schakelen, moeten we de PWMTCR gebruiken om de PWM-timertellers en PWM-modi in te schakelen.
PWMTCR = (1 << 0) - (1 << 3); // PWM- en PWM-teller inschakelen
Stap 8: - Nu moeten we de potentiometerwaarden ophalen voor het instellen van de duty-cycle van PWM van ADC-pin P0.28. Dus gebruiken we de ADC-module in LPC2148 voor het converteren van analoge ingang van potentiometers (0 tot 3,3 V) naar de ADC-waarden (0 tot 1023).
Hier converteren we de waarden van 0-1023 naar 0-255 door deze te delen door 4, aangezien PWM van LPC2148 een 8-bits resolutie heeft (28).
Stap 9: - Voor het selecteren van ADC-pin P0.28 in LPC2148 gebruiken we
PINSEL1 = 0x01000000; // P0.28 instellen als ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // Instellen van klok en PDN voor A / D-conversie
De volgende regels leggen de analoge ingang vast (0 tot 3,3 V) en zetten deze om in digitale waarde (0 tot 1023). En dan worden deze digitale waarden gedeeld door 4 om ze om te zetten in (0 tot 255) en uiteindelijk ingevoerd als PWM-uitgang in P0.0 pin van LPC2148 waarop de LED is aangesloten.
AD0CR - = (1 << 1); // Selecteer AD0.1-kanaal in ADC-registervertragingstijd (10); AD0CR - = (1 << 24); // Start de A / D-conversie terwijl ((AD0DR1 & (1 << 31)) == 0); // Controleer de DONE-bit in ADC-gegevensregister adcvalue = (AD0DR1 >> 6) & 0x3ff; // Haal het RESULTAAT uit ADC-gegevensregister dutycycle = adcvalue / 4; // formule om dutycycle-waarden te krijgen van (0 tot 255) PWMMR1 = dutycycle; // stel dutycycle-waarde in op PWM- matchregister PWMLER - = (1 << 1); // Schakel PWM-uitvoer in met dutycycle-waarde
Stap 10: - Vervolgens tonen we die waarden in de LCD (16X2) Display module. Dus we voegen de volgende regels toe om de LCD-displaymodule te initialiseren
Void LCD_INITILIZE (void) // Functie om de LCD klaar te maken { IO0DIR = 0x0000FFF0; // Stelt pin P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 in als OUTPUT vertragingstijd (20); LCD_SEND (0x02); // Initialiseer lcd in 4-bits modus LCD_SEND (0x28); // 2 regels (16X2) LCD_SEND (0x0C); // Weergave op cursor uit LCD_SEND (0x06); // Auto increment cursor LCD_SEND (0x01); // Display duidelijk LCD_SEND (0x80); // Eerste regel eerste positie }
Omdat we LCD in 4-bit-modus met LPC2148 hebben verbonden, moeten we waarden verzenden die als nibble by nibble worden weergegeven (Upper Nibble & Lower Nibble). Dus de volgende regels worden gebruikt.
void LCD_DISPLAY (char * msg) // Functie om de verzonden tekens een voor een af te drukken { uint8_t i = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Stuurt bovenste nibble IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH om gegevens af te drukken IO0CLR = 0x00000020; // RW LOW Vertragingstijd schrijfmodus (2); IO0CLR = 0x00000040; // EN = 0, RS en RW ongewijzigd (dwz RS = 1, RW = 0) vertragingstijd (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Stuurt lagere nibble IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; vertragingstijd (2); IO0CLR = 0x00000040; vertragingstijd (5); i ++; } }
Om die ADC- en PWM-waarden weer te geven, gebruiken we de volgende regels in de functie int main () .
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", adcvalue); LCD_DISPLAY (displayadc); // ADC-waarde weergeven (0 tot 1023) LCD_SEND (0xC0); sprintf (ledoutput, "PWM OP =%. 2f", helderheid); LCD_DISPLAY (ledoutput); // Toon dutycycle-waarden van (0 tot 255)
Volledige code en videobeschrijving van de tutorial worden hieronder gegeven.