- Čo je to signál PWM?
- PWM pomocou PIC16F877A:
- Programovanie PIC na generovanie PWM signálov:
- Schémy a testovanie:
- Práca na hardvéri:
Toto je náš 10. tutoriál Výučba mikrokontrolérov PIC pomocou MPLAB a XC8. Doteraz sme prebrali mnoho základných návodov, ako je blikanie LED pomocou PIC, časovače v PIC, prepojenie LCD, prepojenie 7 segmentov, ADC pomocou PIC atď. Ak ste úplný začiatočník, navštívte kompletný zoznam tutoriálov PIC tu a začať sa učiť.
V tomto tutoriále sa dozvieme, ako generovať signály PWM pomocou PIC PIC16F877A. Náš PIC MCU má špeciálny modul s názvom Compare Capture module (CCP), ktorý je možné použiť na generovanie PWM signálov. Tu vygenerujeme PWM 5 kHz s variabilným pracovným cyklom od 0% do 100%. Aby sme zmenili pracovný cyklus, ktorý používame, použite potenciometer, preto sa odporúča naučiť sa ADC tutoriál skôr, ako začnete s PWM. Modul PWM tiež používa časovače na nastavenie svojej frekvencie, a preto sa tu predtým naučia používať časovače. Ďalej v tomto návode použijeme RC obvod a LED na prevod hodnôt PWM na analógové napätie a ich použitie na stlmenie LED svetla.
Čo je to signál PWM?
Pulzná šírková modulácia (PWM) je digitálny signál, ktorý sa najčastejšie používa v riadiacich obvodoch. Tento signál je nastavený na vysokú (5v) a nízku (0v) vo vopred určenom čase a rýchlosti. Čas, počas ktorého signál zostáva vysoký, sa nazýva „čas zapnutia“ a čas, počas ktorého signál zostáva nízky, sa nazýva „čas vypnutia“. Ďalej sú uvedené dva dôležité parametre pre PWM:
Pracovný cyklus PWM:
Percento času, v ktorom signál PWM zostáva VYSOKÝ (v čase), sa nazýva pracovný cyklus. Ak je signál stále ZAPNUTÝ, je v 100% pracovnom cykle a ak je vždy vypnutý, je to 0% pracovný cyklus.
Pracovný cyklus = čas zapnutia / (čas zapnutia + čas vypnutia)
Frekvencia PWM:
Frekvencia signálu PWM určuje, ako rýchlo PWM dokončí jednu periódu. Jedna perióda je úplná ZAPNUTIE a VYPNUTIE signálu PWM, ako je znázornené na obrázku vyššie. V našom návode nastavíme frekvenciu 5KHz.
PWM pomocou PIC16F877A:
Signály PWM je možné generovať v našom mikrokontroléri PIC pomocou modulu CCP (Compare Capture PWM). Rozlíšenie nášho PWM signálu je 10-bitové, to znamená, že pre hodnotu 0 bude pracovný cyklus 0% a pre hodnotu 1024 (2 ^ 10) bude pracovný cyklus 100%. V našom PIC MCU sú dva moduly CCP (CCP1 a CCP2), čo znamená, že môžeme generovať dva signály PWM na dvoch rôznych pinoch (pin 17 a 16) súčasne, v našom tutoriáli používame CCP1 na generovanie signálov PWM na pin 17.
Nasledujúce registre sa používajú na generovanie signálov PWM pomocou nášho PIC MCU:
- CCP1CON (riadiaci register CCP1)
- T2CON (riadiaci register časovača 2)
- PR2 (časový modul 2 moduly, periodický register)
- CCPR1L (CCP Register 1 Low)
Programovanie PIC na generovanie PWM signálov:
V našom programe prečítame analógové napätie 0-5 V z potenciometra a namapujeme ho na 0-1024 pomocou nášho modulu ADC. Potom vygenerujeme PWM signál s frekvenciou 5 000 Hz a zmeníme jeho pracovný cyklus na základe vstupného analógového napätia. To je 0-1024 bude prevedené na 0% -100% pracovný cyklus. Tento tutoriál predpokladá, že ste sa už naučili používať ADC v PIC, ak nie, prečítajte si ho odtiaľto, pretože v tomto tutoriále preskočíme jeho podrobnosti.
Takže akonáhle sú konfiguračné bity nastavené a program je zapísaný na načítanie analógovej hodnoty, môžeme pokračovať s PWM.
Pri konfigurácii modulu CCP pre prevádzku PWM je potrebné vykonať nasledujúce kroky:
- Nastavte PWM periódu zápisom do registra PR2.
- Nastavte pracovný cyklus PWM zápisom do registra CCPR1L a bitov CCP1CON <5: 4>.
- Vytvorením výstupu CCP1 vyčistite bit TRISC <2>.
- Nastavte hodnotu prescale TMR2 a povoľte Timer2 zápisom do T2CON.
- Nakonfigurujte modul CCP1 na prevádzku PWM.
Tento program obsahuje dve dôležité funkcie na generovanie signálov PWM. Jednou z nich je funkcia PWM_Initialize (), ktorá inicializuje registre potrebné na nastavenie modulu PWM a potom nastaví frekvenciu, pri ktorej by mal PWM pracovať, druhou funkciou je funkcia PWM_Duty (), ktorá nastaví pracovný cyklus signálu PWM v požadované registre.
PWM_Initialize () {PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1; // Nastavenie vzorcov PR2 pomocou údajového listu // Funguje PWM v 5KHZ CCP1M3 = 1; CCP1M2 = 1; // Konfigurácia modulu CCP1 T2CKPS0 = 1; T2CKPS1 = 0; TMR2ON = 1; // Konfigurácia časovača TRISC2 = 0; // urob pin portu na C ako výstup}
Vyššie uvedenou funkciou je funkcia inicializácie PWM, v tejto funkcii je modul CCP1 nastavený na používanie PWM tak, že bit CCP1M3 a CCP1M2 je nastavený na maximálnu hodnotu.
Predvolič časového modulu je nastavený tak, že bit T2CKPS0 je vysoký a T2CKPS1 je nízky, bit TMR2ON je nastavený na spustenie časovača.
Teraz musíme nastaviť frekvenciu signálu PWM. Hodnota frekvencie sa musí zapísať do registra PR2. Požadovanú frekvenciu je možné nastaviť pomocou nasledujúcich vzorcov
Obdobie PWM = * 4 * TOSC * (prednastavená hodnota TMR2)
Zmena usporiadania týchto vzorcov, aby ste dostali PR2, dá
PR2 = (Obdobie / (4 * Tosc * TMR2 Prescale)) - 1
Vieme, že Period = (1 / PWM_freq) a Tosc = (1 / _XTAL_FREQ). Preto…..
PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1;
Len čo je frekvencia nastavená, táto funkcia nemusí byť volaná znova, pokiaľ a dokým nebudeme musieť frekvenciu znova zmeniť. V našom návode som priradil PWM_freq = 5000; aby sme pre náš PWM signál dostali pracovnú frekvenciu 5 KHz.
Teraz nastavíme pracovný cyklus PWM pomocou nižšie uvedenej funkcie
PWM_Duty (nepodpísané int clo) {if (clo <1023) {clo = ((float) clo / 1023) * (_ XTAL_FREQ / (PWM_freq * TMR2PRESCALE)); // Pri znižovaní // clo = (((float) clo / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE); CCP1X = clo & 1; // Uloženie prvého bitu CCP1Y = clo & 2; // Uloženie 0. bitu CCPR1L = povinnosť >> 2; // Uloženie zostávajúcich 8 bitov}}
Náš PWM signál má 10-bitové rozlíšenie, preto túto hodnotu nemožno uložiť do jedného registra, pretože náš PIC má iba 8-bitové dátové linky. Takže sme použili na ďalšie dva bity CCP1CON <5: 4> (CCP1X a CCP1Y), aby sme uložili posledné dva LSB a potom uložili zvyšných 8 bitov do registra CCPR1L.
Čas pracovného cyklu PWM možno vypočítať pomocou nasledujúcich vzorcov:
Pracovný cyklus PWM = (CCPRIL: CCP1CON <5: 4>) * Tosc * (prednastavená hodnota TMR2)
Preskupením týchto vzorcov na hodnotu CCPR1L a CCP1CON získate:
CCPRIL: CCP1Con <5: 4> = pracovný cyklus PWM / (prednastavená hodnota Tosc * TMR2)
Hodnota nášho ADC bude 0-1024, potrebujeme, aby bola v rozmedzí 0% - 100%, teda PWM pracovný cyklus = povinnosť / 1023. Ďalej na prevedenie tohto pracovného cyklu na časové obdobie ho musíme vynásobiť periódou (1 / PWM_freq)
Vieme tiež, že Tosc = (1 / PWM_freq), teda..
Clo = ((((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE);
Vyriešením vyššie uvedenej rovnice nám vznikne:
Clo = ((float) duty / 1023) * (_XTAL_FREQ / (PWM_freq * TMR2PRESCALE));
Kompletný program môžete skontrolovať v sekcii Kód nižšie spolu s podrobným videom.
Schémy a testovanie:
Ako obvykle si overíme výstup pomocou simulácie Proteus. Schéma zapojenia je uvedené nižšie.
Pripojenie potenciometer až 7 th pin k posunu v napätí 0-5. Modul CCP1 je na kolíku 17 (RC2), tu sa vygeneruje PWM, ktorý je možné overiť pomocou digitálneho osciloskopu. Ďalej na jeho prevedenie na premenlivé napätie sme použili RC filter a LED na overenie výstupu bez rozsahu.
Čo je to RC filter?
RC filter alebo priepusť Nízka je jednoduchý obvod s dvoma pasívnymi prvkami, a síce rezistora a kondenzátora. Tieto dve zložky sa používajú na filtrovanie frekvencie nášho signálu PWM a na jeho premenlivé premenné jednosmerné napätie.
Ak preskúmame obvod, keď sa na vstup R privádza premenlivé napätie, kondenzátor C sa začne nabíjať. Teraz na základe hodnoty kondenzátora bude kondenzátoru chvíľu trvať, kým sa úplne nabije, po nabití zablokuje jednosmerný prúd (pamätajte, že kondenzátory blokujú jednosmerný prúd, ale umožňujú striedavý prúd), preto sa na výstupe objaví vstupné jednosmerné napätie. Vysokofrekvenčný PWM (signál AC) bude uzemnený cez kondenzátor. Cez kondenzátor sa tak získa čistý DC. Zistilo sa, že pre tento projekt je vhodná hodnota 1 000 Ohm a 1uf. Výpočet hodnôt R a C zahŕňa analýzu obvodu pomocou prenosovej funkcie, ktorá je mimo rozsahu tohto tutoriálu.
Výstup programu je možné overiť pomocou digitálneho osciloskopu, ako je znázornené nižšie, meniť potenciometer a meniť pracovný cyklus PWM. Výstupné napätie RC obvodu si môžeme všimnúť aj pomocou voltmetra. Ak všetko funguje podľa očakávaní, môžeme pokračovať v hardvéri. Celý proces ďalej skontrolujte na konci videa.
Práca na hardvéri:
Hardvérové nastavenie projektu je veľmi jednoduché, iba znovu použijeme našu dosku PIC Perf uvedenú nižšie.
Budeme tiež potrebovať potenciometer na napájanie analógového napätia. K môjmu hrncu som pripojil niekoľko koncových vodičov (zobrazené nižšie), aby sme ich mohli priamo pripojiť k doske PIC Perf.
Nakoniec na overenie výstupu potrebujeme obvod RC a LED, aby sme zistili, ako funguje signál PWM, jednoducho som použil malú dosku perf a na ňu som pripájal obvod RC a LED (na kontrolu jasu), ako je to znázornené nižšie.
Môžeme použiť jednoduché spojovacie vodiče typu female to female a spojiť ich podľa schém uvedených vyššie. Akonáhle je pripojenie hotové, nahrajte program na PIC pomocou nášho pickit3 a mali by ste byť schopní dostať premenlivé napätie na základe vstupu vášho potenciometra. Variabilný výstup sa tu používa na riadenie jasu LED.
Použil som svoj multimetr na meranie variabilných výstupov, môžeme tiež zaznamenať zmenu jasu LED pre rôzne úrovne napätia.
A to je to, že sme naprogramovali tak, aby čítali analógové napätie z POT a konvertovali na signály PWM, ktoré sa zase konvertovali na premenné napätie pomocou RC filtra a výsledok sa overuje pomocou nášho hardvéru. Ak máte pochybnosti alebo niekde uviaznete, láskavo použite sekciu komentárov nižšie, radi vám pomôžeme. Kompletné pracovné pracuje vo videu.
Skontrolujte tiež naše ďalšie návody PWM na iných mikrokontroléroch:
- Výukový program pre Raspberry Pi PWM
- PWM s Arduino Due
- Arduino LED stmievač využívajúci PWM
- Výkonový stmievač LED pomocou mikrokontroléra ATmega32