Prosty generator PWM (Pulse-Width Modulation) zbudowany na mikrokontrolerze ATtiny24/44/84, zasilany stabilizowanym napięciem Vcc=2.7-5.5V (2.4-5.5V jeśli użyjemy mikrokontrolera w wersji "A"/"V"). Na jego wyjściu uzyskuje się sygnał prostokątny o wybranej, stałej częstotliwości 1.25/10/80 kHz oraz wypełnieniu regulowanym w zakresie 0-100%, z krokiem co 1%. Parametry sygnału wyjściowego są prezentowane na monochromatycznym wyświetlaczu OLED (sterownik SSD1306, magistrala I2C), o rozdzielczości 128x32/128x64 pikseli i adresie $78 ($3C)/$7A ($3D). Program sterujący napisałem w asemblerze i jest on identyczny dla każdego z wymienionych mikrokontrolerów.
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ł zrobienia 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.
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).
Aby zmniejszyć/zwiększyć wypełnienie sygnału o 1%, należy krótko (poniżej 250ms) nacisnąć przycisk (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 przyciski 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, spowoduje 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/niestabilna 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.
Przy programowaniu, należy pamiętać o odpowiednim ustawieniu fuse/lock bitów:
1. Gdy mikrokontroler będzie taktowany rezonatorem kwarcowym X1:
FL (Fuse Low): $FF, FH (Fuse High): $DF, FE (Fuse Extended): $FF, LB (Lock Bits): $FF.
2. 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.
Generator można zasilać napięciem stałym Vcc=2.7(2.4)-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 mikrokontrolera. 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. Płytka jest przystosowana do użycia wyświetlacza o wymiarach 38x12mm (128x32) lub 28x28mm (128x64), który ma sygnały rozmieszczone w kolejności: GND, VCC, SCL, SDA. Rezystory podciągające linie OSCL/OSDA dla OLED nie został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ść).
Dołączone archiwum zawiera: schemat w Eagle, płytkę w DipTrace, źródło, wsad oraz dokumentację w PDF. Strona projektu: Link.
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ł zrobienia 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.
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).
Aby zmniejszyć/zwiększyć wypełnienie sygnału o 1%, należy krótko (poniżej 250ms) nacisnąć przycisk (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 przyciski 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, spowoduje 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/niestabilna 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.
Przy programowaniu, należy pamiętać o odpowiednim ustawieniu fuse/lock bitów:
1. Gdy mikrokontroler będzie taktowany rezonatorem kwarcowym X1:
FL (Fuse Low): $FF, FH (Fuse High): $DF, FE (Fuse Extended): $FF, LB (Lock Bits): $FF.
2. 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.
Generator można zasilać napięciem stałym Vcc=2.7(2.4)-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 mikrokontrolera. 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. Płytka jest przystosowana do użycia wyświetlacza o wymiarach 38x12mm (128x32) lub 28x28mm (128x64), który ma sygnały rozmieszczone w kolejności: GND, VCC, SCL, SDA. Rezystory podciągające linie OSCL/OSDA dla OLED nie został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ść).
Dołączone archiwum zawiera: schemat w Eagle, płytkę w DipTrace, źródło, wsad oraz dokumentację w PDF. Strona projektu: Link.
Fajne? Ranking DIY Pomogłem? Kup mi kawę.