Programowy PWM

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

Post Author: swistak

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Potwierdz, że nie jesteś botem. *