Elektroda.pl
Elektroda.pl
X
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 5397 39
  • 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 0.1Hz - 600kHz z dokładnością ustawiania co 0.1Hz.
    -Zmiana częstotliwości z ustawialnym skokiem dla każdego kanału: x0.1Hz 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 z racji stromych zboczy sygnału) 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,
    -Sygnał modulujący (o zakresie napięcia 0-2.4V) można też podać z zewnątrz na dodatkowe wejście generatora.

    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.

    Schematy układu (osobno generator i osobno bufor) są zamieszczone w kolejnych postach.
    W załączniku pliki firmware do wgrania (oczywiście trzeba rozpakować zip-y i wgrywać pliki *.bin), oraz instrukcja flashowania w pliku pdf.

    Cool? Ranking DIY
    About Author
    Zbig63
    Level 14  
    Offline 
    Zbig63 wrote 89 posts with rating 51, helped 4 times. Live in city Warszawa. Been with us since 2008 year.
  • #2
    User removed account
    Level 1  
  • #3
    Zbig63
    Level 14  
    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 14  
    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 24  
    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 14  
    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 14  
    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.
  • #9
    moorgan
    Level 11  
    Zbig63 wrote:
    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).

    Witam
    Czy mógłbym prosić o schemat buforów wyjściowych z filtrem?
  • #10
    AP200
    Level 12  
    Witam też jestem zainteresowany całym schematem.
    Pozdrawiam
  • #11
    Zbig63
    Level 14  
    Niestety zrobiłem na razie tylko uproszczony układ na tranzystorach, zasilany z jednego napięcia +5V i bez przesuwania poziomu sygnału wyjściowego do symetrycznego względem zera - jest tylko kondensator odcinający składowa stałą.
    Zajął mnie kolejny projekt i tego jeszcze nie dokończyłem :-(.
    Tak to wygląda na chwilę obecną:

    Dwukanałowy generator DDS 600kHz na ESP32

    Opornik 1kOhm zaznaczony na wyjściu ADC na schemacie z ESP i ten na wejściu bufora na tym schemacie to oczywiście ten sam opornik.
  • #12
    AP200
    Level 12  
    Witam jakim programem mogę wgrać wsad.
  • #14
    AP200
    Level 12  
    Dziękuję za instrukcję ale mam problem.
    Mam programator ST-Link v2 klon niewiem jak go podłączyć do ESP32-DevKitC V4.
    Nie chcę go uszkodzić.

    Dodano po 30 [minuty]:

    Witam wsad wgrany przez kabel USB miałem nie ten sterownik i ustawienia portu.
  • #16
    AP200
    Level 12  
    Witam połączyłem moduły zgodnie ze schematem na płytce stykowej.
    Wsad wgrany poprawnie zgodnie z instrukcją finish na zielono problem jest taki że wyświetlacz nie wyświetla pokazuje prostokąty albo jest coś nie tak z wsadem albo ze schematem.
  • #17
    Zbig63
    Level 14  
    Hmm,
    Jeśli prostokąty są na całym wyświetlaczu (obydwie linie) to być może twój wyświetlacz LCD wymaga ustawienia poziomu kontrastu (ja kupiłem serię LCD które mają automatyczny kontrast).
    Spróbuj odłączyć pin VSS (3-ci od brzegu) wyświetlacza od masy i podłączyć do potencjometru 4,7k (skrajne nóżki potencjometru do masy i +5V, środek do nóżki VSS) i wyreguluj położenie tak, aby znaki były widoczne.
    Jeśli czarna jest tylko jedna linia, to sprawdź podłączenie pinów wyświetlacza.
  • #18
    AP200
    Level 12  
    Prostokąty są na górnej części wyświetlacza kontrast był zrobiony pierwszy.
    Zastanawiam się jaki jest sterownik w wyświetlaczu w projekcie mój ma HD 44780 mam cztery wyświetlacze i na 100% sprawne.
    Moduły kupiłem dwa nowe wiec powinny być dobre konwerter UART/USB jest na CP2102.
    Mam pytanie czy podczas programowania modułu dioda LED w module nie powinna migać.
  • #19
    Zbig63
    Level 14  
    Sterownik powinien być we wszystkich ten sam (nie spotkałem się żeby było coś innego/nie zgodnego z HD77780).
    Mam wyświetlacze innego producenta to spróbuję je podłączyć i sprawdzić. No i zweryfikuję, czy nie zrobiłem jakiegoś błędu na schemacie.
    Nie pamiętam, czy dioda miga podczas programowania. Ale jak program nie wywalił błędu, to programowanie przeszło prawidłowo.

    EDIT: schemat połączeń LCD jest prawidłowy - sprawdziłem przed chwilą miernikiem wszystkie połączenia.
    Sprawdziłem również na 3 innych i różnych wyświetlaczach LCD (jeden bardzo stary, drugi sprzed kilku lat i jeden kupiony w tym roku) - wszystkie działają.

    Sprawdź, czy kolejność pinów (szczególnie Rw/Rs/E) w Twoim wyświetlaczu jest taka sama jak u mnie.

    LCD       ESP32
    RS_PIN     23 
    RW_PIN     22 
    EN_PIN     21 
    DATA4	   19 
    DATA5	   18
    DATA6	   5
    DATA7	   17
  • #20
    AP200
    Level 12  
    Też mam wyświetlacze 1602A i 1602C sprawdziłem połączenia między modułem a wyświetlaczem wszystko się zgadza moduł i wyświetlacz w płytce stykowej przejścia są.
    Jakim napięciem ma być zasilany moduł tylko 5V czy też 3,3V powoli brakuje mi pomysłów.
  • #21
    Zbig63
    Level 14  
    Tylko 5V, bo 3.3V to jest wyjście stabilizatora na płytce.
    Przygotowałem mały programik testowy, który na wyjściach płytki ESP (tych do LCD) zmienia co pół sekundy stan wyjściowy. Jak podłączysz tam LED-a (przez opornik 300 Ohm do masy) to powinno migać. Sąsiednie piny migają naprzemiennie (aby sprawdzić/wykluczyć zwarcie między pinami).
    Rozpakuj zip-a, wgraj plik "blink.bin" i sprawdź czy działa.
  • #22
    AP200
    Level 12  
    Nie stety pin data6 świeci cały czas reszta wygaszona ale wkładając moduł z wsadem generatora czy z wsadem testowym efekt ten sam pin data6 świeci cały czas reszta wygaszona.
    Albo oba moduły są uszkodzone albo się nie programują. Dwukanałowy generator DDS 600kHz na ESP32 Dwukanałowy generator DDS 600kHz na ESP32

    Dodano po 2 [minuty]:

    Naciskając reset na module dioda led na pinie data6 gaśnie.
  • #23
    Zbig63
    Level 14  
    Prawdę mówiąc nie wiem o co chodzi. Sprawdzałem testowy program na innym egzemplarzu (też DevKitC v4). Programuje się i działa.
    A dokładniej to po samym zaprogramowaniu ESP sam nie startuje, trzeba albo nacisnąć reset albo odłączyć/podłączyć zasilanie (USB)

    Jeśli moduł reaguje na reset (gaśnie LED), to ESP żyje. Czy moduły miały wcześniej wgrywane jakiś inne oprogramowanie?
    Spróbuj w aplikacji do programowania kliknąć [ERASE] a potem zresetować ESP i zobaczyć czy dioda na DATA6 się zapali (powinny być wszystkie zgaszone). Jeśli będzie OK, to spróbuj wtedy wgrać aplikację testową.
  • #24
    AP200
    Level 12  
    Zastosowałem się do rad ale nic to nie dało ale dziękuję za rady.
    Dioda na Data6 dalej się zapala i gaśnie po naciśnięciu reset wątpię by oba moduły były uszkodzone działają tak samo.
    Nie miałem nigdy do czynienia z ESP32 z Atmega i PIC nie miałem problemów.
    Kupię chyba jeszcze jeden moduł i zobaczymy jak będzie działał ale to dopiero w końcu maja jak wrócę.
  • #25
    Zbig63
    Level 14  
    Może spróbuj czyszenia flasha przez esptools:

    Instrukcja dla Windows: (musimy mieć zainstalowanego Pythona)
    Otwieramy okno konsoli (Win+R i wpisujemy cmd) i uruchamiamy kolejno polecenia:
    1) Aktualizujemy pip do najnowszej wersji
    python -m pip install --upgrade pip
    2) Instalujemy esptool.py
    pip install esptool
    3) uruchamiamy esptool:
    esptool.py --chip esp32 erase_flash

    Po tym sprawdź czy po resecie dioda na żadnej linii LCD nie świeci i spróbuj załadować flash.bin i sprawdzić.

    Acha, jest jeszcze jedno: pin GPIO5 podczas startu ESP powinien być w stanie wysokim (ma wewnętrzny rezystor pullup). Normalnie wejście LCD nie ma tu wpływu, ale jeśli z jakiegoś powodu ten pin jest w stanie niskim (nie masz tam żadnego rezystora do masy? - również dioda LED nie powinna być tam podpięta podczas resetu, chyba że jest przypięta nie do masy ale do +3,3V), bo to może zmienić tryb SPI dla FLASH-a.

    To ostatnie co przychodzi mi do głowy
  • #26
    AP200
    Level 12  
    Napięcie na pinie 5 jest 3,2V i po naciśnięciu reset spada do 0,6V na pozostałych pinach co jest podłączony LCD jest 0,6V.
    Mam pytanie chodzi omoduł i przycisk boot z jego lewej strony brak elementu chyba kondensatora są tylko kropki cyny.
    Oglądając zdjęcia tego modułu powinien tam być jakiś element opornik lub kondensator ale niema w obu modułach.
    Proszę o sprawdzenie co tam jest .
  • #27
    Zbig63
    Level 14  
    U mnie też są tam puste pola lutownicze, to jest OK.
    Przy wciśniętym resecie na wszystkich pinach (do LCD) na ESP32 powinno być 0V (z odłączonym LCD, bo nie wiem czy LCD nie ma jakiegoś pullup-u) a nie 0.6V (piny podczas resetu procesora są w stanie wysokiej impedancji czyli tak jakby miernik był odłączony od pinu). Po zwolnieniu resetu na pinie 5 powinno być 3.2V i to jest OK. Czy próbowałeś zaprogramować ESP32 z programu Arduino (jakiś najprostszy przykład LED blink)?
  • #28
    AP200
    Level 12  
    A czy podczas programowania trzeba nacisnąć lub przytrzymać któryś przycisk.
  • #29
    Zbig63
    Level 14  
    Nie. Nic nie trzeba naciskać.

    Ale już wiem o co chodzi. Twoje moduły są "czyste" wcześniej nie używane/programowane. Ja swoje programowałem wcześniej za pomocą interfejsu j-tag. U ciebie po prostu brakuje pliku bootloadera i tablicy partycji, które u mnie wgrywał automatycznie programator.
    Uaktualniłem w pierwszym poście wszystkie pliki do pobrania oraz instrukcję flashowania.
    Teraz powinno wszystko pójść jak trzeba.
  • #30
    AP200
    Level 12  
    Witam bardzo dziękuję za okazaną pomoc wszystko ruszyło bez Twojej pomocy nie dałbym rady.
    Jeszcze raz wielkie dzięki.