Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Dwukanałowy generator DDS 600kHz na ESP32

Zbig63 20 Dec 2021 21:46 3117 7
  • Dwukanałowy generator DDS 600kHz na ESP32
    Pracując nad kolejnym projektem stwierdziłem, że brakuje mi drugiego generatora sygnałowego.
    Tak zrodził się pomysł, aby zrobić na szybko generator na jakimś gotowym, tanim mini-module, do tego wyświetlacz LCD2x16 i enkoder z przyciskiem do wyboru parametrów. No i oczywiście oprogramowanie sterujące wszystkim. Po krótkim przeglądzie opcji na placu boju został tylko ESP32, a konkretnie DevKit-C v4. Trochę trudniej było z zakresem funkcjonalnym, bo apetyt rośnie w miarę jedzenia :-). Tak więc z prostego generatora zrobił się całkiem wypasiony.
    Poskładanie hardware poszło szybko, oprogramowanie zajęło kilka dni i powstało coś takiego:
    Dwukanałowy generator DDS 600kHz na ESP32
    Parametry generatora
    -Dwa kanały DSS mogące pracować niezależnie lub synchronicznie (w stosunku częstotliwości 1:1 do 1:20).
    Tutaj praca synchroniczna w stosunku 3:1 Kanał 1: 75KHz, kanał 2: 25kHz
    Dwukanałowy generator DDS 600kHz na ESP32
    -Zakres częstotliwości każdego kanału 1Hz - 600kHz z dokładnością ustawiania co 1Hz.
    -Zmiana częstotliwości z ustawialnym skokiem dla każdego kanału: x1Hz, 10, 100, 1000Hz, 1k, 10k, 100k
    -Ustawialne przebiegi dla każdego z kanałów:
    --Sinus,
    --piła narastająca,
    --piła opadająca,
    --trójkąt,
    --prostokąt (50%).
    -można zapisać i potem odtworzyć 6 zestawów ustawień. Pierwszy zestaw jest odtwarzany automatycznie przy starcie urządzenia. Jest to przydatne przy dłuższej pracy z jakimś projektem.

    Tak wygląda prostokąt i piła ("najtrudniejsze" przebiegi) o maksymalnej częstotliwości 600kHz:
    Dwukanałowy generator DDS 600kHz na ESP32
    -Drugi kanał może modulować pierwszy kanał:
    AM - głębokość modulacji od 5 do 100% co 5%.
    FM- dewiacja od 0,1% do 50%
    OOK – kluczowanie (wypełnienie) od 10 do 90%
    FSK – kluczowanie (wypełnienie) od 10% do 90%, offset częstotliwości (w dół) od 0,1% do 50%
    Sweep (przemiatanie od ustawionej częstotliwości do częstotliwości N razy niższej) – czas 1..10sek, N=2..100. Np. do badania charakterystyki częstotliwościowej układu.
    -Maksymalna częstotliwość sygnału modulującego 20kHz,
    Tak wygląda sinus zmodulowany trójkątem
    Dwukanałowy generator DDS 600kHz na ESP32
    A tak modulacja FM piłą
    Dwukanałowy generator DDS 600kHz na ESP32
    Trochę danych szczegółowych:
    Wykorzystuję wewnętrzny DAC i DMA do generowania przebiegu. Wyjścia DAC są buforowane, ale napięcia wyjściowe są w poziomach DAC-a 0..3V (asymetryczne), z racji zasilania tylko dodatnim napięciem. Bufor wyjściowy ma również filtr dolnoprzepustowy, bo trzeba wyfiltrować wszystkie zakłócenia i stany przejściowe, oraz wyższe harmoniczne.
    Próbkowanie sygnału wyjściowego jest 6.67 MSPS, wiec dla maksymalnej częstotliwości 600kHz przebieg składa się z 11 próbek.
    Dla modulacji próbkowanie (przeliczanie) jest 0.22 MSPS, co ogranicza maksymalną częstotliwość modulacji do 20kHz (przy zachowaniu 11 próbek/okres przebiegu modulującego)
    Wszystkie przebiegi (w tym prostokąt) są generowane jako DDS.
    Dla fali prostokątnej zbocza mają czasy narastania/opadania rzędu 200ns.
    Tablice LUT dla przebiegów są 8 bitowe (rozdzielczość DAC w ESP32 to 8 bitów) i 1024 elementowe.
    Zasilanie jest 7-25V (wbudowana przetwornica step down) lub 5V z USB.
    Program napisany w C z wykorzystaniem RTOS dla ESP32.
    Środowisko IDE Visual Studio + VisualGDB , do tego debugger JTAG FTDI.
    Obudowa metalowa (kupiona), przedni panel to wydruk 3D.
    Płyta główna (z płytki uniwersalnej) zawiera złącza do ESP, LCD, enkodera, JTAG-a oraz bufory wyjściowe (na tranzystorach)



    Sterowanie generatorem jest następujące:
    *Obracanie enkoderem zmienia generowaną częstotliwość wybranego kanału
    *Wciśnięcie enkodera i obracanie przy wciśniętym zmienia skok zmiany częstotliwości (x1Hz,x10Hz…x100k)
    *Wciśnięcie i puszczenie (kliknięcie) bez obracania zmienia cyklicznie z kanału 1 na kanał 2, a z kanału 2 do obsługi menu (a w nim wybór przebiegu i modulacji) i potem znów powrót do kanału 1.

    Schematu (jeszcze) nie mam, bo cały projekt powstał "w głowie".
    W załączniku plik firmware do wgrania (pod adresem 0x10000).

    Cool? Ranking DIY
    Can you write similar article? Send message to me and you will get SD card 64GB.
    About Author
    Zbig63
    Level 13  
    Offline 
    Zbig63 wrote 64 posts with rating 44, helped 4 times. Live in city Warszawa. Been with us since 2008 year.
  • #2
    User removed account
    Level 1  
  • #3
    Zbig63
    Level 13  
    Prosisz i masz :-)
    FFT Hamming dla 600kHz, 300kHz, 100kHz, 20kHz, 1kHz
    Dwukanałowy generator DDS 600kHz na ESP32 Dwukanałowy generator DDS 600kHz na ESP32 Dwukanałowy generator DDS 600kHz na ESP32 Dwukanałowy generator DDS 600kHz na ESP32 Dwukanałowy generator DDS 600kHz na ESP32

    Nie próbowałem jeszcze robić napisów 3D. Może kiedyś spróbuję, ale podejrzewam że przy głowicy 0.5mm zbyt ładne nie wyjdą.
    A w tym projekcie w sumie nie ma co drukować. Może gdybym dodał guziki (np. do szybkiego uruchamiania menu), to byłoby co opisywać.

    Do generowania przebiegów wykorzystuję I2S w trybie dwukanałowego DAC z DMA z dwoma buforami danych wypełnianymi naprzemiennie (jeden jest wysyłany a drugi wypełniany nowymi danymi).

    Bufory są wypełniane na podstawie statycznych tablic dla generowanych przebiegów (LUT) o rozmiarze 1024 próbek (bajtów) każda i wyliczanego upływu czasu (czyli indeksu do tych tablic).
    Do tego "nakładana" jest modulacja, czyli albo modyfikuję amplitudę każdej próbki pobranej z LUT danego przebiegu (dla AM/OOK), albo częstotliwość (czyli de facto modyfikuję 'upływ czasu' dla FM/FSK/Sweep). Do przyspieszenia modulacji generuję dodatkową tablicę LUT z przeliczonymi danymi do modulacji (na podstawie parametrów modulacji).
    Wypełnianie bufora zajmuje prawie cały czas jednego rdzenia ESP, na którym wyłączony jest RTOS (multitasking) i wszystkie przerwania. To pozwoliło na uzyskanie samplowania na poziomie 6.67 MSPS. Najwięcej czasu zżera modulacja AM :-), choć wszystko jest przeliczane na liczbach całkowitych, a kod jest zoptymalizowany.
    Drugi rdzeń obsługuje enkoder, menu, przeliczanie częstotliwości itp.

    Dodano po 8 [godziny] 51 [minuty]:

    No i jeszcze jeden z powodów zrobienia tego generatora: pomiar filtra kwarcowego 77500Hz
    Poniżej odpowiedź czasowa filtra (modulacja OOK 5Hz 50%) - widać, jak długo rezonator ustala amplitudę drgań i jak długo drgania wygasają.

    Dwukanałowy generator DDS 600kHz na ESP32
  • #5
    Zbig63
    Level 13  
    Tak wyglądają połączenia podstawowych modułów:
    Dwukanałowy generator DDS 600kHz na ESP32

    Mój enkoder nie miał wlutowanego opornika pullup na płytce, więc dodałem ten opornik na schemacie połączeń (10k).

    Taki układ zasilony ze złącza USB lub z zasilacza 5V już działa, choć w praktyce potrzebuje jeszcze buforów wyjściowych z filtrem low pass (wrzucę jako kolejny schemat).

    Jak widać układ nie jest szczególnie skomplikowany :-)

    Wyprzedzając pytania: czerwone kółeczka to piny "zajęte" przez sam moduł, żółte to piny debuggera JTAG. Resztę można jeszcze do czegoś wykorzystać.
  • #6
    krzbor
    Level 23  
    Zawsze się zastanawiałem do czego użyć DACa w ESP32. Są dwa i to co się nasuwa to zastosowanie w audio. Niestety 8bit to stanowczo za mało. Tobie udało się go użyć do czegoś sensownego. Czy planujesz publikację kodu? To może być pożyteczna lektura nawet jeśli ktoś go będzie analizował tylko w celach dydaktycznych.
  • #7
    Zbig63
    Level 13  
    Zasadniczo udostępniam tylko binaria, a nie kody źródłowe. O szczegółowych rozwiązaniach możemy podyskutować i wtedy fragmenty kodu mogę publikować "w celach edukacyjnych"

    edit:
    Dodałem w pierwszym poście załącznik: firmware w wersji 1.00.
  • #8
    Zbig63
    Level 13  
    Dodałem jeszcze opcję VCO: zewnętrzny sygnał (zakres napięć 0-2.4V) zmienia częstotliwość generatora w ustawialnym zakresie +/- 0.01% (100ppm) do 50%.
    Do obsługi ADC zaprzągłem rdzeń ULP, tak więc teraz wszystkie 3 rdzenie ESP32 mają zajęcie :-)

    Edit:
    Przy okazji dodałem też modulację amplitudy zewnętrznym sygnałem (0-2.4V), oraz rozszerzyłem zakres generowanych częstotliwości w dół do 0.1Hz (i taki jest też minimalny zakres zmiany częstotliwości).
    Wejście zewnętrznego sygnału modulującego musiałem dać z tyłu obudowy, bo na przednim panelu nie przewidziałem na to miejsca.

    Testy w toku.
    Nowy firmware wrzucę niebawem po testach.