- Kas yra PWM signalas?
- PWM naudojant PIC16F877A:
- PIC programavimas generuoti PWM signalus:
- Schemos ir testavimas:
- Darbas su aparatine įranga:
Tai yra 10-oji mūsų mokymo programa, kaip išmokti PIC mikrovaldiklius naudojant MPLAB ir XC8. Iki šiol mes apėmėme daugybę pagrindinių pamokų, tokių kaip LED mirksi su PIC, laikmačiai PIC, sąsaja su LCD, sąsaja su 7 segmentais, ADC, naudojant PIC ir tt pradėti mokytis.
Šioje pamokoje sužinosime, kaip generuoti PWM signalus naudojant PIC PIC16F877A. Mūsų PIC MCU turi specialų modulį, vadinamą palyginimo fiksavimo moduliu (CCP), kuris gali būti naudojamas PWM signalams generuoti. Čia sukursime 5 kHz PWM, kurio darbo ciklas bus nuo 0% iki 100%. Norėdami pakeisti darbo ciklą, mes naudojame potenciometrą, todėl prieš pradedant PWM rekomenduojama išmokti ADC pamoką. PWM modulis taip pat naudoja laikmačius, kad nustatytų savo dažnį, taigi čia iš anksto sužinokite, kaip naudoti laikmačius. Be to, šioje pamokoje mes naudosime RC grandinę ir šviesos diodą, kad PWM reikšmės būtų konvertuojamos į analoginę įtampą ir naudosime ją šviesos diodo pritemdymui.
Kas yra PWM signalas?
Pulso pločio moduliacija (PWM) yra skaitmeninis signalas, kuris dažniausiai naudojamas valdymo grandinėse. Šis signalas nustatytas iš anksto (5v) ir žemas (0v) iš anksto nustatytu laiku ir greičiu. Laikas, per kurį signalas išlieka aukštas, vadinamas „įjungimo laiku“, o laikas, per kurį signalas lieka žemas, vadinamas „išjungimo laiku“. Yra du svarbūs PWM parametrai, kaip aptarta toliau:
PWM darbo ciklas:
Laiko procentas, per kurį PWM signalas lieka AUKŠTAS (laiku), vadinamas darbo ciklu. Jei signalas visada įjungtas, jis yra 100% darbo ciklo, o jei jis visada išjungtas, jis yra 0%.
Darbo ciklas = Įjungti laiką / (Įjungti laiką + Išjungti laiką)
PWM dažnis:
PWM signalo dažnis lemia, kaip greitai PWM užbaigia vieną periodą. Vienas periodas yra PWM signalo įjungimas ir išjungimas, kaip parodyta aukščiau pateiktame paveikslėlyje. Savo pamokoje nustatysime 5KHz dažnį.
PWM naudojant PIC16F877A:
PWM signalus galima generuoti mūsų PIC mikrovaldiklyje naudojant CCP (Compare Capture PWM) modulį. Mūsų PWM signalo skiriamoji geba yra 10 bitų, tai yra, kai reikšmė 0 bus 0% darbo ciklas, o 1024 (2 ^ 10) reikšmė - 100%. Mūsų PIC MCU yra du CCP moduliai (CCP1 ir CCP2), tai reiškia, kad vienu metu galime generuoti du PWM signalus ant dviejų skirtingų kaiščių (17 ir 16 kontaktų), mūsų pamokoje mes naudojame CCP1, kad generuotume PWM signalus ant 17 kaiščio.
Šie registrai naudojami generuoti PWM signalus naudojant mūsų PIC MCU:
- CCP1CON (CCP1 kontrolės registras)
- T2CON (2 laikmačio valdymo registras)
- PR2 (2 laikmačio moduliai, laikotarpių registras)
- CCPR1L (žemas CCP registras)
PIC programavimas generuoti PWM signalus:
Savo programoje mes perskaitysime analoginę 0-5v įtampą iš potenciometro ir susiesime ją su 0-1024 naudodami mūsų ADC modulį. Tada mes generuojame 5000 Hz dažnio PWM signalą ir keičiame jo veikimo ciklą pagal įvesties analoginę įtampą. Tai yra 0–1024, bus konvertuotas į 0–100% darbo ciklą. Šioje pamokoje daroma prielaida, kad jūs jau išmokote naudoti ADC PIC, jei ne, perskaitykite jį čia, nes mes praleisime išsamią informaciją apie tai šioje pamokoje.
Taigi, nustačius konfigūracijos bitus ir parašius programą skaityti analoginę reikšmę, galime tęsti PWM.
Konfigūruojant pagrindinio sandorio modulį PWM veikimui reikia atlikti šiuos veiksmus:
- Nustatykite PWM laikotarpį rašydami į PR2 registrą.
- Nustatykite PWM darbo ciklą rašydami į CCPR1L registrą ir CCP1CON <5: 4> bitus.
- Padarykite CCP1 kaištį išvestį išvalydami TRISC <2> bitą.
- Nustatykite TMR2 išankstinio lygio vertę ir įjunkite „Timer2“ rašydami į T2CON.
- Konfigūruokite CCP1 modulį PWM veikimui.
Šioje programoje yra dvi svarbios funkcijos generuoti PWM signalus. Viena yra funkcija PWM_Initialize (), kuri inicijuos registrus, reikalingus PWM moduliui nustatyti, ir tada nustatys dažnį, kuriuo PWM turėtų veikti, kita funkcija yra funkcija PWM_Duty (), kuri nustatys PWM signalo veikimo ciklą. reikalingus registrus.
PWM_Initialize () {PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1; // PR2 formulių nustatymas naudojant duomenų lapą // PWM veikia 5KHZ CCP1M3 = 1; CCP1M2 = 1; // Konfigūruokite CCP1 modulį T2CKPS0 = 1; T2CKPS1 = 0; TMR2ON = 1; // Konfigūruokite laikmačio modulį TRISC2 = 0; // padaryti prievado kaištį C kaip išvestį}
Pirmiau nurodyta funkcija yra PWM inicializavimo funkcija, šioje funkcijoje CCP1 modulis yra nustatytas naudoti PWM, padarant bitų CCP1M3 ir CCP1M2 aukštus.
Laikmačio modulio išankstinis skaleris nustatomas taip, kad bitai T2CKPS0 būtų tokie dideli, o T2CKPS1 - tokie žemi, kad būtų nustatytas laikmatis, kad TMR2ON būtų nustatytas.
Dabar turime nustatyti PWM signalo dažnį. Dažnio reikšmė turi būti įrašyta į PR2 registrą. Norimą dažnį galima nustatyti naudojant toliau pateiktas formules
PWM laikotarpis = * 4 * TOSC * (TMR2 išankstinė vertė)
Pertvarkę šias formules, gausite PR2
PR2 = (laikotarpis / (4 * Tosc * TMR2 išankstinė skalė)) - 1
Mes žinome, kad laikotarpis = (1 / PWM_freq) ir Tosc = (1 / _XTAL_FREQ). Todėl…..
PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1;
Nustačius dažnį, šios funkcijos nebereikia kviesti, nebent ir kol mums vėl reikės keisti dažnį. Mūsų pamokoje aš priskyriau PWM_freq = 5000; kad galėtume gauti 5 KHz PWM signalo veikimo dažnį.
Dabar nustatykime PWM darbo ciklą naudodami žemiau pateiktą funkciją
PWM_Duty (nepasirašytas tarptinklinis mokestis) {if (muitas <1023) {muitas = ((plūduriuojantis) muitas / 1023) * (_ XTAL_FREQ / (PWM_freq * TMR2PRESCALE)); // Dėl sumažinimo // muitas = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE); CCP1X = pareiga & 1; // Laikykite 1 bitą CCP1Y = duty & 2; // Saugokite 0 bitų CCPR1L = duty >> 2; // Laikykite 8 bitų atmintį}}
Mūsų PWM signalo skiriamoji geba yra 10 bitų, todėl šios vertės negalima laikyti viename registre, nes mūsų PIC turi tik 8 bitų duomenų linijas. Taigi mes naudojamės kitais dviem CCP1CON bitais <5: 4> (CCP1X ir CCP1Y), kad išsaugotume du paskutinius LSB, o tada likusius 8 bitus - CCPR1L registre.
PWM darbo ciklo trukmę galima apskaičiuoti naudojant šias formules:
PWM darbo ciklas = (CCPRIL: CCP1CON <5: 4>) * Tosc * (TMR2 išankstinio lygio vertė)
Pertvarkę šias formules, kad gautumėte CCPR1L ir CCP1CON vertę, gausite:
CCPRIL: CCP1Con <5: 4> = PWM darbo ciklas / („Tosc * TMR2 Prescale Value“)
Mūsų ADC vertė bus 0–1024, todėl mums reikia, kad tai būtų 0–100%, taigi PWM muito ciklas = muitas / 1023. Norėdami konvertuoti šį darbo ciklą į laikotarpį, turime jį padauginti iš laikotarpio (1 / PWM_freq)
Mes taip pat žinome, kad Tosc = (1 / PWM_freq), taigi..
Muitas = (((plūduriuojantis) muitas / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE);
Išsprendę aukščiau pateiktą lygtį, gausime:
Muitas = ((plūduriuojantis) muitas / 1023) * (_XTAL_FREQ / (PWM_freq * TMR2PRESCALE));
Galite patikrinti visą programą žemiau esančiame skyriuje Kodas kartu su išsamiu vaizdo įrašu.
Schemos ir testavimas:
Kaip įprasta, patikrinkime išvestį naudodami „Proteus“ modeliavimą. Jungimo schema yra parodyta žemiau.
Prijunkite potenciometrą prie 7 -ojo kaiščio, kad įtampa būtų 0–5. CCP1 modulis yra su kaiščiu 17 (RC2), čia bus sukurtas PWM, kurį galima patikrinti naudojant skaitmeninį osciloskopą. Norėdami tai konvertuoti į kintamą įtampą, mes panaudojome RC filtrą ir šviesos diodą, kad patikrintume išėjimą be taikymo srities.
Kas yra RC filtras?
RC filtras arba žemo dažnio filtras yra paprastas grandinė su dviem pasyviųjų elementų, būtent rezistorius ir kondensatorių. Šie du komponentai naudojami filtruoti mūsų PWM signalo dažnį ir padaryti jį kintama nuolatine įtampa.
Jei ištirsime grandinę, kai R įėjimui bus taikoma kintama įtampa, kondensatorius C pradės krauti. Dabar, atsižvelgiant į kondensatoriaus vertę, kondensatorius užtruks šiek tiek laiko, kol jis bus visiškai įkrautas, kai jis bus įkrautas, jis užblokuos nuolatinę srovę (prisiminkite kondensatorių blokavimą DC, bet leidžia AC), taigi įvesties nuolatinė įtampa pasirodys išvestyje. Aukšto dažnio PWM (kintamosios srovės signalas) bus įžemintas per kondensatorių. Taigi kondensatoriuje gaunama gryna nuolatinė srovė. Buvo nustatyta, kad 1000Ohm ir 1uf vertė buvo tinkama šiam projektui. Apskaičiuojant R ir C reikšmes, reikia atlikti grandinės analizę naudojant perdavimo funkciją, kuri nepatenka į šios mokymo programos taikymo sritį.
Programos išvestį galima patikrinti naudojant skaitmeninį osciloskopą, kaip parodyta žemiau, keiskite potenciometrą ir PWM darbo ciklas turėtų pasikeisti. Taip pat galime pastebėti RC grandinės išėjimo įtampą naudodami voltmetrą. Jei viskas veikia taip, kaip tikėtasi, galime tęsti aparatinę įrangą. Pabaigoje patikrinkite, ar vaizdo įrašas baigtas.
Darbas su aparatine įranga:
Projekto aparatinės įrangos sąranka yra labai paprasta, mes tiesiog pakartotinai panaudosime toliau pateiktą mūsų PIC Perf plokštę.
Mums taip pat reikės potenciometro, kad maitintume analoginę įtampą, prie savo puodo pridedu keletą moteriškų galų laidų (parodyta žemiau), kad galėtume tiesiogiai juos prijungti prie „PIC Perf“ plokštės.
Galiausiai, norėdamas patikrinti išvestį, mums reikia RC grandinės ir šviesos diodo, kad pamatytume, kaip veikia PWM signalas, aš tiesiog panaudojau mažą perf plokštę ir prilitavau RC grandinę ir šviesos diodą (ryškumui valdyti), kaip parodyta žemiau
Mes galime naudoti paprastus moteriškus ir moteriškus jungiamuosius laidus ir prijungti juos pagal aukščiau pateiktas schemas. Atlikus ryšį, įkelkite programą į PIC naudodami mūsų „pickit3“ ir turėtumėte sugebėti gauti kintamą įtampą pagal savo potenciometro įvestį. Kintama išvestis naudojama norint reguliuoti šviesos diodo ryškumą čia.
Aš naudoju savo multimetrą kintamiems išėjimams matuoti, taip pat galime pastebėti, kad šviesos diodo ryškumas keičiasi esant skirtingiems įtampos lygiams.
Štai ką mes užprogramavome skaityti analoginę įtampą iš POT ir konvertuoti į PWM signalus, kurie savo ruožtu buvo paversti kintama įtampa naudojant RC filtrą, o rezultatas patikrinamas naudojant mūsų aparatinę įrangą. Jei abejojate ar kažkur užstrigote, maloniai naudokitės žemiau esančia komentarų skiltimi, mielai jums padėsime. Visas darbas veikia vaizdo įraše.
Taip pat patikrinkite kitas mūsų mikrovaldiklių PWM mokymo programas:
- „Raspberry Pi PWM“ pamoka
- PWM su „Arduino Due“
- „Arduino“ pagrindu veikiantis LED reguliatorius naudojant PWM
- Maitinkite šviesos diodų reguliatorių naudodami mikrovaldiklį „ATmega32“