Sale!

Direct Digital Synthesis AD9850 Signal Generator Module (DDS Module)

Original price was: 12,49 €.Current price is: 10,03 €. Excluding VAT

Direct Digital Synthesis AD9850 Signal Generator Module DDS

Available on back-order

Domande su questo prodotto? Scrivi a Lana su WhatsApp

🎬 The product on video

Description

📡 AD9850 Direct Digital Synthesis (DDS) Signal Generator Module – Complete Description and Guide for Use with Arduino


🔧 General Description of the AD9850 DDS Module

The AD9850 DDS Module (Direct Digital Synthesis) is a variable frequency sine, square, and triangular wave signal generator , widely used in hobbyist, amateur radio, and educational settings for generating test signals and development., widely used in hobbyist, amateur radio, and educational settings for generating test signals and development.

✅ Main Chip:

  • Analog Devices AD9850 Operating Voltage:
  • 5V DC Output Frequency:
  • from 0 Hz up to approximately 40 MHz (sinusoidal recommended up to 20 MHz for signal purity) (recommended sine wave up to 20 MHz for signal purity)
  • 32-bit tuning word (very precise frequency) 32-bit tuning word (very precise frequency)
  • Control Interface: Serial (parallel available but less used with Arduino)
  • Output Signals:
    • Filtered sine wave output
    • Square wave output (TTL, up to 5Vpp)
  • Connectors: Standard 2.54 mm header pins
  • Integrated Components:
    • 125 MHz quartz oscillator
    • Low-pass filter for sine wave output
    • Operational amplifier for direct drive

⚙️ AD9850 Module Pinout

PIN Description
VCC 5V Power Supply
GND Ground
D7 – D0 Parallel data bus (not used in serial)
W_CLK Write clock
FQ_UD Frequency update (latch)
DATA Serial data
RESET Chip reset
SQ_OUT Square wave output
SIN_OUT Filtered sine wave output

🧠 How Does the DDS (Direct Digital Synthesis) Work?

The principle of DDS involves generating a sine wave digitally through a phase accumulator, a ROM containing sine values, and a DAC. This allows for precise and rapid variation of the output frequency with excellent stability.


🔌 Connecting the AD9850 Module to Arduino

✨ Arduino UNO Connection Diagram:

Arduino AD9850 Module
5V VCC
GND GND
D2 RESET
D3 DATA
D4 W_CLK
D5 FQ_UD

🧪 Example Code for Arduino

You can easily control the AD9850 module with a dedicated library or directly through code. Here is a basic example without a library to generate a 1 MHz signal:, for generating a signal at 1 MHz:

#define W_CLK 4 // Pin W_CLK
#define FQ_UD 5 // Pin FQ_UD
#define DATA 3 // Pin DATA
#define RESET 2 // Pin RESET

void setup() {
 pinMode(W_CLK, OUTPUT);
 pinMode(FQ_UD, OUTPUT);
 pinMode(DATA, OUTPUT);
 pinMode(RESET, OUTPUT);

 // Reset iniziale del modulo
 digitalWrite(RESET, LOW);
 digitalWrite(W_CLK, LOW);
 digitalWrite(FQ_UD, LOW);
 digitalWrite(RESET, HIGH);
 digitalWrite(RESET, LOW);

 setFrequency(1000000); // 1 MHz
}

void loop() {
 // Nessuna azione continua necessaria
}

void pulse(int pin) {
 digitalWrite(pin, HIGH);
 delayMicroseconds(1);
 digitalWrite(pin, LOW);
}

void setFrequency(unsigned long frequency) {
 // Costante derivata da 2^32 / 125 MHz (frequenza dell’oscillatore)
 double tuningWord = (frequency * pow(2, 32)) / 125000000.0;
 unsigned long freqWord = (unsigned long)(tuningWord);

 // Invia la word a 32 bit (LSB first)
 for (int i = 0; i < 4; i++) {
 shiftOut(DATA, W_CLK, LSBFIRST, freqWord >> (8 * i));
 }

 shiftOut(DATA, W_CLK, LSBFIRST, 0x00); // Ultimo byte: controllo fase

 // Aggiorna il DDS
 pulse(FQ_UD);
}

📚 🔄 Advanced Guide: What You Can Do

🔄 Dynamically Change the Frequency

You can write a function that reads values from a potentiometer or serial and updates the frequency in real-time.

🎛️ Possible Modulations

  • FSK: by rapidly changing the frequency
  • PSK: by changing the phase
  • AM (limited): with external circuitry
  • Sweep: frequency sweep generation for frequency response testing

📈 Output to Oscilloscope

Connect SIN_OUT directly to an oscilloscope or an amplifier. The signal can be weak for high impedance loads.


📦 Alternative Libraries (optional)

To facilitate usage, you can use an Arduino library such as:

DDS_AD9850
Installable from GitHub: https://github.com/F4GOJ/AD9850

Example with library:

#include <AD9850SPI.h>

AD9850SPI dds(5, 4, 3); // FQ_UD, W_CLK, DATA

void setup() {
 dds.reset();
 dds.setFrequency(2000000); // 2 MHz
}

void loop() {
 // puoi aggiornare dinamicamente se vuoi
}

🛠️ Usage Tips

  • Filter the power supply well to avoid noise
  • Avoid very high frequencies if you want a clean sinusoidal signal
  • For generating triangular waves, additional filtering is required (not natively supported)
  • Use SQ_OUT if you need a precise TTL signal

🧾 Typical Applications

  • Test generator for amplifiers
  • RF Signal Generation for Ham Radio
  • Frequency Response Analysis
  • Interface with Mixer for SDR Experiments
  • Signal Generator for Musical Instruments

Great! I propose a complete guide to build a multifunction AD9850 signal generator with Arduino, integrating all three functions you mentioned:


🎛️ PROJECT: Multifunction AD9850 Signal Generator

🔹 Features:

  1. Frequency control via rotary encoder
  2. OLED display visualization
  3. Optional control via Bluetooth / serial (smartphone or PC)

🧰 Required Components:

Component Quantity Notes
Arduino UNO/Nano 1 Mega is also compatible
AD9850 DDS Module 1 Frequency up to 40 MHz
Rotary Encoder with Push Button 1 Model EC11
128×64 I2C OLED Display (SSD1306) 1 0.96″ recommended
Optional Bluetooth HC-05/HC-06 Module 1 For remote control
Optional buttons 1-2 For reset/sweep
Breadboard or PCB 1 and jumper wires

⚙️ Connection Diagram

✳️ AD9850 Connection

AD9850 Arduino
VCC 5V
GND GND
W_CLK D4
FQ_UD D5
DATA D3
RESET D2
SIN_OUT Oscilloscope, amplifier etc.

🔄 Rotary Encoder

Encoder Arduino
CLK D6
DT D7
SW (button) D8

📺 OLED Display (SSD1306 I2C)

OLED Arduino
VCC 3.3V o 5V
GND GND
SDA A4
SCL A5

📡 HC-05 Bluetooth (optional)

HC-05 Arduino
VCC 5V
GND GND
TX RX (D0)
RX TX (D1, with voltage divider!)

🧪 Arduino Code (Basic functions integrated)

📦 Required Libraries:

  • U8g2lib for OLED
  • RotaryEncoder manual control
  • SoftwareSerial via Bluetooth (if used)

Install from Library Manager:

  • U8g2 by olikraus

✅ Simplified code:

#include <U8g2lib.h>
#include <Wire.h>

#define W_CLK 4
#define FQ_UD 5
#define DATA 3
#define RESET 2

#define ENCODER_CLK 6
#define ENCODER_DT 7
#define ENCODER_SW 8

unsigned long frequency = 1000000; // 1 MHz di default
long step = 1000; // Passo iniziale (1 kHz)

// OLED: U8G2_SSD1306_128X64_NONAME_F_SW_I2C(RST, SCL, SDA)
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ A5, /* data=*/ A4, /* reset=*/ U8X8_PIN_NONE);

void pulse(int pin) {
 digitalWrite(pin, HIGH);
 delayMicroseconds(1);
 digitalWrite(pin, LOW);
}

void setFrequency(unsigned long freq) {
 double tuningWord = (freq * pow(2, 32)) / 125000000.0;
 unsigned long freqWord = (unsigned long)(tuningWord);

 for (int i = 0; i < 4; i++) {
 shiftOut(DATA, W_CLK, LSBFIRST, freqWord >> (8 * i));
 }
 shiftOut(DATA, W_CLK, LSBFIRST, 0x00); // Phase = 0
 pulse(FQ_UD);
}

void setup() {
 pinMode(W_CLK, OUTPUT);
 pinMode(FQ_UD, OUTPUT);
 pinMode(DATA, OUTPUT);
 pinMode(RESET, OUTPUT);

 digitalWrite(RESET, LOW);
 digitalWrite(W_CLK, LOW);
 digitalWrite(FQ_UD, LOW);
 digitalWrite(RESET, HIGH);
 digitalWrite(RESET, LOW);

 pinMode(ENCODER_CLK, INPUT);
 pinMode(ENCODER_DT, INPUT);
 pinMode(ENCODER_SW, INPUT_PULLUP);

 u8g2.begin();
 setFrequency(frequency);
 displayFreq();
}

int lastCLK = HIGH;

void loop() {
 int clk = digitalRead(ENCODER_CLK);
 int dt = digitalRead(ENCODER_DT);

 if (clk != lastCLK && clk == LOW) {
 if (dt == HIGH) {
 frequency += step;
 } else {
 frequency = max(frequency - step, step);
 }
 setFrequency(frequency);
 displayFreq();
 }
 lastCLK = clk;

 if (digitalRead(ENCODER_SW) == LOW) {
 step = (step == 1000) ? 100000 : 1000;
 delay(300); // debounce
 }
}

void displayFreq() {
 u8g2.clearBuffer();
 u8g2.setFont(u8g2_font_ncenB08_tr);
 u8g2.setCursor(0, 20);
 u8g2.print("Freq:");
 u8g2.setCursor(0, 40);
 u8g2.setFont(u8g2_font_fub20_tr);
 u8g2.print(frequency / 1000.0, 3);
 u8g2.print(" kHz");
 u8g2.sendBuffer();
}

📡 Control via Bluetooth / Serial Monitor

Add this function to receive a serial command of the type: F2000000 → change frequency to 2 MHz

Added to loop():

if (Serial.available()) {
 String input = Serial.readStringUntil('n');
 if (input.startsWith("F")) {
 unsigned long newFreq = input.substring(1).toInt();
 if (newFreq > 0 && newFreq < 40000000) {
 frequency = newFreq;
 setFrequency(frequency);
 displayFreq();
 }
 }
}

🔄 Automatic Sweep (optional)

Add a function to sweep between two frequencies:

void sweep(unsigned long fStart, unsigned long fStop, int delayMs) {
 for (unsigned long f = fStart; f <= fStop; f += step) {
 setFrequency(f);
 displayFreq();
 delay(delayMs);
 }
}

🧾 Possible Expansions

  • Add an OLED menu to choose waveform (square/sine)
  • Save last frequencies in EEPROM
  • USB-C port with isolation for bench instruments
  • Android Bluetooth app to control frequency

✅ Conclusion

You now have a fully controllable DDS platform:

  • Manually with encoder
  • Graphically via display
  • Remotely via smartphone or PC

GENERAL INFORMATION

MODEL

AD9850 Module DDS Signal Generator

MATERIALS

pcb + components

COMPATIBILITY

ARDUINO

ELECTRICAL COMPONENTS

INPUT VOLTAGE

3,3 – 5 V

WEIGHT AND DIMENSIONS

PRODUCT WEIGHT

15g

PACKAGE WEIGHT

0.55 kg

PRODUCT DIMENSIONS

(L x W x H)

4.6 x 2.5 x 2

PACKAGE DIMENSIONS

(L x W x H)

10 x 5 x 5 cm

CONTENTS OF THE PACKAGE

CONTENTS OF THE PACKAGE

1 x Module

We have datasheets available for all components, should it not be present in the product download sheet, please send us a message through the contact form and we will publish it as soon as possible on our website.

Tutorial: How to Use AD9850 DDS Signal Generator

The AD9850 DDS module is a direct digital synthesizer signal generator ideal for makers who want to create and modify precise sinusoidal signals. This component is particularly useful for radio communication projects, testing, and measurement.

What you need

  • Arduino Uno or compatible
  • USB A-B cable
  • Jumper Connections
  • Arduino IDE Software

Steps

  1. Connect the AD9850 DDS module to the digital pins of the Arduino (check the datasheet for specific pins)
  2. Download and install the DDS library in the Arduino IDE software
  3. Load the example sketch provided with the library onto Arduino
  4. Modify the sketch settings based on your needs (frequency, signal amplitude)
  5. Check the module’s functionality by monitoring the output on the Serial Monitor of the Arduino IDE
  6. If necessary, adjust the signal parameters to optimize project performance

Example code

// Includere la libreria DDS
#include <DDS.h>

// Definire l'oggetto DDS e collegarlo ai PIN dell'Arduino
DDS dds(10, 9);

void setup() {
 Serial.begin(9600);
}

void loop() {
 // Impostare la frequenza del segnale (verifica sul datasheet per il range)
 dds.setFrequency(1000); 
}

Mini project

Create an AM signal generator with AD9850 DDS: modulate an audio signal onto a carrier frequency set by the DDS module

Common mistakes

  • Set the signal frequency outside the allowed range (check the datasheet)
  • Fail to correctly load the example sketch into the Arduino IDE software
  • Omit the installation of the required DDS library for the module to function
  • Fail to verify the physical connection between AD9850 and Arduino

Recommended accessories

  • 16×2 LCD Module
  • Audio Amplifier
  • Reception Antenna
  • Voltage Regulator LM317

Frequently asked questions

What is the minimum and maximum frequency I can generate with the AD9850 DDS?
The frequency varies based on the clock provided (check the datasheet)

How can I control the AD9850 DDS module without using Arduino?
You can use a compatible microcontroller or logic circuit to send commands to the module

Reviews

There are no reviews yet.

Be the first to review “Direct Digital Synthesis AD9850 Signal Generator Module (DDS Module)”

Your email address will not be published. Required fields are marked *