- PWM Pins sa AVR Microcontroller Atmega16
- Ano ang isang PWM Signal?
- Kinakailangan ang Mga Bahagi
- Diagram ng Circuit
- Programming Atmega16 para sa PWM
Ang Pulse Width Modulation (PWM) ay isang malakas na pamamaraan kung saan ang lapad ng pulso ay nabago sa pamamagitan ng pagpapanatili ng dalas ng dalas. Ang pamamaraan ay ginagamit sa maraming mga control system ngayon. Ang aplikasyon ng PWM ay hindi limitado at ginagamit ito sa malawak na hanay ng mga application tulad ng kontrol sa bilis ng motor, pagsukat, kontrol sa kuryente at komunikasyon atbp. Sa diskarteng PWM, madali makagawa ang isang analog output signal gamit ang mga digital signal. Tutulungan ka ng tutorial na ito sa pag-unawa sa PWM, mga terminolohiya nito at kung paano namin ito maipapatupad gamit ang isang microcontroller. Sa tutorial na ito ipapakita namin ang PWM kasama ang AVR Atmega16 Microcontroller sa pamamagitan ng pag-iiba ng tindi ng isang LED.
Upang maunawaan nang detalyado ang mga pangunahing kaalaman ng PWM, mangyaring pumunta sa aming nakaraang mga tutorial sa PWM na may iba't ibang mga microcontroller:
- ARM7-LPC2148 PWM Tutorial: Pagkontrol ng Liwanag ng LED
- Pulse width Modulation (PWM) gamit ang MSP430G2: Pagkontrol sa Liwanag ng LED
- Bumubuo ng PWM gamit ang PIC Microcontroller na may MPLAB at XC8
- Pulse width Modulation (PWM) sa STM32F103C8: Pagkontrol ng Bilis ng DC Fan
- Bumubuo ng mga signal ng PWM sa mga GPIO na pin ng PIC Microcontroller
- Tutorial sa Raspberry Pi PWM
PWM Pins sa AVR Microcontroller Atmega16
Ang Atmega16 ay may apat na nakatuon na PWM na mga pin. Ang mga pin na ito ay PB3 (OC0), PD4 (OC1B), PD5 (OC1A), PD7 (OC2).
Gayundin ang Atmega16 ay may dalawang 8-bit timer at isang 16 bit timer. Ang Timer0 at Timer2 ay 8-bit timer habang ang Timer1 ay 16-bit timer. Upang makabuo ng PWM dapat kaming magkaroon ng isang pangkalahatang-ideya ng mga timer bilang ginagamit ang timer upang makabuo ng PWM. Tulad ng alam natin na ang dalas ay bilang ng mga cycle bawat segundo na pinapatakbo ng timer. Kaya't ang mas mataas na dalas ay magbibigay sa amin ng isang mas mabilis na timer. Sa pagbuo ng PWM, ang isang mas mabilis na dalas ng PWM ay magbibigay ng finer control sa output dahil maaari itong tumugon nang mas mabilis sa mga bagong cycle ng tungkulin ng PWM.
Sa tutorial na Atmega16 PWM na ito gagamitin namin ang Timer2. Maaari kang pumili ng anumang siklo ng tungkulin. Kung hindi mo alam kung ano ang duty cycle sa PWM pagkatapos talakayin natin nang maikling.
Ano ang isang PWM Signal?
Ang Pulse Width Modulation (PWM) ay isang digital signal na karaniwang ginagamit sa control circuitry. Ang oras kung saan mananatiling mataas ang signal ay tinatawag na "on time" at ang oras kung saan mananatiling mababa ang signal ay tinatawag na "off time". Mayroong dalawang mahalagang mga parameter para sa isang PWM tulad ng tinalakay sa ibaba:
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.
Tulad ng sa 100ms signal ng pulso, kung ang signal ay HIGAS para sa 50ms at LOW para sa 50ms, nangangahulugan ito na ang pulso ay kalahating oras HATAAS at kalahating oras na mababa. Kaya't masasabi nating 50% ang cycle ng tungkulin. Katulad nito kung ang pulso ay nasa 25ms MATAAS na estado at 75ms sa LOW state na wala sa 100ms, kung gayon ang cycle ng tungkulin ay magiging 25%. Pansinin na kinakalkula lamang namin ang tagal ng TAAS na estado. Maaari kang kumuha ng sanggunian ng larawan sa ibaba para sa pag-unawa sa visual. Ang pormula para sa ikot ng tungkulin ay pagkatapos,
Duty Cycle (%) = Sa Oras / (Sa Oras + Wala nang Oras)
Kaya, sa pamamagitan ng pagbabago ng cycle ng tungkulin maaari nating baguhin ang lapad ng PWM sa gayon magreresulta sa pagbabago ng LED brightness. Magkakaroon kami ng demo ng paggamit ng iba't ibang siklo ng tungkulin sa pagkontrol sa liwanag ng LED. Suriin ang demo na Video sa pagtatapos ng tutorial na ito.
Matapos mapili ang cycle ng tungkulin, ang susunod na hakbang ay ang pagpili ng PWM mode. Tinutukoy ng PWM Mode na paano mo nais na gumana ang PWM. Higit sa lahat ay may 3 uri ng mga mode na PWM. Ito ang mga sumusunod:
- Mabilis na PWM
- Tamang Yugto PWM
- Tamang Yugto at Dalas na Tamang PWM
Ginamit ang Mabilis na PWM kung saan hindi mahalaga ang pagbabago ng yugto. Sa pamamagitan ng paggamit ng Mabilis na PWM, maaari naming ma-output ang mga halaga ng PWM nang mabilis. Hindi magagamit ang Mabilis na PWM kung saan ang epekto ng pagbabago ng phase ang operasyon tulad ng kontrol sa motor, kaya sa naturang aplikasyon ay ginagamit ang iba pang Mga Mode ng PWM. Dahil makokontrol namin ang Liwanag ng LED kung saan hindi maaapektuhan ng malaki ang pagbabago, kaya gagamitin namin ang Mabilis na PWM mode.
Ngayon upang makabuo ng PWM makokontrol namin ang panloob na timer upang mabilang at pagkatapos ay itakda pabalik sa zero sa isang partikular na bilang, kaya't bibilangin ang timer at pagkatapos ay i-set pabalik sa zero nang paulit-ulit. Itinatakda nito ang panahon. Mayroon kaming pagpipilian ng pagkontrol sa isang pulso, pag-ON ng isang pulso sa isang tukoy na bilang sa timer habang umaakyat ito. Kapag ang counter ay bumalik sa 0, pagkatapos ay i-off ang pulso. Maraming kakayahang umangkop dito dahil palagi mong maa-access ang bilang ng timer at magbigay ng iba't ibang mga pulso na may isang solong timer. Mahusay ito kung nais mong kontrolin ang maramihang mga LED nang sabay-sabay. Ngayon simulan natin ang pag- interfaces ng isang LED sa Atmega16 para sa PWM.
Suriin ang lahat ng mga proyekto na nauugnay sa PWM dito.
Kinakailangan ang Mga Bahagi
- Atmega16 AVR Microcontroller IC
- 16Mhz Crystal Oscillator
- Dalawang 100nF Capacitor
- Dalawang 22pF Capacitor
- Push Button
- Jumper Wires
- Breadboard
- USBASP v2.0
- 2 Led (Anumang Kulay)
Diagram ng Circuit
Gumagamit kami ng OC2 para sa PWM ie Pin21 (PD7). Kaya't ikonekta ang isang LED sa PD7 pin ng Atmega16.
Programming Atmega16 para sa PWM
Ang kumpletong programa ay ibinibigay sa ibaba. Sunugin ang programa sa Atmega16 gamit ang JTAG at Atmel studio at makita ang PWM na epekto sa LED. Ang ningning nito ay tataas at babawasan ng dahan-dahan dahil sa magkakaibang pag-ikot ng tungkulin ng PWM. Suriin ang Video na ibinigay sa dulo.
Simulan ang pag-program ng Atmega16 sa pag-set up ng Timer2 Rehistro. Ang mga bitbit ng Timer2 na rehistro ay ang mga sumusunod at maaari naming itakda o i-reset ang mga piraso nang naaayon.
Ngayon tatalakayin namin ang tungkol sa lahat ng mga piraso ng Timer2 upang makuha natin ang ninanais na PWM gamit ang nakasulat na programa.
Higit sa lahat mayroong apat na bahagi sa pagrehistro ng Timer2:
FOC2 (Force Output Compare for Timer2): Ang FOC2 bit ay nakatakda kapag tinukoy ng mga WGM bits ang isang hindi PWM Mode.
WGM2 (Wave Generation Mode para sa Timer2): Kinokontrol ng mga bit na ito ang pagkakasunud-sunod ng pagbibilang ng counter, ang mapagkukunan para sa maximum (TOP) na halaga ng counter, at kung anong uri ng henerasyon ng waveform ang gagamitin.
COM2 (Ihambing ang Output Mode para sa Timer2): Kinokontrol ng mga bit na ito ang pag-uugali ng output. Ang kumpletong paglalarawan ng kaunti ay ipinaliwanag sa ibaba.
TCCR2 - = (1 <
Itakda ang WGM20 at WGM21 na mga bIT bilang TAAS upang mai-aktibo ang PWM Fast Mode. Ang WGM ay Nakatayo para sa Waveform Generation Mode. Ang mga piraso ng pagpipilian ay nasa ibaba.
WGM00 |
WGM01 |
Pagpapatakbo ng Timer2 Mode |
0 |
0 |
Karaniwang Mode |
0 |
1 |
CTC (I-clear ang Timer On Compare Match) |
1 |
0 |
PWM, Tamang Phase |
1 |
1 |
Mabilis na PWM Mode |
Para sa higit pang mga detalye sa Waveform Generation Mode, maaari kang mag-refer ng opisyal na datasheet ng Atmega16.
TCCR2 - = (1 <
Hindi rin namin ginamit ang anumang paunang pag-scale kaya itinakda namin ang rehistro ng mapagkukunang Clock bilang '001'.
Ang mga piraso ng pagpili ng Clock ay ang mga sumusunod:
CS22 |
CS21 |
CS20 |
Paglalarawan |
0 |
0 |
0 |
Walang mapagkukunan ng orasan (Huminto ang Timer / Counter) |
0 |
0 |
1 |
clk T2S / (Walang Prescaling) |
0 |
1 |
0 |
Clk T2S / 8 (Mula sa Prescaler) |
0 |
1 |
1 |
Clk T2S / 32 (Mula sa Prescaler) |
1 |
0 |
0 |
Clk T2S / 64 (Mula sa Prescaler) |
1 |
0 |
1 |
Clk T2S / 128 (Mula sa Prescaler) |
1 |
1 |
0 |
Clk T2S / 256 (Mula sa Prescaler) |
1 |
1 |
1 |
Clk T2S / 1024 (Mula sa Prescaler) |
Gayundin ang OC2 ay na-clear sa paghahambing ng tugma sa pamamagitan ng pagtatakda ng COM21 bilang '1' at COM20 bilang '0'.
Ang mga pagpipilian sa pagpipilian ng Compare Output Mode (COM) para sa Mabilis na PWM Mode ay ibinibigay sa ibaba:
COM21 |
COM21 |
Paglalarawan |
0 |
0 |
Karaniwang operasyon ng port, naka-disconnect ang OC2. |
0 |
1 |
Nakareserba |
1 |
0 |
I-clear ang OC2 sa Paghambingin ng tugma, Itakda ang OC2 sa TOP |
1 |
1 |
Itakda ang OC2 sa paghahambing ng tugma, i-clear ang OC2 sa TOP |
Taasan ang cycle ng tungkulin mula 0% hanggang 100% upang ang liwanag ay tataas sa paglipas ng panahon. Kumuha ng halaga mula 0-255 at ipadala ito sa OCR2 pin.
para sa (duty = 0; duty <255; duty ++) // 0 to max duty cycle { OCR2 = duty; // dahan-dahang taasan ang LED brightness _delay_ms (10); }
Katulad nito bawasan ang cycle ng tungkulin mula 100% hanggang 0% upang mabawasan nang maliwanag ang LED.
para sa (duty = 0; duty> 255; duty--) // max to 0 duty cycle { OCR2 = duty; // dahan-dahang bawasan ang LED brightness _delay_ms (10); }
Tinatapos nito ang aming Tutorial sa Paggamit ng PWM sa Atmega16 / 32.