Elektronika     Programowany generator PWM (ATmega48)        




Jest to prosty generator PWM (Pulse-Width Modulation) czyli modulator szerokości impulsu, zasilany
stabilizowanym napięciem Vcc=4.75-5.25V. Na jego wyjściu uzyskuje się sygnał prostokątny o stałej
częstotliwości 1 Hz, ale o wypełnieniu regulowanym w zakresie 0-100% z krokiem co 1%, w zależności
od stopnia wypełnienia ustawionego zworkami J1-J7. Na pewno przyda się w pracowni każdego elek-
tronika-amatora, np. podczas testowania różnych prototypowych układów cyfrowych.
Sercem generatora jest popularny mikrokontroler ATmega48. Zamiast niego można użyć modeli
ATmega88/168/328, które różnią się jedynie większą ilością pamięci. Program sterujący napisałem
w asemblerze i jest on identyczny dla każdego z wymienionych mikrokontrolerów (zajmuje 2446 bajtów
pamięci FLASH).
Po włączeniu zasilania lub resecie mikrokontrolera przyciskiem S1, program sterujący konfiguruje pin
PB0 (nr 14) jako wyjście z niskim stanem logicznym (LOW), a wszystkie pozostałe piny jako wejścia
z wysokim stanem logicznym (pull-up - włączone wewnętrzne rezystory podciągające). Następnie mikro-
kontroler odczytuje stan zworek J1-J7, które są podłączone do pinów PD0-PD6. Jeśli wszystkie zworki
są rozwarte (OFF), to program przechodzi do wykonywania pętli generującej sygnał o wypełnieniu 0%
(tryb 0). Wtedy na wyjściu generatora (złącze CON1) ciągle panuje niski stan logiczny (LOW). Nato-
miast, jeśli na zworkach jest ustawiona jakaś wartość binarna X=1-99 (J1 - bit najmłodszy), to program
skacze do odpowiadającej jej pętli (tryb X), która jest wykonywana bez przerwy. W każdej takiej pętli
znajdują się dwie instrukcje zmieniające stan wyjścia PB0 na przeciwny, a pomiędzy nimi są instrukcje/
pętle decydujące, po jakim czasie (liczba cykli) następują te zmiany. Czasy pomiędzy jedną i drugą zmia-
ną są różne (oprócz wypełnienia 50%), ale zawsze ich suma wynosi 1 sekundę. Dzięki temu na wyjściu
generatora uzyskuje się sygnał prostokątny o różnym wypełnieniu, ale zawsze o częstotliwości 1 Hz.
Jeśli na zworkach jest ustawiona jakaś wartość binarna X>99, to program przechodzi do wykonywania
pętli generującej sygnał o wypełnieniu 100% (tryb 100). Wtedy na wyjściu generatora ciągle panuje
wysoki stan logiczny (HIGH).
Do prawidłowego działania generatora, konieczne jest użycie rezonatora kwarcowego X1 o częstotli-
wości nominalnej 4 MHz, ponieważ pętle opóźniające w programie sterującym, są napisane właśnie dla
takiej szybkości pracy mikrokontrolera. Przy tej częstotliwości mikrokontroler jest taktowany ok. 4000000
razy (cykli zegarowych CLK) na sekundę (1 CLK = 1s / 4000000 = 250 ns), w zależności od dokładności
samego rezonatora.
Przykład obliczania czasów opóźnień pomiędzy zmianami stanu pinu PB0 dla pętli generującej wypeł-
nienie 1%: 4000000 CLK = 1s = 100%; 1% z 1s wynosi: 4000000 CLK / 100 = 40000 CLK = 0.01s;
99% z 1s wynosi: 4000000 CLK - 40000 CLK = 3960000 CLK = 0.99s.
Po ustawieniu wysokiego stanu (HIGH) na pinie PB0 instrukcją "out PORTB,R17", pętla generuje opóź-
nienie równe 39999 CLK i wykonuje instrukcję "out PORTB,R18", która po upływie 1 CLK zmienia stan
pinu PB0 na niski (LOW). Stan wysoki utrzymuje się więc przez 40000 CLK (0.01s). Później pętla gene-
ruje opóźnienie równe 3959997 CLK, wykonuje instrukcję "rjmp Mode1", która po upływie 2 CLK powo-
duje skok na początek pętli, a następnie ponownie wykonuje instrukcję "out PORTB,R17", która po upły-
wie 1 CLK znowu zmienia stan pinu PB0 na wysoki (HIGH). Stan niski utrzymuje się więc przez 3960000
CLK (0.99s). Suma czasów opóźnień pomiędzy zmianami stanu pinu PB0 wynosi dokładnie 4000000
CLK (1s).
Rezystor R2 i kondensator C1 tworzą filtr dolnoprzepustowy, tłumiący zakłócenia oraz niebezpieczne
dla pinu PC6 mikrokontrolera szpilki napięcia, które powstają podczas drgań styków przy włączaniu
przycisku S1. Jednocześnie rezystor R2 zabezpiecza styki samego przełącznika S1, które są narażone
na przepływ prądu podczas zwierania kondensatora C1 do masy. Tranzystory T1 i T2 połączone rów-
nolegle pracują jako bufor wyjściowy, o wydajności do 100 mA.
Wszystkie możliwe do ustawienia kombinacje zworek J1-J7 i odpowiadające im stopnie wypełnienia
sygnału, znajdują się w poniższej tabeli.
Po wlutowaniu wszystkich elementów w typowej kolejności (najpierw zworki) i upewnieniu się o braku
zwarć, wkładamy mikrokontroler w podstawkę. Następnie włączamy zasilanie i programujemy go wsa-
dem przez złącze CON3, przy użyciu dowolnego programatora ISP (In-System Programming). Złącze
CON3 zawiera sygnały rozmieszczone w standardowy sposób zalecany przez firmę Atmel, a pokazany
na schemacie ideowym. Konieczne jest również ustawienie odpowiednich wartości fuse i lock bitów:
FL (Fuse Low): $F7, FH (Fuse High): $DF ($D9 dla ATmega328), FE (Fuse Extended): $F9 ($FF dla
ATmega48/328), LB (Lock Bits): $FF. Takie ustawienia powodują, że mikrokontroler korzysta z zew-
nętrznego rezonatora kwarcowego (bity CKSEL3-0=0111); wyłączony jest dzielnik częstotliwości przez
8, co powoduje taktowanie mikrokontrolera pełną częstotliwością rezonatora (CKDIV8=1); wydłużony
jest czas jego startu do ok. 65ms po włączeniu napięcia zasilania (SUT1-0=11); wyłączone jest genero-
wanie częstotliwości taktującej mikrokontroler na pinie PB0 (CKOUT=1); włączona jest możliwość jego
resetowania przez pin PC6 (RSTDISBL=1) oraz programowania przez interfejs szeregowy (SPIEN=0).
Należy bardzo uważać, aby nie dokonać zmian w fuse/lock bitach, które uniemożliwią dalsze progra-
mowanie mikrokontrolera.
Po prawidłowym zaprogramowaniu mikrokontrolera, odłączamy programator od generatora. Następnie
na zworkach J1-J7 ustawiamy kombinację, odpowiadającą wybranemu stopniowi wypełnienia sygnału
i naciskamy przycisk S1. Na wyjściu generatora powinien pojawić się sygnał prostokątny, o częstotli-
wości 1 Hz i określonym wypełnieniu.
Generator zmontowałem na płytce jednostronnej o wymiarach 50x50 mm (2 zworki). W rogach płytki
znajdują się otwory montażowe o średnicy 3 mm, które mogą służyć do jej przykręcenia do obudowy lub
zamocowania w nich specjalnych nóżek, na których płytka będzie stała. Jako małą ciekawostkę dodam,
że płytkę prototypową wykonałem bez trawienia (mini wiertarką z małym frezem).
Ten generator ma identyczną płytkę drukowaną, jak Programowany generator częstotliwości. Oba pro-
jekty różnią się jedynie częstotliwością rezonatora kwarcowego X1, która w tym wypadku musi wynosić
4 MHz oraz programem sterującym.

UWAGA! Generator nie jest w żaden sposób zabezpieczony przed odwrotnym podłączeniem napięcia
zasilania Vcc. Pomylenie polaryzacji tego napięcia spowoduje uszkodzenie mikrokontrolera.

Wszystkie możliwe kombinacje zworek J1-J7 i odpowiadające im stopnie wypełnienia sygnału:

J7...J1DUTY [%]
00000000
00000011
00000102
00000113
00001004
00001015
00001106
00001117
00010008
00010019
000101010
000101111
000110012
000110113
000111014
000111115
001000016
001000117
001001018
001001119
001010020
001010121
001011022
001011123
001100024
001100125
001101026
001101127
001110028
001110129
001111030
001111131
J7...J1DUTY [%]
010000032
010000133
010001034
010001135
010010036
010010137
010011038
010011139
010100040
010100141
010101042
010101143
010110044
010110145
010111046
010111147
011000048
011000149
011001050
011001151
011010052
011010153
011011054
011011155
011100056
011100157
011101058
011101159
011110060
011110161
011111062
011111163
J7...J1DUTY [%]
100000064
100000165
100001066
100001167
100010068
100010169
100011070
100011171
100100072
100100173
100101074
100101175
100110076
100110177
100111078
100111179
101000080
101000181
101001082
101001183
101010084
101010185
101011086
101011187
101100088
101100189
101101090
101101191
101110092
101110193
101111094
101111195
J7...J1DUTY [%]
110000096
110000197
110001098
110001199
1100100100
1100101
1100110
1100111
1101000
1101001
1101010
1101011
1101100
1101101
1101110
1101111
1110000
1110001
1110010
1110011
1110100
1110101
1110110
1110111
1111000
1111001
1111010
1111011
1111100
1111101
1111110
1111111

  0 - zworka rozwarta (OFF), 1 - zworka zwarta (ON).


SPIS ELEMENTÓW:

Rezystory:
R1 - 10k
R2 - 470

Kondensatory:
C1, C2 - 100n
C3 - 100u/10V
C4, C5 - 22p
Tranzystory:
T1 - BC547 (lub inny NPN)
T2 - BC557 (lub inny PNP)

Układy scalone:
U1 - ATmega48/88/168/328
Rezonatory:
X1 - kwarcowy 4 MHz

Przełączniki:
S1 - mikroprzełącznik

Złącza:
CON1, CON2 - goldpin 2x1 (męskie)
CON3 - goldpin 3x2 (męskie)

Inne:
U1 - podstawka DIP28 zwykła
J1-J7 - zworka 2x1