[PIC programování] – 7. díl

Vítám vás po dlouhé době u dalšího dílu série PIC programování !!!

V minulém díle jsme se seznámili s moduly Timer2/4/6, pomocí kterých jsme si vytvořili časování programu. Slíbil jsem nějaké časování, ale nakonec jsem se rozhodl pro PWM. Za toto se omlouvám, ale myslím, že se máte na co těšit!

V dnešním díle použijeme vám již známé moduly Timer2 a Timer4 pro tzv. pulzně šířkovou modulaci – PWM (Pulse Width Modulation). Jedná se o modulaci signálu, kde výstupní signál může nabývat dvou úrovní: logická 0 a logická 1 (stejně jako u klasického digitálního výstupu), tyto dva stavy se ovšem střídají (s určitou frekvencí).

PWM je tedy určena dvěma parametry: frekvencí (frequency) a střídou (duty cycle).

Frekvence nám udává počet stříd za sekundu. Střída nám vypovídá něco o intenzitě výstupního signálu. Udává se obvykle v procentech (od 0% do 100%).

Následující obrázek znázorňuje pulzně šířkovou modulaci o nějaké frekvenci s určitými pracovními cykly:

První graf ukazuje PWM se střídou 25%. Tedy čtvrtina času periody je výstupní napětí logická 1 a tři čtvrtiny času periody logická 0. Druhý graf je PWM se střídou 50% – polovina času logická 1, polovina času logická 0. Na posledním grafu je znázorněna PWM se střídou 75% – tři čtvrtiny času logická 1, jedna čtvrtina času logická 0.

Nyní již máte představu o tom, jak asi PWM funguje.

Pokud na takový výstup připojíme LED a budeme mít frekvenci 1Hz, střídu 50%, bude LED půl sekundy svítit a půl sekundy bude zhasnutá. Pomocí PWM můžeme řídit jas LEDky. Pokud použijeme vyšší frekvenci (např. 1kHz), bude se nám díky persistenci vidění zdát, že LED svítí. Střídou pak jednoduše regulujeme jas.

Pojďme si popsat dostupné periferie mikrokontroléru PIC16F1705 pro realizaci PWM:

Tento mikrokontrolér disponuje dvěma CCP moduly (Capture/Compare/PWM). Tyto moduly jsou univerzální a mohou se nastavit i pro další funkce mimo PWM. Jako vstupní signál přijímají výstup z modulu Timer2. Tento signál se potom dělí podle střídy na logickou 1 a logickou 0. Následující obrázek zobrazuje schéma zapojení CCP modulu v PWM módu:

Dále budeme používat PPS modul (Peripheral Pin Select), který zajistí fyzické propojení periferie (v tomto případě PWM výstupu) s pinem mikrokontroléru.

A nyní přikročíme k psaní kódu. Použijeme kód z minulého dílu. Timer2 ovšem potřebujeme pro CCP modul. Proto pro časování programu použijeme Timer4. Dále pro lepší čitelnost kódu zavedeme značení předponou R_ pro adresu registru a předponou K_ pro konstanty.

Následující kód je úplný program.

Pro zprovoznění PWM podnikáme dva následující kroky:

  1. propojení pinu s PWM výstupem (modulu CCP1) pomocí PPS
  2. nastavení časování (pomocí Timeru 2):
    • PWM perioda (1 / frekvence) = [(PR2)+1] * 4 * (TMR2 prescale) / Fosc = [249 + 1] * 4 * 1 / 4000000 = 250ms
    • PWM střída pomocí registru CCPR1L (horních 8 bitů)

Pozn.: Pokud to již z textu nevyplynulo, střída pro modul CCP1 se nastavuje pomocí 10-bitového čísla. My ovšem používáme pouze prvních 8 MSB (Most Significant Bits), tedy prvních 8 bitů zleva. Je to jako kdybyste počítali součástky v řádu 10^3 (třeba 6200, 8100, …), zde nás také netrápí nějaké jednotky. Dva spodní bity DC1B se nachází v registru CCP1CON a ponecháváme je nulové.

V hlavní smyčce následně každých 10 ms zvýšíme registr CCPR1L o 1. Vzhledem k tomu, že pracujeme s 8 bity, trvá nám přesně 256 * (10 / 1000) = 2.56 sekund, než naše LEDka na výstupu RC3 zhasne.

A to je pro tento díl vše. Rád bych tuto sérii obnovil a v následujících dílech doplnil informace o rozhraních UART, I2C a SPI, nepřímé adresování a další.

Do příště, nashledanou!

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.