logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Moduł generator sygnału DDS AD9833 - tutorial - uruchomienie z ESP32 w PlatformIO

p.kaczmarek2 03 Wrz 2025 10:35 990 2

TL;DR

  • Moduł generatora sygnału DDS AD9833 uruchamiany z ESP32 w PlatformIO z gotową biblioteką robtillaart AD9833.
  • Wykorzystuje programowe SPI na dowolnych pinach, wspólną masę i zasilanie 3,3 V, więc nie wymaga konwertera poziomów.
  • AD9833 generuje sinusoidę, prostokąt i trójkąt do ok. 12,5 MHz przy 28-bitowej rozdzielczości.
  • Prosty test z AD.begin(), setFrequency(1000, 0) i setWave(...) potwierdził działanie, a biblioteka obsługuje dwa kanały i kilka układów na jednej magistrali.
  • Przy wyższych częstotliwościach jakość przebiegów spada, a moduł wymaga samodzielnego przylutowania złącza szpilkowego.
Wygenerowane przez model językowy.
REKLAMA
📢 Słuchaj (AI):
  • Oscyloskop Hantek pokazujący przebieg prostokątny z modułu AD9833 podłączonego do ESP32
    AD9833 to popularny układ scalony DDS (Direct Digital Synthesis), który umożliwia generowanie przebiegów sinusoidalnych, prostokątnych i trójkątnych w zakresie do ok. 12.5 MHz przy 28-bitowej rozdzielczości. Dzięki niewielkiemu modułowi dostępnym w sprzedaży (z wbudowanym oscylatorem 25 MHz) można go szybko uruchomić z dowolnym mikrokontrolerem. W tym temacie pokażę, jak można to zrobić z ESP32 w środowisku PlatformIO w oparciu o gotową bibliotekę robtillaart AD9833.
    Fragment datasheeta AD9833 z cechami technicznymi i opisem ogólnym
    Zacznijmy od samego modułu. Można go kupić za kilkanaście złotych w chińskim sklepie wysyłkowym. W naszym kraju jest niewiele drożej, bo cena wynosi nieco ponad 20 zł. Sam moduł dostajemy ze złączem szpilkowym, które musimy sami przylutować:
    Moduł generatora sygnału AD9833 z widocznymi pinami i oscylatorem 25 MHz
    Z drugiej strony piny są opisane:
    Moduł AD9833 z widocznymi oznaczeniami pinów na niebieskiej płytce PCB
    Nie ma tu problemu z zasilaniem, można uruchomić całość i na 5V, jak i na 3.3V. Dodatkowo nie trzeba konwertera napięć, w nocie katalogowej widzę że napięcie na pinach cyfrowych jest aż do VDD:
    Tabela parametrów maksymalnych układu AD9833 z wartościami napięć i temperatur.

    Do prezentacji użyję podstawowej płytki uruchomieniowej z ESP32 - też do kupienia za kilkanaście złotych.
    Płytka rozwojowa ESP32 z portem USB-C i oznaczeniami pinów
    Można ją wygodnie programować przez USB, a również przez WiFi (po odpowiednim skonfigurowaniu).

    Od strony programowej użyję Visual Studio Code z rozszerzeniem PlatformIO. Zaczynamy od pustego projektu:
    Okno kreatora nowego projektu PlatformIO z wybraną płytką ESP32 i frameworkiem Arduino
    Potem wyszukujemy interesującą nas bibliotekę. Obiecująca wydaje się być praca robtillaart pod nazwą AD9833.
    https://registry.platformio.org/libraries/robtillaart/AD9833
    Można ją dodać w samym PlatformIO, albo dopisać ręcznie do platformio.ini.
    Instrukcja użycia biblioteki AD9833 w PlatformIO z fragmentem kodu zależności
    Wychodzi wtedy:
    
    [env:esp32dev]
    platform = espressif32
    board = esp32dev
    framework = arduino
    lib_deps = robtillaart/AD9833@^0.4.3
    

    Uruchomimy teraz najprostszy kod. Wymaga on jednak wykonania podstawowych podłączeń, czyli wspólna masa, zasilanie do 3.3V, oraz trzy sygnały SPI - tutaj zdecydowałem się użyć programowego, więc nadały się dowolne piny. Połączenie wykonałem na płytce prototypowej:
    Moduł AD9833 podłączony do płytki prototypowej z przewodami połączeniowymi
    Kod dla mojego połączenia. Kolejno wpisałem indeksy pinów (15, 4, 2, tu nie ma mapowania):
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Wgrywamy i sukces:
    Oscyloskop Hantek pokazujący przebieg prostokątny z modułu AD9833 podłączonego do ESP32
    Teraz zastanówmy się, co nasz kod robi:
    - AD9833 AD(15, 4, 2) - ta linia inicjuje nowy obiekt klasy AD9833 i przekazuje indeksy pinów do jego konstruktora
    - AD.begin() - ta linia uruchamia AD9833
    - AD.setFrequency(1000, 0) - ta linia ustawia wybraną częstotliwość w Hz, drugi argument to kanał (dostępne są 2)
    - AD.setWave(AD9833_SQUARE1) - tu z kolei ustawiany jest rodzaj generowanej funkcji. Dostępne jest też oczywiście AD9833_SINE i AD9833_TRIANGLE

    Przetestujmy AD9833_SINE:
    Ekran oscyloskopu Hantek z przebiegiem sinusoidalnym 1000 kHz i amplitudą 312 mV
    Przetestujmy AD9833_TRIANGLE:
    Trójkątny przebieg o częstotliwości 9960 Hz na ekranie oscyloskopu Hantek
    Wersje 100Hz, 10kHz, 100kHz, 1MHz, 10MHz:
    Trójkątny przebieg sygnału 980 Hz na ekranie oscyloskopu Hantek2C42 Ekran oscyloskopu z przebiegiem trójkątnym 10 kHz o amplitudzie około 300 mV
    Trójkątny sygnał 100,6 kHz wyświetlany na oscyloskopie Hantek2C42 Trójkątny przebieg sygnału 1008 Hz na oscyloskopie Hantek 2C42
    Układ pracuje do 12.5 MHz ale wraz ze wzrostem częstotliwości jakość przebiegów spada.

    Biblioteka dodatkowo obsługuje kanały AD9833 - dostępne są dwa, pozwalają ustawić dwie funkcje i łatwo między nimi przełączać.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Warto pamiętać, że biblioteka może też obsłużyć kilka AD9833 na jednej magistrali SPI - po prostu każdy ma osobny pin select.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Podsumowując, pokazałem tu prosty w uruchomieniu moduł generatora sygnałowego DDS AD9833. Zademonstrowałem tu podstawy, czyli generowanie sygnałów sinusoidalnych, trójkątnych i prostokątnych w oparciu o programowe SPI, które może działać na dowolnych pinach. Wszystko opierało się o gotową bibliotekę i było możliwe do wyklikania nawet nie w jeden wieczór, lecz w pół godzinki czy tam kwadrans.
    Nie jest to oczywiście jedyny generator DDS dostępny w formie prostego do uruchomienia modułu, mamy też chociażby AD9850 (50MHz) czy tam SI5351, który już kiedyś uruchamiałem:
    Trzykanałowy generator zegera SI5351 i PIC32MX - pierwsze starcie
    Teraz pojawia się tylko pytanie, co dalej z tym AD9833 zrobić - jakieś sugestie? Może zintegrować z odbiornikiem SSB? Kiedyś takie uruchamiałem, ale u mnie jest ciężka sytuacja antenowa i nie da się dużo posłuchać... może wobulator? Albo jeszcze jakieś bardziej egzotyczne zastosowanie? Pomyślę, mogłaby z tego wyjść ciekawa prezentacja.

    Fajne? Ranking DIY
    Pomogłem? Kup mi kawę.
    O autorze
    p.kaczmarek2
    Moderator Smart Home
    Offline 
    Inżynier programista z wieloletnim doświadczeniem embedded i full stack developer.
    Specjalizuje się w: embedded, Full-Stack Developer
    p.kaczmarek2 napisał 14599 postów o ocenie 12614, pomógł 654 razy. Jest z nami od 2014 roku.
  • REKLAMA
  • #2 21652505
    austin007
    Poziom 17  
    Posty: 765
    Pomógł: 6
    Ocena: 275
    Ten AD9833 to chyba nie jest produkt AD? U mnie w szufladzie czeka na realizację oryginalny AD9852 i tu już ważny jest dobry projekt PCB i wzmacniacza/bufora i filtrów. W tym prostszym ,9833 też pewnie nota mówi o filtrach. Jak wygląda poziom harmonicznych?
  • #3 21658261
    slavo666
    Poziom 24  
    Posty: 729
    Pomógł: 37
    Ocena: 387
    p.kaczmarek2 napisał:
    12.5 MHz przy 28-bitowej rozdzielczości

    Warto zaznaczyć, że jest to pojemność akumulatora fazy (rozdzielczość dla częstotliwości), a rozdzielczość ADC to 10 bitów.
    austin007 napisał:
    ważny jest dobry projekt PCB i wzmacniacza/bufora i filtrów. W tym prostszym ,9833 też pewnie nota mówi o filtrach. Jak wygląda poziom harmonicznych?

    Widać wyraźnie, że nie ma tu żadnych filtrów, nawet filtrowanie zasilania nie jest zgodne z zaleceniami producenta. Moduł w tej postaci nadaje się tylko do testów działania.
📢 Słuchaj (AI):
REKLAMA