- Ano ang isang PWM Signal?
- PWM gamit ang PIC16F877A:
- Programming PIC upang makabuo ng mga signal ng PWM:
- Mga Skematika at Pagsubok:
- Nagtatrabaho sa Hardware:
Ito ang aming ika-10 tutorial ng Pag- aaral ng mga microcontroller ng PIC gamit ang MPLAB at XC8. Hanggang ngayon, natakpan namin ang maraming pangunahing mga tutorial tulad ng LED na kumikislap sa PIC, timer sa PIC, interfacing LCD, interfacing 7-segment, ADC gamit ang PIC atbp Kung ikaw ay isang ganap na nagsisimula, pagkatapos ay mangyaring bisitahin ang kumpletong listahan ng mga tutorial sa PIC dito at simulang matuto.
Sa tutorial na ito, matututunan natin Paano gumawa ng mga signal ng PWM gamit ang PIC PIC16F877A. Ang aming PIC MCU ay may isang espesyal na modyul na tinatawag na Compare Capture module (CCP) na maaaring magamit upang makabuo ng mga signal ng PWM. Dito, bubuo kami ng isang PWM na 5 kHz na may variable cycle ng tungkulin mula 0% hanggang 100%. Upang maiiba ang cycle ng tungkulin na ginagamit namin ng isang potensyomiter, kaya inirerekumenda na malaman ang tutorial ng ADC bago magsimula sa PWM. Gumagamit din ang module ng PWM ng mga timer upang maitakda ang dalas nito kung kaya't alamin kung paano gamitin ang mga timer muna rito. Dagdag dito, sa tutorial na ito gagamitin namin ang isang RC circuit at isang LED upang i-convert ang mga halaga ng PWM sa Analog boltahe at gamitin ito para sa pagpapalabo ng ilaw na LED.
Ano ang isang PWM Signal?
Ang Pulse Width Modulation (PWM) ay isang digital signal na karaniwang ginagamit sa control circuitry. Ang signal na ito ay nakatakda nang mataas (5v) at mababa (0v) sa isang paunang natukoy na oras at bilis. 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. 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)
Dalas ng isang PWM:
Tinutukoy ng dalas ng isang signal ng PWM kung gaano kabilis ang isang PWM na nakumpleto sa isang panahon. Ang Isang Panahon ay kumpleto sa ON at OFF ng isang PWM signal tulad ng ipinakita sa itaas na pigura. Sa aming tutorial magtatakda kami ng dalas ng 5KHz.
PWM gamit ang PIC16F877A:
Ang mga signal ng PWM ay maaaring mabuo sa aming PIC Microcontroller sa pamamagitan ng paggamit ng module na CCP (Paghambingin ang Capture PWM). Ang resolusyon ng aming signal ng PWM ay 10-bit, iyon ay para sa halagang 0 magkakaroon ng isang cycle ng tungkulin na 0% at para sa isang halagang 1024 (2 ^ 10) magkakaroon ng isang cycle ng tungkulin na 100%. Mayroong dalawang mga module ng CCP sa aming PIC MCU (CCP1 At CCP2), nangangahulugan ito na makakabuo kami ng dalawang mga signal ng PWM sa dalawang magkakaibang mga pin (pin 17 at 16) nang sabay-sabay, sa aming tutorial na ginagamit namin ang CCP1 upang makabuo ng mga signal ng PWM sa pin 17.
Ang mga sumusunod na rehistro ay ginagamit upang makabuo ng mga signal ng PWM gamit ang aming PIC MCU:
- CCP1CON (Rehistro ng kontrol sa CCP1)
- T2CON (Timer 2 Control Rehistro)
- PR2 (Timer 2 modules Rehistro ng Panahon)
- CCPR1L (CCP Rehistro 1 Mababa)
Programming PIC upang makabuo ng mga signal ng PWM:
Sa aming programa ay babasahin namin ang isang boltahe ng Analog na 0-5v mula sa isang potensyomiter at i-map ito sa 0-1024 gamit ang aming ADC module. Pagkatapos ay bumuo kami ng isang signal ng PWM na may dalas na 5000Hz at naiiba ang cycle ng tungkulin batay sa input na boltahe ng Analog. Iyon ay 0-1024 ay i-convert sa 0% -100% Duty cycle. Ipinapalagay ng tutorial na ito na natutunan mo nang gamitin ang ADC sa PIC kung hindi, basahin ito mula dito, dahil laktawan namin ang mga detalye tungkol dito sa tutorial na ito.
Kaya, sa sandaling ang mga bit ng pagsasaayos ay nakatakda at ang programa ay nakasulat upang basahin ang isang halaga ng Analog, maaari tayong magpatuloy sa PWM.
Ang mga sumusunod na hakbang ay dapat gawin kapag nag-configure ng module ng CCP para sa pagpapatakbo ng PWM:
- Itakda ang panahon ng PWM sa pamamagitan ng pagsulat sa rehistro ng PR2.
- Itakda ang siklo ng tungkulin ng PWM sa pamamagitan ng pagsulat sa rehistro ng CCPR1L at CCP1CON <5: 4> na mga piraso.
- Gawin ang CCP1 pin isang output sa pamamagitan ng pag-clear sa TRISC <2> bit.
- Itakda ang TMR2 prescale na halaga at paganahin ang Timer2 sa pamamagitan ng pagsulat sa T2CON.
- I-configure ang module ng CCP1 para sa pagpapatakbo ng PWM.
Mayroong dalawang mahahalagang pag-andar sa program na ito upang makabuo ng mga signal ng PWM. Ang isa ay ang pag- andar ng PWM_Initialize () na kung saan ay sisimulan ang mga rehistro na kinakailangan upang i-set up ang module na PWM at pagkatapos ay itakda ang dalas kung saan dapat gumana ang PWM, ang iba pang pagpapaandar ay ang pagpapaandar na PWM_Duty () na magtatakda ng cycle ng tungkulin ng signal ng PWM sa ang mga kinakailangang rehistro.
PWM_Initialize () {PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1; // Pagtatakda ng mga formula ng PR2 gamit ang Datasheet // Ginagawa ang PWM na gumagana sa 5KHZ CCP1M3 = 1; CCP1M2 = 1; // Configure the CCP1 module T2CKPS0 = 1; T2CKPS1 = 0; TMR2ON = 1; // Configure the Timer module TRISC2 = 0; // gumawa ng port pin sa C bilang output}
Ang pagpapaandar sa itaas ay ang PWM na nagpasimula ng pagpapaandar, sa pagpapaandar na ito Ang CCP1 module ay nakatakda upang magamit ang PWM sa pamamagitan ng paggawa ng medyo CCP1M3 at CCP1M2 bilang mataas.
Ang prescaler ng module ng timer ay itinakda sa pamamagitan ng paggawa ng kaunting T2CKPS0 bilang mataas at T2CKPS1 bilang mababa ang kaunting TMR2ON ay nakatakda upang simulan ang timer.
Ngayon, kailangan nating itakda ang Dalas ng signal ng PWM. Ang halaga ng dalas ay kailangang nakasulat sa rehistro ng PR2. Ang nais na dalas ay maaaring itakda sa pamamagitan ng paggamit ng mga formula sa ibaba
PWM Period = * 4 * TOSC * (Halaga ng Prescale ng TMR2)
Ang pag-aayos ng mga formula na ito upang makakuha ng PR2 ay ibibigay
PR2 = (Panahon / (4 * Tosc * TMR2 Prescale)) - 1
Alam namin ang Panahon = (1 / PWM_freq) at Tosc = (1 / _XTAL_FREQ). Samakatuwid…..
PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1;
Kapag naitakda ang dalas ang pagpapaandar na ito ay hindi na dapat tawaging muli maliban at hanggang kailangan nating baguhin ulit ang dalas. Sa aming tutorial nagtalaga ako ng PWM_freq = 5000; upang maaari kaming makakuha ng isang 5 KHz dalas ng operating para sa aming PWM signal.
Ngayon ay itakda natin ang cycle ng tungkulin ng PWM sa pamamagitan ng paggamit ng pagpapaandar sa ibaba
PWM_Duty (unsigned int duty) {if (duty <1023) {duty = ((float) duty / 1023) * (_ XTAL_FREQ / (PWM_freq * TMR2PRESCALE)); // Sa pagbawas // duty = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE); CCP1X = tungkulin at 1; // Store the 1st bit CCP1Y = duty & 2; // Store the 0th bit CCPR1L = duty >> 2; // Iimbak ang remining 8 bit}}
Ang aming signal ng PWM ay may 10-bit na resolusyon samakatuwid ang halagang ito ay hindi maiimbak sa isang solong rehistro dahil ang aming PIC ay may lamang mga 8-bit na linya ng data. Kaya't mayroon tayong magamit sa iba pang dalawang piraso ng CCP1CON <5: 4> (CCP1X at CCP1Y) upang maiimbak ang huling dalawang LSB at pagkatapos ay maiimbak ang natitirang 8 piraso sa Rehistro ng CCPR1L.
Ang oras ng pag-ikot ng tungkulin ng PWM ay maaaring kalkulahin sa pamamagitan ng paggamit ng mga formula sa ibaba:
PWM Duty Cycle = (CCPRIL: CCP1CON <5: 4>) * Tosc * (Halaga ng Prescale ng TMR2)
Ang pag-aayos ng mga formula na ito upang makakuha ng halaga ng CCPR1L at CCP1CON ay magbibigay:
CCPRIL: CCP1Con <5: 4> = PWM Duty Cycle / (Tosc * TMR2 Prescale Value)
Ang halaga ng aming ADC ay magiging 0-1024 kailangan namin iyon upang nasa 0% -100% samakatuwid, PWM Duty Cycle = duty / 1023. Dagdag pa upang mai-convert ang cycle ng tungkulin na ito sa isang tagal ng oras kailangan nating i-multiply ito sa panahon (1 / PWM_freq)
Alam din natin na ang Tosc = (1 / PWM_freq), kaya..
Tungkulin = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE);
Ang paglutas sa equation sa itaas ay magbibigay sa amin:
Tungkulin = ((float) duty / 1023) * (_XTAL_FREQ / (PWM_freq * TMR2PRESCALE));
Maaari mong suriin ang kumpletong programa sa seksyon ng Code sa ibaba kasama ang detalyadong Video.
Mga Skematika at Pagsubok:
Tulad ng dati ipaalam sa amin i-verify ang output gamit ang Proteus simulation. Ang Circuit Diagram ay ipinapakita sa ibaba.
Ikonekta ang isang potensyomiter sa ika- 7 na pin upang pakainin sa isang boltahe na 0-5. Ang module ng CCP1 ay may pin 17 (RC2), dito mabubuo ang PWM na maaaring mapatunayan gamit ang Digital oscilloscope. Dagdag dito upang mai-convert ito sa isang variable na boltahe nagamit namin ang isang RC-filter at isang LED upang i-verify ang output nang walang saklaw.
Ano ang isang RC-Filter?
Ang isang RC filter o isang Low pass filter ay isang simpleng circuit na may dalawang mga passive na sangkap na katulad ng risistor at ang capacitor. Ang dalawang sangkap na ito ay ginagamit upang salain ang dalas ng aming PWM signal at gawin itong isang variable na boltahe DC.
Kung susuriin natin ang circuit, kapag ang isang variable na boltahe ay inilapat sa pag-input ng R, magsisimulang singilin ang capacitor C. Batay ngayon sa halaga ng capacitor, ang capacitor ay magtatagal ng ilang oras upang ganap na masingil, sa sandaling sisingilin ito ay harangan ang kasalukuyang DC (Tandaan ang mga capacitor block DC ngunit pinapayagan ang AC) samakatuwid ang input DC boltahe ay lilitaw sa buong output. Ang mataas na dalas ng PWM (AC signal) ay mai-grounded sa pamamagitan ng capacitor. Sa gayon ang isang dalisay na DC ay nakuha sa buong kapasitor. Ang isang halaga ng 1000Ohm at 1uf ay natagpuan na angkop para sa proyektong ito. Ang pagkalkula ng mga halaga ng R at C ay nagsasangkot sa pag-aaral ng circuit gamit ang paglipat ng function, na wala sa saklaw ng tutorial na ito.
Ang output ng programa ay maaaring mapatunayan gamit ang Digital Oscilloscope tulad ng ipinakita sa ibaba, ibahin ang Potentiometer at ang Duty cycle ng PWM dapat baguhin. Maaari din nating mapansin ang output boltahe ng RC circuit gamit ang Voltmeter. Kung gumagana ang lahat tulad ng inaasahan maaari kaming magpatuloy sa aming hardware. Karagdagang suriin ang Video sa dulo para sa buong proseso.
Nagtatrabaho sa Hardware:
Ang pag-setup ng hardware ng proyekto ay napaka-simple, gagamitin lamang namin ang muling paggamit ng aming PIC Perf board na ipinakita sa ibaba.
Kakailanganin din namin ang isang potensyomiter upang pakainin ang analog boltahe, nakalakip ako ng ilang mga babaeng end wire sa aking palayok (ipinakita sa ibaba) upang direktang ikonekta namin ang mga ito sa PIC Perf board.
Panghuli upang ma-verify ang output kailangan namin ng isang RC circuit at isang LED upang makita kung paano gumagana ang signal ng PWM, simpleng ginamit ko ang isang maliit na perf board at solder ang RC circuit at ang LED (upang makontrol ang liwanag) dito tulad ng ipinakita sa ibaba
Maaari naming gamitin ang simpleng babae sa mga babaeng nagkokonekta na mga wire at ikonekta ang mga ito ayon sa mga iskematiko na ipinakita sa itaas. Kapag tapos na ang koneksyon, i-upload ang programa sa PIC gamit ang aming pickit3 at dapat kang makakuha ng isang variable na boltahe batay sa pag-input ng iyong potensyomiter. Ginagamit ang variable na output upang makontrol ang liwanag ng LED dito.
Ginamit ko ang aking multimeter upang masukat ang mga variable na output, maaari din naming mapansin ang ningning ng LED na nabago para sa iba't ibang mga antas ng boltahe.
Iyon lang ang na-program namin upang mabasa ang Analog boltahe mula sa POT at i-convert sa mga signal ng PWM na sa gayon ay na-convert sa Variable boltahe gamit ang RC filter at ang resulta ay napatunayan gamit ang aming hardware. Kung mayroon kang ilang pag-aalinlangan o natigil sa isang lugar na mabait gamitin ang seksyon ng komento sa ibaba, ikalulugod naming matulungan ka. Gumagawa ang kumpletong pagtatrabaho sa video.
Suriin din ang aming iba pang Mga PWM Tutorial sa iba pang mga microcontroller:
- Tutorial sa Raspberry Pi PWM
- PWM na may Arduino Dahil
- Batay sa Arduino LED Dimmer gamit ang PWM
- Power LED Dimmer gamit ang ATmega32 Microcontroller