Pulzno širinska modulacija PWM in mikrokontroler PIC

Pulzno širinska modulacija (PWM – Pulse width modulation) je tehnika nadzora oziroma krmiljenja energije, ki jo pošiljamo električnim porabnikom v obliki pravokotnih impulzov. Periodi pravokotnih impulzov bomo rekli PWM-perioda. Duty cycle, lahko bi ga poimenovali obratovalni ciklus, je razmerje med širino impulza in PWM-periodo. Povprečno vrednost enosmernega pulzirajočega signala lahko pri enaki frekvenci impulzov spreminjamo s spreminjanjem širine impulzov (slika 1).

Slika 1: Časovni diagram pulzno širinske modulacije

Če znaša napetost pravokotnih impulzov 5 V, lahko s spreminjanjem širine impulza (tPWM) in pri enaki frekvenci pulzirajočega signala dosežemo katerokoli napetost med 0 V in 5 V. S pulzno moduliranim signalom lahko npr. krmilimo hitrost vrtenja enosmernega motorja, določamo položaj in smer zasuka servomotorja ali pa krmilimo svetilnost svetlečih diod. Z mikrokontrolerjem PIC16F628A bomo generirali PWM-signal za krmiljenje svetilnosti svetleče diode. Njegov priključek RB3 ima dodatno ime CCP1, ki nam pove, da ima ta priključek poleg vhodno-izhodne funkcije še neko drugo. Pri pravilni nastavitvi mikrokontrolerja dobimo na tem priključku pulzno moduliran signal.

Časovnik TMR2:

Za generiranje PWM-signala bomo uporabili časovnik TMR2, ki se nahaja v banki 0 in deluje skupaj z 8-bitnim registrom PR2.

Tabela 1: 8-bitni register TMR2, register T2CON

TMR2 je 8-bitni register in mu lahko dodelimo preddelitev 1:1, 1:4 ali 1:16. Njegovo delovanje vključimo s postavitvijo tretjega bita (bit 2 => TMR2ON) registra T2CON na 1, izključimo pa s postavitvijo tega bita na 0.

Tabela 2: Vklop / izklop časovnika TMR2

Preddelitev mu določimo z določitvijo prvega in drugega bita v tem registru (T2CKPS0 in T2CKPS1). Njegova vrednost se pri nastavljeni vrednosti preddelitve 1:1 povečuje s četrtino frekvence notranjega oziroma v našem primeru zunanjega kristalnega oscilatorja vrednosti 4 MHz.

Tabela 3: Preddelitev časovnika TMR2

Register TMR2 se povečuje od 0 naprej tako dolgo, dokler ne doseže vrednosti registra PR2. Register PR2 je 8-bitni, vanj lahko zapisujemo vrednosti od 0 do 255, lahko pa iz njega tudi beremo vrednosti. Je bralno zapisovalni register.

Izhodno delitev impulzov časovnika TMR2 nastavimo s štirimi biti TOUTPS0 do TOUTPS3, biti <3:6> registra T2CON. Ti nam služijo za generiranje prekinitev (interrupt) na časovniku TMR2. Izhodni impulzi so tisti, ki se generirajo vsakič, ko vrednost časovnika TMR2 doseže vrednost registra PR2. Te impulze lahko delimo od 1:1 do 1:16.

Tabela 4: Izhodna delitev impulzov časovnika TMR2

Capture/Compare/PWM (CCP) modul:

Mikrokontroler PIC16f628a ima vgrajeno strojno opremo (hardware) imenovano Capture/Compare/PWM (CCP) modul za generiranje PWM signala (modul za zajemanje, primerjavo in generiranje PWM signala). Modul vsebuje dva 8-bitna registra imenovana CCPR1L in CCPR1H. Skupaj tvorita 16-bitni register, ki ga lahko uporabimo za zajemanje, primerjavo in oblikovanje duty cycle PWM signala. CCP modul nadzira register CCP1CON.

Tabela 5: 8-bitni register CC1CON

Tabela 6: Določitev bitov <3:0> registra CCP1CON za PWM način delovanja

Izdelajmo sedaj program (assembler), ki bo na pinu RB3 generiral PWM signal frekvence 5 KHz, duty cycle pa naj znaša 5% (povprečna napetost 0,25 V):

;Krmiljenje LED diode s PWM signalom

;Okolje MPLAB IDE v8.92, prevajalnik MPASM Assembler V5.51, oscilator 4 MHz.

;Avtor: Milan Ivič, sept 2017

;-----------------------------------------------------------------------------------------------------------------------

    list p=16f628a                    ;Tip mikrokontrolerja

    #include <p16f628a.inc>           ;Vključi v program datoteko p16f628a.inc,

    __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _LVP_OFF & _XT_OSC

    org 0x000

    goto Glavni ;Nadaljuj izvajanje programa na naslovu Glavni_program.

    org 0x004

;********************* Glavni program *********************

Glavni

    bsf    STATUS,RP0            ;Banka 1

    bcf    TRISB,3               ;Priključek RB3/CCP1 je izhod

    movlw .199                   ;Določimo frekvenco PWM-signala

    movwf    PR2

    bcf    STATUS,RP0            ;Banka 0

    movlw    b'00001010'         ;Določimo širino impulzov PWM-signala (8 zgornjih bitov)

    movwf    CCPR1L

    movlw    b'00000100'         ;Vključimo TMR2 s postavitvijo tretjega bita registra T2CON na 1

    movwf    T2CON

    movlw    b'00001100'         ;Vključimo PWM (tretji in četrti bit morata biti na 1)

    movwf    CCP1CON             ;Peti in šesti bit (spodnja dva bita 10-bitnega podatka) sta 0

Zanka

    goto    Zanka      ;Neskončna zanka

    end

Slika 2: Priklop elementov na mikrokontroler

Delovanje časovnikaTMR2 vključimo s postavitvijo tretjega bita registra T2CON na 1, preddelitev pa mu določimo z določitvijo prvega in drugega bita v tem registru. Njegova vrednost se pri nastavljeni vrednosti preddelitve 1:1 povečuje s četrtino frekvence priključenega oscilatorja. Mi imamo postavljena ta dva bita na 0, zato je izbrana preddelitev 1:1. Časovnik TMR2 deluje z 8-bitnim registrom PR2. Frekvenca PWM-signala je odvisna od hitrosti povečevanja časovnika TMR2 in od nastavljene vrednosti registra PR2. Ko TMR2 doseže vrednost, ki je nastavljena v registru PR2, se ponastavi in začne ponovno naraščati od vrednosti 0. Čas trajanja ene periode PWM-signala izračunamo po enačbi:

Pri priključenem 4 MHz oscilatorju, nastavljeni vrednosti PR2 = 199 in izbrani preddelitvi 1:1 znaša ta čas TPWM = 200 μs. Frekvenca PWM signala, ki ga dobimo na priključku RB3, znaša:

Z nastavitvijo mikrokontrolerja smo v našem programu določili čas trajanja periode PWM-signala, ki znaša 200 μs. Kako pa določimo širino impulza (tPWM), ki lahko v našem primeru traja od 0 do 200 μs? Širina impulza je določena z vrednostjo vseh osmih bitov registra CCPR1L ter vrednostjo petega in šestega bita registra CCP1CON. Na voljo imamo torej 10 bitov, izmed katerih je 8 zgornjih bitov v registru CCPR1L in dva spodnja v registru CCP1CON (peti in šesti bit). V našem programu smo določili vrednost CCPR1L, ki znaša 00001010(2), vrednosti petega in šestega bita registra CCP1CON pa sta 00(2). Vseh 10 bitov ima torej vrednost 0000101000(2) ali 40, če pretvorimo v desetiško število.

Čas trajanja vsakega impulza pulzno moduliranega signala, ki ga dobimo na priključku RB3, izračunanega po  zgornji enačbi, znaša 10 μs.

Slika 3: Prikaz delovanja in PWM izhoda (s spreminjanjem vrednosti CCPR1L spreminjamo tPWM)

Na sliki 3 vidimo prikaz delovanja PWM v mikrokontrolerju PIC16f628a. Hitrost naraščanja vrednosti TMR2 je odvisna od oscilatorja, ki daje takt mikrokontrolerju, in od preddelilnika, ki mu je dodeljen. Ko doseže nastavljeno vrednost registra PR2, se ponastavi, hkrati vklopi priključek RB3/CCP1, njegova vrednost pa začne ponovno naraščati od 0. Mikrokontroler stalno preverja vrednost TMR2 z vrednostjo registra CCPR1L (dejansko tudi z vrednostjo dveh spodnjih bitov, ki sta v registru CCP1CON). Ko TMR2 doseže vrednost registra CCPR1L, mikrokontroler izklopi priključek RB3/CCP1.

Na koncu poglejmo še oscilogram, ki smo ga dobili kar s programatorjem PICkit 2. Slika 4 prikazuje PWM-signal na priključku RB3/CCP1, generiranem na podlagi našega programa. Ko s PICkit 2 programatorjem zapišemo program v mikrokontroler, potrdimo VDD (5 V) oziroma priključimo vezje na napetostno napajanje 5 V preko PICkit 2 programatorja. Nato v menijski vrstici izberemo Tools >> Logic Tool... V oknu ki se nam odpre, izberemo Analyzer, kjer izberemo kanal. V odvisnosti od izbranega kanala ustrezni priključek PICkit 2 programatorja povežemo na izhodni pin, kamor je preko zaščitnega upora povezana LED dioda (RB3/CCP1). Analizator zaženemo s pritiskom na gumb RUN.

Slika 4: Oscilogram PWM signala z uporabo programatorja PICkit 2

S premikanjem kurzorja (Cursors) lahko enostavno odčitamo izbrane čase, v našem primeru (slika 3) vidimo, da traja posamezni impulz na pinu RB3/CCP1 10 μs.