- PWM (Pulse Width Modulation)
- Mga PWM Pins sa ARM7-LPC2148
- Mga Rehistro ng PWM sa ARM7-LPC2148
- Kinakailangan ang Mga Bahagi
- Circuit Diagram at Mga Koneksyon
- Programming ARM7-LPC2148 para sa PWM
- Mga hakbang na kasangkot sa pagprograma ng LPC2148 para sa PWM & ADC
Tulad ng alam natin na ang mga microcontroller ay kumukuha ng analog input mula sa mga analog sensor at gumagamit ng ADC (Analog to Digital converter) upang maproseso ang mga signal na iyon. Ngunit paano kung ang isang microcontroller ay nais na gumawa ng isang analog signal upang makontrol ang mga analog na aparato na pinapatakbo tulad ng isang Servo motor, DC motor atbp? Ang mga microcontroller ay hindi gumagawa ng output voltage tulad ng 1V, 5V sa halip ay gumagamit sila ng diskarteng tinatawag na PWM para sa pagpapatakbo ng mga analog device. Ang isang halimbawa ng PWM ay ang paglamig fan ng aming laptop (DC motor) na kailangang kontrolin ang bilis ayon sa temperatura, at pareho ang ipinatupad sa pamamagitan ng paggamit ng pamamaraan ng Pulse Width Modulation (PWM) sa mga motherboard.
Sa tutorial na ito makontrol namin ang liwanag ng isang LED gamit ang PWM sa ARM7-LPC2148 microcontroller.
PWM (Pulse Width Modulation)
Ang PWM ay isang mabuting paraan upang makontrol ang mga analog na aparato gamit ang digital na halaga tulad ng pagkontrol sa bilis ng motor, ningning ng isang humantong atbp Kahit na ang PWM ay hindi nagbibigay ng purong analog output, ngunit bumubuo ito ng disenteng mga pulso ng analog upang makontrol ang Mga Analog Device. Talagang binabago ng PWM ang lapad ng isang hugis-parihaba na alon ng pulso upang makakuha ng pagkakaiba-iba sa average na halaga ng nagresultang alon.
Pag-ikot ng tungkulin ng PWM
Ang porsyento ng oras kung saan ang signal ng PWM ay mananatiling TAAS (sa oras) ay tinawag bilang duty cycle. Kung ang signal ay laging ON ito ay nasa 100% na cycle ng tungkulin at kung palaging naka-off ito ay 0% na cycle ng tungkulin.
Duty Cycle = I-ON ang oras / (I-ON ang oras + I-OFF ang oras)
Mga PWM Pins sa ARM7-LPC2148
Ang imahe sa ibaba ay nagpapahiwatig ng mga PWM output pin ng ARM7-LPC2148. Mayroong kabuuang anim na mga pin para sa PWM.
Channel ng PWM |
Mga Port ng LPC2148 Port |
PWM1 |
P0.0 |
PWM2 |
P0.7 |
PWM3 |
P0.1 |
PWM4 |
P0.8 |
PWM5 |
P0.21 |
PWM6 |
P0.9 |
Mga Rehistro ng PWM sa ARM7-LPC2148
Bago pumasok sa aming proyekto kailangan naming malaman ang tungkol sa mga pagrehistro ng PWM sa LPC2148.
Narito ang listahan ng mga rehistro na ginamit sa LPC2148 para sa PWM
1. PWMPR: PWM Prescale Rehistro
Gamitin: Ito ay isang 32-Bit na rehistro. Naglalaman ito ng bilang ng mga beses (minus 1) dapat iikot ng PCLK bago dagdagan ang PWM Timer Counter (Tunay na may hawak ito ng maximum na halaga ng prescale counter).
2. PWMPC: PWM Prescaler Counter
Gamitin: Ito ay isang 32-bit na pagrehistro . Naglalaman ito ng tumataas na halaga ng counter. Kapag ang halagang ito ay katumbas ng halagang PR plus 1, ang PWM Timer Counter (TC) ay nadagdagan.
3. PWMTCR: Rehistro ng Control ng Timer ng PWM
Paggamit: Naglalaman ito ng Counter Enable, Counter Reset at ang PWM Enable control bits. Ito ay isang 8-Bit register.
7: 4 |
3 |
2 |
1 |
0 |
NAG-RESERBAHO |
PWM KAYA |
NAG-RESERBAHO |
PAG-RESET NG COUNTER |
PAGPAPAYAN NG COUNTER |
- Paganahin ang PWM: (Bit-3)
0- Hindi pinagana ang
PWM 1- Pinagana ang PWM
- Paganahin ang Counter: (Bit-0)
0- Huwag paganahin ang Mga counter
1- Paganahin ang Counter
- Counter reset: (Bit-1)
0- Huwag Gumawa ng Wala.
1- I-reset ang PWMTC & PWMPC sa positibong gilid ng PCLK.
4. PWMTC: PWM Timer Counter
Gamitin: Ito ay isang 32-Bit na rehistro. Naglalaman ito ng kasalukuyang halaga ng nagdadagdag na PWM Timer. Kapag naabot ng Prescaler Counter (PC) ang halaga ng Prescaler Rehistro (PR) plus 1, ang counter na ito ay nadagdagan.
5. PWMIR: PWM Nakagambala ang Rehistro
Gamitin: Ito ay isang 16-Bit na Rehistro. Naglalaman ito ng mga nakakagambalang watawat para sa Mga Channel ng PWM Match 0-6. Ang isang makagambala na bandila ay itinakda kapag nangyari ang isang nakakagambala para sa channel na (MRx Interrupt) kung saan ang X ay ang numero ng channel (0 hanggang 6).
6. PWMMR0-PWMMR6: Rehistro ng Tugma sa PWM
Gamitin: Ito ay isang 32-Bit na rehistro . Sa totoo lang pinapayagan ng pangkat ng Match Channel ang pagtatakda ng 6 single-edge na kinokontrol o 3 dobleng gilid na kinokontrol na mga output ng PWM. Maaari mong baguhin ang pitong Mga Channel ng Pagtutugma upang mai-configure ang mga PWM output na ito upang umangkop sa iyong mga kinakailangan sa PWMPCR.
7. PWMMCR: Rehistro sa Control ng PWM Match
Gamitin: Ito ay isang 32-Bit na rehistro. Naglalaman ito ng mga makagambala, I-reset at Ihinto ang mga piraso na kumokontrol sa napiling Channel ng Pagtutugma. Nagaganap ang isang tugma sa pagitan ng mga rehistro ng tugma ng PWM at mga counter ng PWM Timer.
31:21 |
20 |
19 |
18 |
.. |
5 |
4 |
3 |
2 |
1 |
0 |
NAG-RESERBAHO |
PWMMR6S |
PWMMR6R |
PWMMR6I |
.. |
PWMMR1S |
PWMMR1R |
PWMMR11 |
PWMMR0S |
PWMMR0R |
PWMMR01 |
Narito x ay mula 0 hanggang 6
- PWMMRxI (Bit-0)
Paganahin o Huwag paganahin ang PWM nakakagambala
0- Huwag paganahin ang mga pagkagambala ng PWM Match.
1- Paganahin ang PWM Match makagambala.
- PWMMRxR: (Bit-1)
I-reset ang PWMTC - Ang halaga ng counter ng timer tuwing tumutugma ito sa PWMRx
0- Huwag Gumawa ng Wala.
1- I-reset ang PWMTC.
- PWMMRxS: (Bit 2)
TIGILAN ang PWMTC & PWMPC kapag naabot ng PWMTC ang halagang rehistro sa tugma
0- Huwag paganahin ang tampok na paghinto ng PWM.
1- Paganahin ang tampok na PWM Stop.
8. PWMPCR: Rehistro ng PWM Control
Gamitin: Ito ay isang 16-Bit na rehistro. Naglalaman ito ng mga piraso na nagbibigay-daan sa mga output ng PWM na 0-6 at piliin ang solong-gilid o kontrol na dobleng gilid para sa bawat output.
31:15 |
14: 9 |
8: 7 |
6: 2 |
1: 0 |
UNUSED |
PWMENA6-PWMENA1 |
UNUSED |
PWMSEL6-PWMSEL2 |
UNUSED |
- PWMSELx (x: 2 hanggang 6)
- Single Edge mode para sa PWMx
- 1- Double Edge Mode para sa PWMx.
- PWMENAx (x: 1 hanggang 6)
- Huwag paganahin ang PWMx.
- 1- Pinagana ang PWMx.
9. PWMLER: PWM Latch Paganahin ang Pagrehistro
Gamitin: Ito ay isang 8-Bit na Rehistro. Naglalaman ito ng mga Match x Latch bits para sa bawat Channel ng Pagtutugma.
31: 7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
UNUSED |
LEN6 |
LEN5 |
LEN4 |
LEN3 |
LEN2 |
LEN1 |
LEN0 |
LENx (x: 0 hanggang 6):
0- Huwag paganahin ang paglo-load ng mga bagong Halaga ng Pagtutugma
1- I-load ang bagong mga halaga ng Pagtutugma mula sa (PWMMRx) Pagrehistro sa PWMMatch kapag na-reset ang timer.
Hinahayaan na ngayong simulan ang pagbuo ng pag-setup ng hardware upang maipakita ang Pulse Width Modulation sa ARM microcontroller.
Kinakailangan ang Mga Bahagi
Hardware
- ARM7-LPC2148 Microcontroller
- 3.3V Boltahe Regulator IC
- 10k Potensyomiter
- LED (Anumang kulay)
- LCD (16x2) Display Module
- Breadboard
- Mga Koneksyon sa Mga Wires
Software
- Keil uVision5
- Flash Magic Tool
Circuit Diagram at Mga Koneksyon
Mga koneksyon sa pagitan ng LCD & ARM7-LPC2148
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Piliin ang Rehistro) |
P0.6 |
E (Paganahin) |
P0.12 |
D4 (Data pin 4) |
P0.13 |
D5 (Data pin 5) |
P0.14 |
D6 (Data pin 6) |
P0.15 |
D7 (Data pin 7) |
GND |
VSS, R / W, K |
+ 5V |
VDD, A |
Koneksyon sa pagitan ng LED & ARM7-LPC2148
Ang ANODE ng LED ay konektado sa output ng PWM (P0.0) ng LPC2148, habang ang LED's CATHODE pin ay konektado sa GND pin ng LPC2148.
Ang koneksyon sa pagitan ng ARM7-LPC2148 at potentiometer na may 3.3V voltage regulator
3.3V Boltahe Regulator IC |
Pag-andar ng pin |
ARM-7 LPC2148 Pin |
1. Kaliwang Pin |
- Mula sa GND |
GND pin |
2.Centre Pin |
Regulado + 3.3V Output |
Sa potentiometer Input at potentiometer's output sa P0.28 ng LPC2148 |
3. Tamang Pin |
+ Mula sa 5V INPUT |
+ 5V |
Mga puntong dapat pansinin
1. Ang isang boltahe regulator ng 3.3V ay ginagamit dito upang magbigay ng halaga ng pag-input ng analog sa ADC pin (P0.28) ng LPC2148 at dahil gumagamit kami ng 5V lakas na kailangan namin upang makontrol ang boltahe na may boltahe regulator ng 3.3V.
2. Ang isang Potentiometer ay ginagamit upang mag-iba ang boltahe sa pagitan ng (0V hanggang 3.3V) upang magbigay ng analog input (ADC) sa LPC2148 pin P0.28
Programming ARM7-LPC2148 para sa PWM
Upang Program ARM7-LPC2148 kailangan namin ng keV uVision at Flash Magic tool. Gumagamit kami ng USB Cable upang mai-program ang ARM7 Stick sa pamamagitan ng micro USB port. Nagsusulat kami ng code gamit ang Keil at lumikha ng isang hex file at pagkatapos ang HEX file ay na-flash sa ARM7 stick gamit ang Flash Magic. Upang malaman ang higit pa tungkol sa pag-install ng keil uVision at Flash Magic at kung paano gamitin ang mga ito sundin ang link na Nagsisimula Sa ARM7 LPC2148 Microcontroller at Program ito gamit ang Keil uVision.
Sa tutorial na ito gagamitin namin ang diskarteng ADC at PWM upang makontrol ang liwanag ng LED. Narito ang LPC2148 ay binibigyan ng analog input (0 hanggang 3.3V) sa pamamagitan ng ADC input pin P0.28, pagkatapos ang analog input na ito ay na-convert sa digital na halaga (0 hanggang 1023). Pagkatapos ang halagang ito ay muling nai-convert sa digital na halaga (0 - 255) dahil ang output ng PWM ng LPC2148 ay mayroon lamang 8-bit na resolusyon (2 8). Ang LED ay konektado sa PWM pin P0.0 at ang liwanag ng LED ay maaaring makontrol gamit ang potensyomiter. Upang malaman ang tungkol sa ADC sa ARM7-LPC2148 sundin ang link.
Mga hakbang na kasangkot sa pagprograma ng LPC2148 para sa PWM & ADC
Hakbang 1: - Ang pinakaunang bagay ay upang i - configure ang PLL para sa pagbuo ng orasan habang itinatakda nito ang system na orasan at paligid na orasan ng LPC2148 ayon sa kailangan ng bawat programmer. Ang maximum na dalas ng orasan para sa LPC2148 ay 60Mhz. Ang mga sumusunod na linya ay ginagamit upang mai-configure ang pagbuo ng orasan ng PLL.
void initilizePLL (void) // Function upang magamit ang PLL para sa pagbuo ng orasan { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; habang (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Hakbang 2: - Susunod na bagay ay upang piliin ang mga PWM na pin at pagpapaandar ng PWM ng LPC2148 sa pamamagitan ng paggamit ng rehistro ng PINSEL. Gumagamit kami ng PINSEL0 habang gumagamit kami ng P0.0 para sa PWM output ng LPC2148.
PINSEL0 = 0x00000002; // Ang pagtatakda ng pin P0.0 para sa PWM output
Hakbang 3: - Susunod na kailangan naming I-RESET ang mga timer gamit ang PWMTCR (Timer Control Rehistro).
PWMTCR = (1 << 1); // Setting PWM Timer Control Rehistro bilang counter reset
At pagkatapos, itakda ang prescale na halaga na magpapasya sa paglutas ng PWM. Itinatakda ko ito sa zero
PWMPR = 0X00; // Pagtatakda ng PWM prescale na halaga
Hakbang 4: - Susunod na kailangan naming itakda ang PWMMCR (rehistro ng kontrol ng tugma ng PWM) habang itinatakda nito ang operasyon tulad ng pag-reset, nakakagambala para sa PWMMR0.
PWMMCR = (1 << 0) - (1 << 1); // Setting PWM Match Control Rehistro
Hakbang 5: - Ang maximum na panahon ng PWM channel ay nakatakda gamit ang PWMMR.
PWMMR0 = PWMvalue; // Pagbibigay ng halagang PWM Maximum na halaga
Sa aming kaso ang maximum na halaga ay 255 (Para sa maximum na ningning)
Hakbang 6: - Susunod na kailangan namin upang itakda ang Latch Paganahin ang kaukulang mga rehistro ng tugma gamit ang PWMLER
PWMLER = (1 << 0); // Enalbe PWM latch
(Gumagamit kami ng PWMMR0) Kaya paganahin ang kaukulang bit sa pamamagitan ng pagtatakda ng 1 sa PWMLER
Hakbang 7: - Upang paganahin ang output ng PWM sa pin na kailangan namin upang magamit ang PWMTCR para sa pagpapagana ng mga counter ng PWM Timer at PWM mode.
PWMTCR = (1 << 0) - (1 << 3); // Pagpapagana sa PWM at PWM counter
Hakbang 8: - Ngayon kailangan naming makuha ang mga halaga ng potensyomiter para sa pagtatakda ng cycle ng tungkulin ng PWM mula sa ADC pin P0.28. Kaya ginagamit namin ang module ng ADC sa LPC2148 para sa pag-convert ng potentiometers analog input (0 hanggang 3.3V) sa mga halaga ng ADC (0 hanggang 1023).
Narito namin ang pag-convert ng mga halaga mula 0-1023 hanggang 0-255 sa pamamagitan ng paghahati nito sa 4 dahil ang PWM ng LPC2148 ay may resolusyon na 8-Bit (2 8).
Hakbang 9: - Para sa pagpili ng ADC pin P0.28 sa LPC2148, ginagamit namin
PINSEL1 = 0x01000000; // Setting P0.28 as ADC INPUT AD0CR = ((((14) << 8) - (1 << 21)); // Ang pagtatakda ng orasan at PDN para sa A / D Conversion
Kinukuha ng mga sumusunod na linya ang input ng Analog (0 hanggang 3.3V) at ginawang digital na halaga (0 hanggang 1023). At pagkatapos ang mga halagang digital na ito ay nahahati sa 4 upang i-convert ang mga ito sa (0 hanggang 255) at sa wakas ay pinakain bilang output ng PWM sa P0.0 pin ng LPC2148 kung saan nakakonekta ang LED.
AD0CR - = (1 << 1); // Piliin ang AD0.1 channel sa pagkaantala ng pagrehistro ng ADC (10); AD0CR - = (1 << 24); // Start the A / D conversion habang ((AD0DR1 & (1 << 31)) == 0); // Check the DONE bit in ADC Data register adcvalue = (AD0DR1 >> 6) & 0x3ff; // Kunin ang RESULTA mula sa rehistro ng data ng ADC dutycycle = adcvalue / 4; // formula upang makakuha ng mga halaga ng dutycycle mula sa (0 hanggang 255) PWMMR1 = dutycycle; // itakda ang halaga ng dutycycle sa PWM match register PWMLER - = (1 << 1); // Paganahin ang output ng PWM na may halaga ng dutycycle
Hakbang 10: - Susunod na ipinapakita namin ang mga halagang iyon sa LCD (16X2) na module ng pagpapakita. Kaya idinagdag namin ang mga sumusunod na linya upang gawing simula ang module ng pagpapakita ng LCD
I-void ang LCD_INITILIZE (walang bisa) // Function upang maihanda ang LCD { IO0DIR = 0x0000FFF0; // Nagtatakda ng pin P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 bilang OUTPUT na pagkaantala (20); LCD_SEND (0x02); // Initialize lcd sa 4-bit mode ng operasyon LCD_SEND (0x28); // 2 lines (16X2) LCD_SEND (0x0C); // Display on cursor off LCD_SEND (0x06); // Auto increment cursor LCD_SEND (0x01); // Ipakita ang malinaw na LCD_SEND (0x80); // First line first posisyon }
Tulad ng pagkonekta namin sa LCD sa 4-Bit mode sa LPC2148 kailangan naming magpadala ng mga halagang maipapakita bilang nibble ng nibble (Upper Nibble & Lower Nibble). Kaya ang mga sumusunod na linya ay ginagamit.
walang bisa ang LCD_DISPLAY (char * msg) // Function upang mai-print ang mga character na isa-isang ipinadala { uint8_t i = 0; habang (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Nagpadala ng Itaas na nibble IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH to print data IO0CLR = 0x00000020; // RW LOW Sumulat mode mode pagkaantala (2); IO0CLR = 0x00000040; // EN = 0, RS at RW hindi nagbago (ie RS = 1, RW = 0) oras ng pagkaantala (5); IO0PIN = (((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Nagpapadala ng Mas mababang nibble IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; oras ng pagkaantala (2); IO0CLR = 0x00000040; pagkaantala (5); ako ++; } }
Upang maipakita ang mga halagang ADC & PWM na ginagamit namin ang mga sumusunod na linya sa int pangunahing () pagpapaandar.
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", adcvalue); LCD_DISPLAY (displayadc); // Ipakita ang halaga ng ADC (0 hanggang 1023) LCD_SEND (0xC0); sprintf (ledoutput, "PWM OP =%. 2f", ningning); LCD_DISPLAY (ledoutput); // Ipakita ang mga halaga ng dutycycle mula (0 hanggang 255)
Ang kumpletong paglalarawan ng code at video ng tutorial ay ibinibigay sa ibaba.