• 1
  • 2

PWM - Pulzne Šírková Modulácia

. .

Máme neaký impulz v neakom časovom trvaní (šírka impulzu), za jednotku času v ktorom sa opakuje.
Pri zmene šírky opakujúceho sa (periodického) signálu hovoríme o modulácií. Zmenu šírky impulzu, nazývanej ako strieda, prevádzame na základe určitej hodnoty.
Toto je PWM.

PWM má široké opodstatnenie, my ju budeme využívať pri ovládaní jasu LED prípadne pri ovládaní rýchlosti
jednosmerných motorov.

Pri nastavení portu RB3 registra PORTB, budeme mať na výstupe stálu log. 1 -> LED naplno svieti. Pri PWM sa nám
signál log. 1 zmoduluje na určitý počet log. 1 a log. 0 za jednu sekundu.
LED nám bude v princípe blikať a tu sa využíva nedokonalosť ľudského oka.

Troška teórie.

Ľudské oko nedokáže spracovať frekvenciu 20 Hz/s. Znamená, pokiaľ zdroj svetla bliká 20x do sekundy, oko tento fakt nevie spracovať a nám sa svetlo javí ako stále, no v skutočnosti bliká.
Tento jav nedokonalosti očí využívajú napríklad obrazovky televízorov, CRT, oživovanie pixelov, RGB,
multiplex 7-segmentoviek, atď... .

Takže, ľudské oko vníma frekvenciu blikania do 20 Hz ako stále svetlo - LED sa za jednu sekundu 20x rozsvieti a 20x zhasne. Pri takomto pomere 20x rozsvieť a 20x zhasni, LED svieti naplno - teda 100%.
Strieda x% znamená zmenu šírky impulzu o x%, a pri striede, napr. 50% bude LED svietiť zpolovice.

100% ..... 20x rozsvieť
100% ..... 20x zhasni
100% ..... 20Hz

Kedže pri jase vnímame len svetlo, musíme dĺžku trvania rozdeliť na polovicu - úsek rozsvieť / úsek zhasni.
Z úseku rozsvieť musíme ďalej podľa striedy dopočítať, kolko krát sa má v tomto úseku LED naozaj rozsvietiť. Pri 100% to bude plných 20 krát. Inak sa bude počet rozsviecení znižovať.

Výslednú hodnotu dopočítame podľa striedy ako : (20*strieda)/100       napríklad, pre 50% to bude: 
                                                                       výsledok = (20*50)/100


Základ výsledného kódu by mohol byť:

 


vysledna_hodnota = (20*strieda)/100;


for (i=0; i<=40; i++)
    {
       if(i<=20 && i<vysledna_hodnota)
        {
            rozsviet
        } else {
                     zhasni
                  }

Delay_();




Ukážka kódu, pri ktorom bude LED svietiť na 45%:

main.c

#include "config_diall.h"
#include "config_words.h"

char *PageSys(void)
{
   return "0x21";
}

int main(void)
{
   Init_Port(PORTB,0,"digital");
   Config_OUT(TRISB,0);
   Bit_Clr(PORTB,0);


   float strieda = 45; //45%
   float vysledna_hodnota = (20*strieda)/100;
   float i;

   while(1)
   {
      for (i=0; i<=40; i++)
          {
             if(i<=20 && i<vysledna_hodnota)
              {
                 Bit_Set(PORTB,0);
              } else {
                          Bit_Clr(PORTB, 0);
                        }

              Delay_ms(1);
          }
   }
   return 0;
}




Pri 1% - 20*1/100 = 0.2 . Pri dátovom type int by toto číslo nemalo opodstatnenie, preto volíme dátovy typ ako float.


Vytvoriť neakú štruktúru, ktorá vypočíta alebo bude generovať striedu od 0%-100% je už krok na necelých 10 minút.


Namiesto LED je možné použiť napríklad jednosmerný motor na ovládanie otáčok.