- Co je signál PWM?
- PWM pomocí PIC16F877A:
- Programování PIC pro generování signálů PWM:
- Schémata a testování:
- Práce na hardwaru:
Toto je náš 10. tutoriál učení mikrokontrolérů PIC pomocí MPLAB a XC8. Dosud jsme prozkoumali mnoho základních tutoriálů, jako je blikání LED s PIC, časovače v PIC, propojení LCD, propojení 7 segmentů, ADC pomocí PIC atd. Pokud jste úplným začátečníkem, navštivte úplný seznam PIC tutoriálů zde a začít se učit.
V tomto tutoriálu se naučíme, jak generovat signály PWM pomocí PIC PIC16F877A. Náš PIC MCU má speciální modul nazvaný Porovnat modul Capture (CCP), který lze použít ke generování signálů PWM. Zde vygenerujeme PWM 5 kHz s proměnným pracovním cyklem od 0% do 100%. Chcete-li změnit pracovní cyklus, který používáme potenciometr, doporučujeme před zahájením PWM naučit se ADC tutoriál. Modul PWM také používá časovače k nastavení frekvence, a proto se zde předem naučí používat časovače. Dále v tomto tutoriálu použijeme RC obvod a LED k převodu hodnot PWM na analogové napětí a použijeme je pro stmívání LED světla.
Co je signál PWM?
Pulse Width Modulation (PWM) je digitální signál, který se nejčastěji používá v řídicích obvodech. Tento signál je nastaven na vysokou (5v) a nízkou (0v) v předdefinovaném čase a rychlosti. Čas, během kterého signál zůstane vysoký, se nazývá „čas zapnutí“ a čas, během kterého signál zůstane nízký, se nazývá „čas vypnutí“. Níže jsou popsány dva důležité parametry pro PWM:
Pracovní cyklus PWM:
Procento času, ve kterém signál PWM zůstává VYSOKÝ (v čase), se nazývá pracovní cyklus. Pokud je signál vždy zapnutý, je ve 100% pracovním cyklu a pokud je vždy vypnutý, je to 0% pracovní cyklus.
Pracovní cyklus = čas zapnutí / (čas zapnutí + čas vypnutí)
Frekvence PWM:
Frekvence signálu PWM určuje, jak rychle PWM dokončí jednu periodu. Jedna perioda je kompletní ZAPNUTÍ a VYPNUTÍ signálu PWM, jak je znázorněno na obrázku výše. V našem tutoriálu nastavíme frekvenci 5KHz.
PWM pomocí PIC16F877A:
Signály PWM lze generovat v našem mikrokontroléru PIC pomocí modulu CCP (Compare Capture PWM). Rozlišení našeho PWM signálu je 10bitové, to znamená, že pro hodnotu 0 bude pracovní cyklus 0% a pro hodnotu 1024 (2 ^ 10) bude pracovní cyklus 100%. V našem PIC MCU jsou dva CCP moduly (CCP1 a CCP2), to znamená, že můžeme generovat dva PWM signály na dvou různých pinech (pin 17 a 16) současně, v našem tutoriálu používáme CCP1 ke generování PWM signálů na pin 17.
Následující registry se používají ke generování signálů PWM pomocí našeho PIC MCU:
- CCP1CON (kontrolní registr CCP1)
- T2CON (řídicí registr časovače 2)
- PR2 (Timer 2 moduly Period Register)
- CCPR1L (CCP Register 1 Low)
Programování PIC pro generování signálů PWM:
V našem programu načteme analogové napětí 0-5 V z potenciometru a namapujeme ho na 0-1024 pomocí našeho modulu ADC. Poté generujeme signál PWM s frekvencí 5 000 Hz a měníme jeho pracovní cyklus na základě vstupního analogového napětí. To je 0-1024 bude převedeno na pracovní cyklus 0% -100%. Tento kurz předpokládá, že jste se již naučili používat ADC v PIC, pokud ne, přečtěte si jej odtud, protože v tomto kurzu přeskočíme podrobnosti o něm.
Jakmile jsou tedy konfigurační bity nastaveny a program je zapsán pro čtení analogové hodnoty, můžeme pokračovat s PWM.
Při konfiguraci modulu CCP pro provoz PWM je třeba provést následující kroky:
- Nastavte PWM periodu zápisem do registru PR2.
- Nastavte pracovní cyklus PWM zápisem do registru CCPR1L a bitů CCP1CON <5: 4>.
- Vyčistěte pin CCP1 výstupem vymazáním bitu TRISC <2>.
- Nastavte hodnotu předvolby TMR2 a povolte Timer2 zápisem do T2CON.
- Nakonfigurujte modul CCP1 pro provoz PWM.
V tomto programu jsou dvě důležité funkce pro generování signálů PWM. Jedním z nich je funkce PWM_Initialize (), která inicializuje registry potřebné k nastavení modulu PWM a poté nastaví frekvenci, na které by měl PWM pracovat, druhou funkcí je funkce PWM_Duty (), která nastaví pracovní cyklus signálu PWM v požadované registry.
PWM_Initialize () {PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1; // Nastavení vzorců PR2 pomocí datového listu // Zajistí, aby PWM fungoval v 5KHZ CCP1M3 = 1; CCP1M2 = 1; // Konfigurace modulu CCP1 T2CKPS0 = 1; T2CKPS1 = 0; TMR2ON = 1; // Konfigurace časovače TRISC2 = 0; // vytvořit port na C jako výstup}
Výše uvedená funkce je funkce inicializace PWM, v této funkci je modul CCP1 nastaven na použití PWM tak, že bit CCP1M3 a CCP1M2 bude tak vysoký.
Přednastavovač časového modulu je nastaven tak, že bit T2CKPS0 je tak vysoký a T2CKPS1 je nízký, bit TMR2ON je nastaven na spuštění časovače.
Nyní musíme nastavit frekvenci signálu PWM. Hodnota frekvence musí být zapsána do registru PR2. Požadovanou frekvenci lze nastavit pomocí níže uvedených vzorců
PWM Period = * 4 * TOSC * (přednastavená hodnota TMR2)
Přeskupení těchto vzorců, aby získal PR2, dá
PR2 = (období / (4 * Tosc * TMR2 Prescale)) - 1
Víme, že Period = (1 / PWM_freq) a Tosc = (1 / _XTAL_FREQ). Proto…..
PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1;
Jakmile je frekvence nastavena, tato funkce nemusí být znovu vyvolána, pokud a dokud nebudeme muset frekvenci znovu změnit. V našem tutoriálu jsem přidělil PWM_freq = 5000; abychom mohli pro náš PWM signál získat provozní frekvenci 5 KHz.
Nyní nastavíme pracovní cyklus PWM pomocí níže uvedené funkce
PWM_Duty (unsigned int duty) {if (duty <1023) {duty = ((float) duty / 1023) * (_ XTAL_FREQ / (PWM_freq * TMR2PRESCALE)); // Při snižování // clo = (((float) clo / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE); CCP1X = clo & 1; // Uložení 1. bitu CCP1Y = clo & 2; // Uložení 0. bitu CCPR1L = povinnost >> 2; // Uložení zbývajícího 8 bitu}}
Náš signál PWM má 10bitové rozlišení, proto tuto hodnotu nelze uložit do jednoho registru, protože náš PIC má pouze 8bitové datové linky. Takže jsme použili další dva bity CCP1CON <5: 4> (CCP1X a CCP1Y) k uložení posledních dvou LSB a potom k uložení zbývajících 8 bitů do registru CCPR1L.
Čas pracovního cyklu PWM lze vypočítat pomocí následujících vzorců:
Pracovní cyklus PWM = (CCPRIL: CCP1CON <5: 4>) * Tosc * (přednastavená hodnota TMR2)
Přeskupením těchto vzorců, abyste získali hodnotu CCPR1L a CCP1CON, získáte:
CCPRIL: CCP1Con <5: 4> = pracovní cyklus PWM / (přednastavená hodnota Tosc * TMR2)
Hodnota našeho ADC bude 0-1024, potřebujeme, aby to bylo v rozmezí 0% - 100%, PWM Duty Cycle = duty / 1023. Abychom tento pracovní cyklus převedli na časové období, musíme ho vynásobit obdobím (1 / PWM_freq)
Víme také, že Tosc = (1 / PWM_freq), proto..
Clo = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE);
Řešení výše uvedené rovnice nám dá:
Clo = ((float) duty / 1023) * (_XTAL_FREQ / (PWM_freq * TMR2PRESCALE));
Kompletní program můžete zkontrolovat v části Kód níže spolu s podrobným videem.
Schémata a testování:
Jako obvykle ověříme výstup pomocí simulace Proteus. Schéma zapojení je uvedeno níže.
Připojení potenciometr až 7 th pin k posunu v napětí 0-5. Modul CCP1 je s kolíkem 17 (RC2), zde se vygeneruje PWM, který lze ověřit pomocí digitálního osciloskopu. Dále k převodu na proměnné napětí jsme použili RC filtr a LED k ověření výstupu bez rozsahu.
Co je RC filtr?
RC filtr nebo propust Nízká je jednoduchý obvod se dvěma pasivními prvky, a sice rezistoru a kondenzátoru. Tyto dvě komponenty se používají k filtrování frekvence našeho signálu PWM a vytváření proměnného stejnosměrného napětí.
Pokud prozkoumáme obvod, když se na vstup R přivede proměnné napětí, začne se kondenzátor C nabíjet. Nyní na základě hodnoty kondenzátoru bude kondenzátoru nějakou dobu trvat, než se plně nabije, jakmile je nabitý, zablokuje stejnosměrný proud (Pamatujte, že kondenzátory blokují DC, ale umožňují střídavé napětí), proto se na výstupu objeví stejnosměrné napětí. Vysokofrekvenční PWM (AC signál) bude uzemněn přes kondenzátor. Přes kondenzátor se tak získá čistý DC. Bylo zjištěno, že pro tento projekt je vhodná hodnota 1 000 Ohm a 1uf. Výpočet hodnot R a C zahrnuje analýzu obvodu pomocí přenosové funkce, která je mimo rozsah tohoto kurzu.
Výstup programu lze ověřit pomocí digitálního osciloskopu, jak je znázorněno níže, měnit potenciometr a pracovní cyklus PWM by se měl měnit. Můžeme si také všimnout výstupního napětí RC obvodu pomocí voltmetru. Pokud vše funguje podle očekávání, můžeme pokračovat s naším hardwarem. Celý proces dále zkontrolujte na konci videa.
Práce na hardwaru:
Hardwarové nastavení projektu je velmi jednoduché, pouze znovu použijeme naši PIC Perf desku zobrazenou níže.
Budeme také potřebovat potenciometr pro napájení analogového napětí, připojil jsem k mé nádobě několik vodičů na konci (viz níže), abychom je mohli přímo připojit k desce PIC Perf.
Nakonec k ověření výstupu potřebujeme RC obvod a LED, abychom viděli, jak funguje signál PWM, jednoduše jsem použil malou perf desku a připájel RC obvod a LED (k ovládání jasu), jak je uvedeno níže
Můžeme použít jednoduché spojovací vodiče žena-žena a připojit je podle schémat uvedených výše. Jakmile je připojení hotové, nahrajte program na PIC pomocí našeho pickit3 a měli byste být schopni získat proměnné napětí na základě vstupu vašeho potenciometru. Variabilní výstup se zde používá k ovládání jasu LED.
Použil jsem svůj multimetr k měření variabilních výstupů, můžeme si také všimnout změny jasu LED pro různé úrovně napětí.
A to je to, že jsme naprogramovali čtení analogového napětí z POT a převedení na signály PWM, které byly následně převedeny na proměnné napětí pomocí RC filtru a výsledek je ověřen pomocí našeho hardwaru. Pokud máte nějaké pochybnosti nebo se někde zaseknete laskavě, použijte sekci komentářů níže, rádi vám pomůžeme. Kompletní pracovní pracuje ve videu.
Zkontrolujte také naše další výukové programy PWM na jiných mikrokontrolérech:
- Výukový program PWM pro Raspberry Pi
- PWM s Arduino Due
- Arduino LED stmívač pomocí PWM
- Napájení LED stmívače pomocí mikrokontroléru ATmega32