- Kaj je signal PWM?
- PWM z uporabo PIC16F877A:
- Programiranje PIC za generiranje PWM signalov:
- Sheme in preskušanje:
- Delo na strojni opremi:
To je naša 10. vadnica učenja mikrokrmilnikov PIC z uporabo MPLAB in XC8. Do sedaj smo obravnavali številne osnovne vaje, kot je utripanje LED s PIC, merilniki časa v PIC, povezovanje LCD-jev, povezovanje 7-segmentov, ADC z uporabo PIC itd. Če ste absolutni začetnik, obiščite celoten seznam vadnic PIC tukaj in začnite se učiti.
V tej vadnici bomo izvedeli, kako ustvariti PWM signale s pomočjo PIC PIC16F877A. Naš PIC MCU ima poseben modul, imenovan Compare Capture module (CCP), ki se lahko uporablja za generiranje PWM signalov. Tu bomo ustvarili PWM 5 kHz s spremenljivim delovnim ciklom od 0% do 100%. Za spreminjanje delovnega cikla uporabljamo potenciometer, zato je priporočljivo, da se pred začetkom s PWM naučite vadnice ADC. PWM modul uporablja tudi časovnike za nastavitev njegove frekvence, zato se tukaj prej naučite, kako uporabljati časovnike. Nadalje bomo v tej vadnici uporabili RC vezje in LED za pretvorbo vrednosti PWM v analogno napetost in jo uporabili za zatemnitev LED luči.
Kaj je signal PWM?
Modulacija širine impulza (PWM) je digitalni signal, ki se najpogosteje uporablja v krmilnih vezjih. Ta signal je nastavljen na visoko (5v) in nizko (0v) v vnaprej določenem času in hitrosti. Čas, v katerem signal ostane visok, se imenuje "on time", čas, v katerem signal ostane nizek, pa "off time". Kot sta opisana spodaj, obstajata dva pomembna parametra za PWM:
Delovni cikel PWM:
Odstotek časa, v katerem signal PWM ostane VISOK (pravočasno), se imenuje delovni cikel. Če je signal vedno vklopljen, je v 100% obratovalnem ciklu in če je vedno izklopljen, je 0% obratovalni cikel.
Delovni cikel = čas vklopa / (čas vklopa + čas izklopa)
Pogostost PWM:
Pogostost signala PWM določa, kako hitro PWM zaključi eno obdobje. Eno obdobje je končano VKLOP in IZKLOP signala PWM, kot je prikazano na zgornji sliki. V naši vadnici bomo nastavili frekvenco 5KHz.
PWM z uporabo PIC16F877A:
Signale PWM lahko generiramo v našem mikrokrmilniku PIC z uporabo modula CCP (Compare Capture PWM). Ločljivost našega signala PWM je 10-bitna, to pomeni, da bo za vrednost 0 delovni cikel 0%, za vrednost 1024 (2 ^ 10) pa bo delovni cikel 100%. V našem PIC MCU sta dva modula CCP (CCP1 in CCP2), to pomeni, da lahko hkrati generiramo dva signala PWM na dveh različnih nožicah (pin 17 in 16), v naši vadnici pa CCP1 uporabljamo za generiranje signalov PWM na pin 17.
Naslednji registri se uporabljajo za generiranje PWM signalov z uporabo našega PIC MCU:
- CCP1CON (nadzorni register CCP1)
- T2CON (nadzorni register časovnika 2)
- PR2 (registracija obdobja modulov časovnika 2)
- CCPR1L (CCP Register 1 Low)
Programiranje PIC za generiranje PWM signalov:
V našem programu bomo s potenciometra odčitali analogno napetost 0-5v in jo z našim ADC modulom preslikali na 0-1024. Nato ustvarimo PWM signal s frekvenco 5000Hz in spremenimo njegov obratovalni cikel glede na vhodno analogno napetost. To pomeni, da se 0-1024 pretvori v 0% -100% delovnega cikla. Ta vadnica predpostavlja, da ste se že naučili uporabljati ADC v PIC, če ne, preberite si jo od tukaj, ker bomo v tej vadnici preskočili podrobnosti o tem.
Ko so nastavljeni konfiguracijski bitji in je program napisan za branje analogne vrednosti, lahko nadaljujemo s PWM.
Pri konfiguraciji modula CCP za delovanje PWM je treba izvesti naslednje korake:
- Nastavite obdobje PWM s pisanjem v register PR2.
- Nastavite delovni cikel PWM tako, da zapišete v register CCPR1L in CCP1CON <5: 4> bitov.
- Naredite CCP1 pin izhodom, tako da počistite bit TRISC <2>.
- Nastavite vrednost predkale TMR2 in omogočite Timer2 s pisanjem na T2CON.
- Konfigurirajte modul CCP1 za delovanje PWM.
V tem programu sta dve pomembni funkciji za generiranje PWM signalov. Ena je funkcija PWM_Initialize (), ki bo inicializirala registre, potrebne za nastavitev modula PWM in nato nastavila frekvenco, s katero naj deluje PWM, druga funkcija pa je funkcija PWM_Duty (), ki bo določila delovni cikel signala PWM v zahtevane registre.
PWM_Initialize () {PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1; // Nastavitev formul PR2 s pomočjo podatkovnega lista // PWM deluje v 5KHZ CCP1M3 = 1; CCP1M2 = 1; // Konfigurirajte modul CCP1 T2CKPS0 = 1; T2CKPS1 = 0; TMR2ON = 1; // Konfigurirajte modul časovnika TRISC2 = 0; // naredimo pin na C kot izhod}
Zgornja funkcija je funkcija inicializacije PWM, pri tej funkciji je modul CCP1 nastavljen za uporabo PWM, tako da sta bit CCP1M3 in CCP1M2 najvišja.
Predkaler modula časovnika se nastavi tako, da je bit T2CKPS0 tako visok, T2CKPS1 pa najnižji, da je bit TMR2ON nastavljen za zagon časovnika.
Zdaj moramo nastaviti frekvenco signala PWM. Vrednost frekvence je treba zapisati v register PR2. Želeno frekvenco lahko nastavite z uporabo spodnjih formul
Obdobje PWM = * 4 * TOSC * (vrednost predkale TMR2)
Preurejanje teh formul, da dobimo PR2, bo dalo
PR2 = (Obdobje / (4 * Tosc * TMR2 Prescale)) - 1
Vemo, da je obdobje = (1 / PWM_freq) in Tosc = (1 / _XTAL_FREQ). Zato…..
PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1;
Ko je frekvenca nastavljena, te funkcije ni treba ponovno klicati, razen če in dokler ne bomo morali frekvence ponovno spremeniti. V naši vadnici sem dodelil PWM_freq = 5000; tako da lahko dobimo 5 KHz delovno frekvenco za naš PWM signal.
Zdaj nastavimo delovni cikel PWM z uporabo spodnje funkcije
PWM_Duty (nepodpisana int duty) {if (duty <1023) {duty = ((float) duty / 1023) * (_ XTAL_FREQ / (PWM_freq * TMR2PRESCALE)); // ob znižanju // dajatev = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE); CCP1X = dajatev & 1; // shranimo 1. bit CCP1Y = duty & 2; // shranimo 0-bitni CCPR1L = duty >> 2; // shranimo 8-bitni pomnilnik}}
Naš signal PWM ima 10-bitno ločljivost, zato te vrednosti ni mogoče shraniti v en sam register, ker ima naš PIC samo 8-bitne podatkovne črte. Torej moramo uporabiti druga dva bita CCP1CON <5: 4> (CCP1X in CCP1Y) za shranjevanje zadnjih dveh LSB, nato pa preostalih 8 bitov v register CCPR1L.
Čas obratovanja PWM lahko izračunamo z uporabo spodnjih formul:
Delovni cikel PWM = (CCPRIL: CCP1CON <5: 4>) * Tosc * (vrednost predkale TMR2)
Preurejanje teh formul, da dobimo vrednost CCPR1L in CCP1CON, bo dalo:
CCPRIL: CCP1Con <5: 4> = delovni cikel PWM / (vrednost prescale Tosc * TMR2)
Vrednost našega ADC bo 0-1024, to pa mora biti od 0% do 100%, torej delovni cikel PWM = dajatev / 1023. Če želimo ta delovni cikel pretvoriti v časovno obdobje, ga moramo pomnožiti z obdobjem (1 / PWM_freq)
Vemo tudi, da je Tosc = (1 / PWM_freq), torej..
Dajatev = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE);
Rešitev zgornje enačbe nam bo dala:
Dajatev = ((plavajoča) dajatev / 1023) * (_XTAL_FREQ / (PWM_freq * TMR2PRESCALE));
Celoten program lahko preverite v spodnjem odseku kode skupaj s podrobnim videoposnetkom.
Sheme in preskušanje:
Kot ponavadi preverimo izhod s simulacijo Proteus. Shema vezja je prikazana spodaj.
Priključite potenciometer do 7 th pin za krmo na napetost 0-5. Modul CCP1 je z zatičem 17 (RC2), tu se ustvari PWM, ki ga je mogoče preveriti z digitalnim osciloskopom. Za pretvorbo tega v spremenljivo napetost smo uporabili RC-filter in LED za preverjanje izhoda brez obsega.
Kaj je RC-filter?
RC filter ali akcije nizkopasovno je preprosta vezja z dvema pasivnih elementov in sicer upora in kondenzatorja. Ti dve komponenti se uporabljata za filtriranje frekvence našega signala PWM in spreminjanje enosmerne napetosti.
Če preučimo vezje, ko se na vhod R uporabi spremenljiva napetost, se bo kondenzator C začel polniti. Zdaj na podlagi vrednosti kondenzatorja bo kondenzator potreboval nekaj časa, da se popolnoma napolni, ko bo napolnjen, bo blokiral enosmerni tok (ne pozabite, da kondenzatorji blokirajo enosmerni tok, vendar omogoča izmenični tok), zato se bo vhodna enosmerna napetost pojavila na izhodu. Visokofrekvenčni PWM (AC signal) bo ozemljen skozi kondenzator. Tako dobimo čist enosmerni tok čez kondenzator. Ugotovljeno je bilo, da je vrednost 1000Ohm in 1uf primerna za ta projekt. Izračun vrednosti R in C vključuje analizo vezja z uporabo prenosne funkcije, ki je zunaj obsega te vadnice.
Izhod programa je mogoče preveriti z digitalnim osciloskopom, kot je prikazano spodaj, spremenite potenciometer in delovni cikel PWM se mora spremeniti. Z voltmetrom lahko opazimo tudi izhodno napetost RC vezja. Če vse deluje po pričakovanjih, lahko nadaljujemo s svojo strojno opremo. Nadalje na koncu preverite celoten postopek.
Delo na strojni opremi:
Nastavitev strojne opreme projekta je zelo preprosta, le ponovno bomo uporabili našo ploščo PIC Perf, prikazano spodaj.
Za napajanje analogne napetosti potrebujemo tudi potenciometer, na svoj lonec sem pritrdil nekaj ženskih končnih žic (prikazano spodaj), da jih lahko neposredno priključimo na ploščo PIC Perf.
Na koncu za potrditev izhoda potrebujemo RC vezje in LED, da vidimo, kako deluje signal PWM, preprosto sem uporabil majhno ploščo in nanj prilepil RC vezje in LED (za nadzor svetlosti), kot je prikazano spodaj
Lahko uporabimo preproste ženske do ženske povezovalne žice in jih povežemo v skladu z zgornjo shemo. Ko je povezava končana, naložite program na PIC z našim pickit3 in dobili bi lahko spremenljivo napetost glede na vhod vašega potenciometra. Spremenljiv izhod se uporablja za nadzor svetlosti LED tukaj.
Z multimeterom sem meril spremenljive izhode, opazimo lahko tudi spreminjanje svetlosti LED za različne ravni napetosti.
To je vse, kar smo programirali za odčitavanje analogne napetosti iz POT-a in pretvorbo v PWM-signale, ki so bili nato pretvorjeni v spremenljivo napetost z uporabo RC-filtra, rezultat pa preverjen z našo strojno opremo. Če dvomite ali se kje zataknete, prosimo, uporabite spodnji odsek za komentarje, z veseljem vam bomo pomagali. Celoten delovni deluje v videu.
Preverite tudi druge vadnice PWM o drugih mikrokrmilnikih:
- Vadnica za PWM Raspberry Pi
- PWM z Arduino zaradi
- LED zatemnilnik na osnovi Arduina z uporabo PWM
- LED zatemnitev napajanja z uporabo mikrokrmilnika ATmega32