Wrzucam post w którym przedstawię jak krok po kroku zabierałem się do stworzenia programowego PWM, wrzucam go tutaj ze świadomością, że być może niektóre kroki można było wykonać inaczej, bądź można było podejść do sprawy w nieco inny sposób. Dlatego też liczę na jakiekolwiek sugestie które pozwoliły by udoskonalić ten program, zmodyfikować go tak aby działał lepiej, „stabilniej” choć nie mówię, że on nie działa

bo realizuje założone cele, ale być może któreś z fragmentów kodu mogły by być nieco zmodyfikowane, „zoptymalizowane”, no ale w miarę swoich umiejętności stworzyłem oto taki program którym chce się podzielić, być może komuś się przyda, pozwoli przybliżyć zasadę, a raczej moje pierwsze podejście do sposobu realizacji programowego PWM.
UKŁAD:- Atmega8
- zewnętrzny kwarc 8 MHz
- wykorzystane piny: PB0, PB1, PB3 – DIODY LED
- Układ bazujący na buforze SN74HC245N wykorzystujący port LPT komputera, pełniący rolę swego rodzaju analizatora stanów logicznych,
- program: The Fabulous Logic Analyser.
Krótko na temat metody regulacji szerokości impulsów, wykorzystanej do stworzenia programowego PWM.
_length – długość trwania impulsu (wyrażona w [ms])
_period – okres powtarzania impulsu (wyrażony w [ms])
Dla stałej wartości okresu ( _period ), możemy regulować wartością trwania impulsu ( _length ) bądź inaczej zwaną czasem przewodzenia, wykorzystywanym w metodzie regulacji impulsowej napięcia stałego.
Można w ten sposób zdefiniować wielkość zwaną współczynnikiem wypełnienia:

gdzie wartość tego współczynnika może się zmieniać od 0 do 1, na potrzeby prezentacji zostanie zdefiniowana procentowa wartość (od 0% do 100%).
W programie dla określenia częstotliwość generowanego sygnału PWM wykorzystanie zostanie poniższy wzór:

Ze względu na wrażliwość ludzkiego oka, a dokładnie na pulsacje sygnałów zmiennych, które oko jest w stanie wyłapać, w metodzie PWM zostanie użyta częstotliwość sygnału równa 100 [Hz], w ten sposób światło emitowane przez diodę LED zostanie odebrane jako ciągłe.
Tak więc okres ( _period ) będzie wynosił 10 [ms].ZAŁOŻENIA:- Liczba stopni, impulsów generowanych w ciągu okresu -> 100.
Pozwoli to na zmianę współczynnika wypełnienia od 0% do 100% z krokiem równym 1, tym samym jego zwiększanie wpłynie na intensywność świecenia diody LED.
W ten sposób czas trwania jednego impulsu będzie równy 10ms / 100 = 0,1 [ms].
Tak więc najmniejsza wartość impulsu (_length=1) będzie trwać 0,1[ms]Na samym początku zostaną skonfigurowane porty, oraz TIMER_1 pracujący w trybie CTC generującego przerwanie co 0,1 [ms].
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Wynikiem powyższego kodu będzie szybkie mruganie diodą na pinie PB0, zmiana stanu co 0,1 ms.

Odczytane z programu:
Difference: 0,1053 ms (czas między czerwoną a zieloną linią)
Poniższe kroki pozwolą wygenerować przebieg PWM o współczynniku wypełnienia równym 1%
Zdefiniowane zmienne globalne, przypisanie określonych wartości
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Modyfikacja obsługi przerwania
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
W momencie wystartowania licznika ( _counter ) gdy posiada wartość 0 stan na pinie do którego podpięta jest dioda LED_2 jest zmieniany na przeciwny (1). Gdy licznik osiągnie wartość określoną prze _length w tym przypadku wartość równą „1” następuje ponowna zmiana stanu na pinie (2). Licznik zlicza kolejne impulsy aż osiągnie wartość określoną przez _period, zostaje wyzerowany, i cykl się powtórzy(3).

Difference: 10,3907 ms ->OKRES ->_period
Przebiegi dla współczynnika wypełnienia
_length=0;
Difference: 10,3912 ms
oraz dla
_length=100
Difference: 10,1903 ms
Analizując przebiegi a także metodę, wprowadzamy drobne modyfikacje które sprawią, że dla wartości 0 zostanie określony poziom GND zaś dla 100 poziom VCC, w celu wyeliminowania zjawisk przedstawionych na powyższych przebiegach.
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
W tym momencie został stworzony program który generuje sygnał PWM o dowolnie określonej wartości współczynnika wypełnienia.
Kolejnym krokiem będzie stworzenie funkcji która pozwoli wprowadzać wartość współczynnika wypełnienia (_length), wartość okresu (_length), a także port na którym generowany będzie sygnał PWM.
Do tego celu zostanie stworzona i wykorzystana struktura.
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Ustawienie portu na którym będziemy generowany przebieg PWM, określenie wartości współczynnika wypełnienia oraz okresu.
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Tworzona funkcja która będzie generować przebieg PWM, posiadać będzie identyczną budowę jak ta która została wcześniej stworzona i umieszczona w obsłudze przerwania. Rożnica polega na tym, że będzie ona operować na zmiennych zdefiniowanych w strukturze.
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Otrzymany efekt:

W ramach przetestowania możliwości stworzonych funkcji sprawimy że:
- na pinie do którego podpięta jest dioda LED_1: zwiększanie wartości współczynnika wypełniane od 0 do 100
- na pinie do którego podpięta jest dioda LED_2: zmniejszanie wartości współczynnika wypełniane od 100 do 0
- na pinie do którego podpięta jest dioda LED_3: początkowo zwięszanie współczynnika wypełnienia od 0 do 100 a następnie zmniejszanie go od 100 do 0
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
To chyba było by wszystko. Co prawda zawarłem tu kilka informacji które, można by było pominąć a tym samym post ten był by nieco krótszy, no ale chciałem przedstawić krok po kroku jak się za to zabierałem, być może komuś właśnie tak zaprezentowany temat w jakimś stopniu pomoże, a jeżeli gdzieś popełniłem jakiś błąd czy to merytoryczny czy związany z zasadą, metodą pisania i tworzenia programu mam nadzieje, że wybaczycie i zrozumiecie początkującego sympatyka mikroklocków
