Elektronika     Prosty generator PWM v2 (ATtiny24)        




Jest to bardzo prosty generator PWM (Pulse-Width Modulation), zasilany stabilizowanym napięciem
Vcc=2.7-5.5V. Na jego wyjściu uzyskuje się sygnał prostokątny o wybranej, stałej częstotliwości 1.25/
10/80 kHz i wypełnieniu regulowanym w zakresie 0-100%, z krokiem co 1%. Aktualne parametry syg-
nału wyjściowego, są pokazywane na monochromatycznym wyświetlaczu OLED (sterownik SSD1306,
magistrala I2C), o rozdzielczości 128x32/128x64 pikseli i adresie $78 ($3C)/$7A ($3D). Może przydać
się w pracowni każdego elektronika, np. podczas testowania różnych prototypowych układów cyfro-
wych lub sprawdzania funkcji pomiaru wypełnienia sygnału w multimetrze.

Niedawno napisałem w asemblerze własne procedury do obsługi magistrali I2C i wyświetlacza OLED.
Szukałem sposobu, aby je wykorzystać w jakimś praktycznym urządzeniu i tak powstał pomysł zrobie-
nia tego generatora. Użyłem w nim mikrokontrolera ATtiny44 w obudowie SO14, bo akurat mam ich
bardzo dużo z demontażu. Jest on drugą wersją zrobionego przeze mnie kilka lat temu prostego
generatora PWM.

Sercem generatora jest popularny mikrokontroler ATtiny24(A/V). Zamiast niego można użyć modeli
ATtiny44(A/V)/84(A/V), 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 1384 bajty
pamięci FLASH). W pierwszej wersji generatora było dostępnych 7 różnych częstotliwości sygnału
wyjściowego - w tej wersji jest tylko 3. Wynika to z użytych procedur do programowej obsługi wyświe-
tlacza OLED na magistrali I2C, które działają prawidłowo tylko przy jednej, stałej i parzystej częstotli-
wości pracy CLK mikrokontrolera z zakresu 4-20 MHz. Dlatego pozostaje ona stała, a różne często-
tliwości sygnału wyjściowego są uzyskiwane jedynie przez zmianę stopnia podziału (1/8/64) dzielnika
(prescalera) częstotliwości, która taktuje licznik TC0 (w pierwszej wersji była też programowo zmie-
niana częstotliwość pracy CLK mikrokontrolera).

Mikrokontroler w wersji "A"/"V" wyróżnia się tym, że może pracować przy napięciu zasilania 1.8-5.5V
z maksymalną częstotliwością taktowania 20/10 MHz. Oznacza to, że po użyciu mikrokontrolera
ATtiny24A/V/44A/V/84A/V, generator będzie działał przy minimalnym napięciu Vcc=2.4V, ale nie 1.8V.
Jest to spowodowane tym, że im mniejsze napięcie zasilania Vcc, tym niższa jest maksymalna często-
tliwość z jaką może pracować mikrokontroler. Dla Vcc=1.8V maksymalna częstotliwość taktowania
wynosi 4 MHz, dla Vcc=2.7V wynosi ona 10 MHz, a dla Vcc=4.5-5.5V jest to 20 MHz (nie dotyczy
wersji "V"). Poniższy wykres przedstawia zależność maksymalnej częstotliwości taktowania Fmax
mikrokontrolera od jego napięcia zasilania Vcc.



Po włączeniu zasilania na wyjściu generatora (złącze CON2), uzyskuje się sygnał prostokątny o czę-
stotliwości 10 kHz, wypełnieniu 50% i poziomie zależnym od wartości napięcia zasilania Vcc (rysunek
1). Jeśli podczas włączania zworka J1 (FLIP) będzie zwarta (ON), to wyświetlany obraz zostanie obró-
cony o 180 stopni (rysunek 2). Jeśli po włączeniu zasilania wyświetlacz OLED nie zostanie wykryty,
to generator będzie działał normalnie bez niego. Wyświetlacz 128x64 jest traktowany jako 128x32,
dlatego wyświetlany na nim obraz ma 1-liniowe poziome przerwy (co druga pozioma linia jest pusta,
co powoduje rozciągnięcie obrazu w pionie).



Rysunek 1 (J1=OFF)


Rysunek 2 (J1=ON)

Aby zmniejszyć/zwiększyć wypełnienie sygnału o 1%, należy krótko (poniżej 250ms) nacisnąć przy-
cisk (mikrostyk) S1 (DUTY-)/S2 (DUTY+). Naciśnięcie i dłuższe przytrzymanie wciśniętego przycisku
S1/S2, spowoduje ciągłe zmniejszanie/zwiększanie wartości wypełnienia z szybkością ok. 4%/s, aż
do osiągnięcia wartości granicznej, czyli odpowiednio 0%/100%. Ustawienie wypełnienia o wartości
0%/100%, wymusi ciągły niski/wysoki stan logiczny (GND/Vcc) na wyjściu generatora.

Aby zmienić częstotliwość sygnału, należy krótko (poniżej 1s) nacisnąć jednocześnie obydwa przy-
ciski S1 i S2. Wtedy częstotliwość zmieni wartość na następną w kolejności: 10/80/1.25 kHz i tak
w kółko. Naciśnięcie i dłuższe przytrzymanie wciśniętych jednocześnie przycisków S1 i S2, spowo-
duje ciągłe zmienianie wartości częstotliwości z szybkością ok. 1x/s, aż do puszczenia przycisków.
Po każdej zmianie częstotliwości, początkowa wartość wypełnienia sygnału wynosi zawsze 50%
(niezależnie od wcześniejszego ustawienia).

Rezonator kwarcowy X1 taktuje pracę mikrokontrolera, dzięki czemu na wyjściu uzyskuje się sygnał
o dość dokładnej/stabilnej częstotliwości, a przebiegi czasowe sygnałów OSCL/OSDA są precyzyjne/
symetryczne względem siebie. Istnieje też możliwość taktowania mikrokontrolera jego wewnętrznym
oscylatorem RC, o nominalnej częstotliwości 8 MHz. Zaletą tego rozwiązania jest to, że nie trzeba
wtedy montować rezonatora X1 i kondensatorów C3/C4, ale dużą wadą jest bardzo niedokładna/nie-
stabilna częstotliwość sygnału wyjściowego oraz pogorszona jakość przebiegów czasowych sygnałów
OSCL/OSDA. Kondensatory C1 i C2 filtrują napięcie zasilania. Rezystor R2 ogranicza prąd pobierany
bezpośrednio z pinu PA7 mikrokontrolera - zapobiega jego uszkodzeniu w przypadku zwarcia wyjścia
CON2.

Po wlutowaniu wszystkich elementów w typowej kolejności, upewniamy się o braku zwarć. Następnie
programujemy mikrokontroler wsadem przez złącza CON1 (VCC) i CON4 (ISP), przy użyciu dowolnego
programatora ISP (In-System Programming). Konieczne jest również ustawienie odpowiednich wartości
fuse/lock bitów. W przypadku, gdy mikrokontroler będzie taktowany rezonatorem kwarcowym X1:
FL (Fuse Low): $FF, FH (Fuse High): $DF, FE (Fuse Extended): $FF, LB (Lock Bits): $FF. W przypad-
ku, gdy mikrokontroler będzie taktowany wewnętrznym oscylatorem RC: FL (Fuse Low): $E2, FH (Fuse
High): $DF, FE (Fuse Extended): $FF, LB (Lock Bits): $FF. Należy bardzo uważać, aby nie dokonać
zmian w fuse/lock bitach, które uniemożliwią dalsze programowanie mikrokontrolera. Po zaprogramo-
waniu mikrokontrolera odłączamy programator, podłączamy wyświetlacz OLED do złącza CON3 i włą-
czamy zasilanie generatora, który jest już gotowy do działania. Ponieważ złącze CON4 (ISP) znajduje
się pod wyświetlaczem, musi on być odłączany przy każdym programowaniu.

Moduł wyświetlacza posiada wlutowaną listwę kołkową goldpin, która jest wpinana do żeńskiego złą-
cza goldpin na płytce generatora (pozwala to na jego łatwe odłączenie/wymianę). Można go też przy-
lutować do płytki na krótkich drutach. Wyświetlacze OLED mają różne wymiary, rozmieszczenie otwo-
rów montażowych oraz sygnałów na wyprowadzeniach modułu. Płytka jest przystosowana do użycia
wyświetlacza o wymiarach 38x12mm (128x32) lub 28x28mm (128x64), który ma sygnały rozmieszczo-
ne w kolejności: GND, VCC, SCL, SDA. Rezystory podciągające linie OSCL/OSDA dla OLED nie zo-
stały umieszczone na płytce generatora, bo zawiera je płytka modułu wyświetlacza. Minimalne napię-
cie zasilania potrzebne do działania wyświetlacza OLED, wynosi ok. Vcc=1.8V (niska jasność).

Generator można zasilać napięciem stałym Vcc=2.7-5.5V z zasilacza lub z baterii/akumulatorów (np.
z jednego ogniwa typu 18650). Nie jest on w żaden sposób zabezpieczony przed odwrotnym podłą-
czeniem napięcia zasilania Vcc. Pomylenie polaryzacji tego napięcia spowoduje uszkodzenie mikro-
kontrolera. Pobór prądu bez wyświetlacza OLED przy napięciu Vcc=2.7/5V, wynosi maksymalnie
2.5/6.5mA (sygnał 80kHz/99%, wyjście generatora nie obciążone). Pobór prądu z wyświetlaczem
OLED 128x64 pikseli przy napięciu Vcc=5V, wynosi maksymalnie 8mA.

Generator zmontowałem na płytce jednostronnej o wymiarach 45x45mm, wykonanej metodą transferu
chemicznego. W jej rogach znajdują się cztery otwory montażowe o średnicy 3mm, dzięki którym płytkę
można przykręcić do obudowy lub zamontować w nich jakieś nóżki, na których będzie ona stała.

Dodatkowe informacje

Sygnał PWM jest generowany całkowicie sprzętowo przez timer/licznik TC0, który pracuje w trybie
"Fast PWM". W tym trybie jest aktywne podwójne buforowanie rejestrów OCR0x, które dopuszcza
zmianę ich wartości tylko w momencie osiągnięcia przez licznik górnej/dolnej (top/bottom) wartości
zliczania. Zapobiega to pojawianiu się na wyjściu niesymetrycznych impulsów PWM o nierównej
szerokości, dzięki czemu sygnał wyjściowy jest wolny od zakłóceń (glitchy).

Poniżej zamieszczam wyniki pomiarów sygnału wyjściowego z generatora zasilanego napięciem
Vcc=5.0V, które wykonałem oscyloskopem Siglent SDS824X HD (sonda 1x, próbkowanie 2GSa/s).
Na każdej częstotliwości wyjściowej i przy ustawieniu dowolnego poziomu wypełnienia z zakresu
1-99%, sygnał wyjściowy miał jednakowy poziom ok. 5.04V, nominalną wartość wypełnienia/często-
tliwości z dokładnością do 2 miejsc po przecinku oraz zbliżone czasy narastania/opadania zboczy,
wynoszące ok. 90ns.



Sygnał 1.25 kHz/50%


Sygnał 10 kHz/50%


Sygnał 80 kHz/50%


SPIS ELEMENTÓW:

Rezystory:
R1 - 10k
R2 - 220

Kondensatory:
C1 - 10u/10V
C2 - 100n
C3, C4 - 22p
Układy scalone:
U1 - ATtiny24/44/84

Rezonatory:
X1 - kwarcowy 8 MHz (niski)

Przełączniki:
S1, S2 - mikroprzełącznik
Złącza:
CON1, CON2, J1 - goldpin 2x1 (męskie)
CON3 - goldpin 4x1 (żeńskie), wysokość 8-9mm nad PCB
CON4 - goldpin 4x1 (męskie), wysokość 9mm nad PCB

Inne:
CON3 - wyświetlacz OLED z przylutowaną listwą kołkową
              goldpin 4x1, o wysokości 9mm nad PCB.
J1 - zworka 2x1