Powrót

Prosty generator sygnału prostokątnego do 16 MHz

W warsztacie elektronika niezbędne są różnorodne przyrządy pomiarowe i urządzenia. Poza multimetrem często potrzebny jest generator. Prosty DDS można kupić za niewielkie pieniądze lub zbudować samemu. Niestety zastosowany w mim AVR nie pozwala na generowanie szybkich sygnałów.
Projekt generatora powstał z potrzeby chwili. Potrzebowałem zmierzyć pasmo przenoszenia projektowanych właśnie obwodów wejściowych oscyloskopu i sond aktywnych. Mimo że posiadam DDS do 15 MHz kształt sygnału prostokątnego pozostawiał wiele do życzenia, dlatego zbudowałem generator na taniej płytce „Nucleo-L152” i module do Arduino „LCD Keypad Shield”. Dlaczego Nucleo a nie Arduino na AVR? Odpowiedź jest prosta, AVR potrafi wygenerować sygnał o maksymalnej częstotliwości 10 MHz, a w przypadku Arduino bez modyfikacji sprzętowych 8 MHz. Płytki Nucleo czy Discovery, zależnie od typu, potrafią generować przebieg do 120 MHz. Ponadto program na ARM pisze się szybciej i łatwiej niż na AVR.

Schemat

W praktyce nie istnieje, ponieważ w „Nucleo-L152” umieszczono moduł „LCD Keypad Shield” a sygnał prostokątny wyprowadzono przewodem z pinu PB11 modułu. Szczegóły na rysunku 1fotografii 2.

Rysunek 1

 

Fotografia 2

Do poprawnego funkcjonowania modułu „LCD Keypad Shield” z ARM konieczne jest włączenie rezystora 2kΩ pomiędzy wejście A0 a masę układu. W modelu rezystor dodano od spodu płytki, co widać na fotografii 3.

Fotografia 3

Rezystor jest konieczny, ponieważ zakres napięć generowanych przez klawiaturę zawiera się w zakresie od 0 do 5 V a STM32 pracuje poprawnie z napięciami do 3,3 V. Bez tego rezystora nie ma możliwości poprawnego odczytu wszystkich przycisków klawiatury.

Wgranie firmware do Nucleo

Plik z programem przesyła się do płytki Nucleo dużo prościej niż w przypadku Arduino IDE. Nie trzeba znać numeru portu COM, jedyne co należy zrobić, to skopiować plik „GeneratorPWM_Nucleo-L152re.bin” (do pobrania tutaj) do urządzenia „NOD_L152RE”. Można to zrobić z menadżera plików – rysunek 4, lub w bardziej zawiły sposób używając eksploratora plików – rysunek 5.

Rysunek 4

 

Rysunek 5

Generator pracuje zaraz po wgraniu programu. Prawdopodobnie będzie konieczne ustawienie kontrastu wyświetlacza potencjometrem umieszczonym w lewym górnym rogu płytki.

Obsługa

Klawiszami UP/DOWN zmienia się częstotliwość generowanego przebiegu w zakresie 500 Hz…16 MHz. Przyciski LEFT/RIGHT regulują wypełnienie. Zakres regulacji wypełnienia zależy od generowanej częstotliwości. Dla wysokich częstotliwości będzie niewielki, przykładowo dla 16 MHz nie można w ogóle regulować wypełnienia, wynosi ono zawsze 50%. Dla 10,666666 MHz dostępne są dwie możliwości – 33,33 i 66,66%, dla 4 MHz od 12,5 do 87,5% ale już dla 1 MHz rozciąga się w zakresie od 3,12 do 96,87%. Ustawienia zapamiętywane są w pamięci mikrokontrolera po 10 sekundach od zwolnienia ostatnio naciskanego przycisku. Do czasu zapisu, w prawym dolnym rogu wyświetlacza wyświetlana jest gwiazdka.

Program

Tu też jest łatwiej niż w Arduino IDE. Nie wybiera się portu COM. Program należy otworzyć w CubeIDE (opcja „Open projects from file systems” rysunek 6), kompilacja klawisz F12 wgranie do mikrokontrolera F8.

Rysunek 6

Jeśli program źle odczytuje klawisze przyczyny mogą być dwie:

– napięcie zasilania USB jest niższe niż 5 V (norma dopuszcza 4,1 V),

– rezystory przyporządkowane klawiszom i/lub rezystor 2kΩ pomiędzy wejściem A0 a masą mają skrajnie duży rozrzut parametrów.

W obu przypadkach problem rozwiąże zmodyfikowanie wartości w „if-ach” funkcji „getKey()”:


Niestety budowa modułu „LCD Keypad Shield” jak i wielu innych modułów dla Arduino jest mocno nieprzemyślana, stąd program, który zadziała u autora niekoniecznie zadziała u innych użytkowników.

Ciekawostka

Obsługa LCD jest niestandardowa i polega na wypełnieniu bufora w RAM. Dane do wyświetlacza wysyłane są na przerwaniach. Dzięki temu w procedurze obsługi LCD (pomijając jego inicjalizację) nie ma funkcji „delay”. W tym projekcie nie ma to znaczenia ale w wielu innych może mieć kluczowe, a ponieważ pierwszą funkcję obsługi LCD na przerwaniach napisałem około 2005 (na system z MC68000) wystarczyło dostosować ją do AVR i ARM.

 

 SaS, ZE

sas.ze@vp.pl