PWM (Pulse – Width Modulation) modulacja szerokości impulsu jest powszechnie stosowana do regulacji mocy odbiorników prądu stałego (i nie tylko). Polega ona na sterowaniu wypełnieniem przebiegu prostokątnego o stałej amplitudzie. Mimo że większość mikrokontrolerów posiada własne, przeważnie wielokanałowe, układy PWM, czasem zachodzi potrzeba wekonania czegoś podobnego programowo. W przedstawionym dalej przykładzie pokazana jest zasada sterowania diodami trójkolorowymi (RGB), poprzez zmianę wypełnienia przebiegu prostokątnego sterującego każdy z kolorów.
Język BASCOM AVR:
Przykładowy program do sterowania diodą RGB przedstawiony jest poniżej:
'************* Konfiguracja uC *****************
'***********************************************
$regfile = "attiny2313.dat"
$crystal = 16000000
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11111111 : Portd = &B11111111
Config Timer0 = Timer , Prescale = 8
Enable Timer0 : On Timer0 Prztimer0
Enable Interrupts
'********** Konfiguracja uC Koniec ************
'****************** Nazwy *******************
'***********************************************
Rd Alias Portb.0
Gd Alias Portb.1
Bd Alias Portb.2
'************* Nazwy Koniec ****************
'****************** Zmienne *******************
'***********************************************
Dim Licznik As Byte
Dim Rled As Byte , Bled As Byte , Gled As Byte
'************* Zmienne Koniec ****************
'************ Warunki Poczatkowe ***************
'***********************************************
Rled = 80
Gled = 0
Bled = 90
'******* Warunki Poczatkowe Koniec ***********
'************** Petla glowna ******************
'***********************************************
Do
Loop
End
'************ Petla glowna Koniec **************
'************ Przerwanie timer 0 ***************
'***********************************************
Prztimer0:
Incr Licznik
If Licznik = 100 Then Licznik = 0
If Licznik < Rled Then Set Rd Else Reset Rd
If Licznik < Gled Then Set Gd Else Reset Gd
If Licznik < Bled Then Set Bd Else Reset Bd
Return
'******** Przerwanie timer 0 Koniec ************
Program był testowany na mikrokontrolerze ATTiny2313 o czym świadczy pierwsza linijka w konfiguracji. Timer został ustawiony na podział częstotliwości przez 8. Ponieważ jest on ośmiobitowy (liczy do 256) to przerwanie będzie występowało z częstotliwością ok. 7,8kHz.
W przerwaniu Timera (Prztimer0) zostaje zwiększany cyklicznie Licznik od wartosci 0 do 99, co odpowiada regulacji wypełnienia co 1%. Działanie PWM jest zrealizowane w banalny sposób za pomocą instrukcji warunkowej if Licznik…. Porównuje ona aktualną wartość Licznika ze zmienną określającą natężenie (Rled, Gled lub Bled, 3 kanały) i wystawia stan wysoki na pinie wyjściowym jeśli Licznik ma mniejszą wartość od zmiennej, a stan niski jeśli warunek ten nie jest spełniony. W efekcie dla zmiennej (Rled, Gled lub Bled) równej 100 Licznik jest mniejszy od niej cały czas (liczy od 0 do 99) i na wyjściu jest cały czas stan wysoki (wypełnienie 100%). Jeśli natomiast zmienna jest równa 0 to licznik nigdy nie jest od niej mniejszy i wypełnienie będzie równe 0%.
Materiał nadesłał użytkownik : Elektron