Descripción
📡 Módulo Generador de Señales de Síntesis Directa AD9850 (Módulo DDS) – Descripción Completa y Guía de Uso con Arduino
🔧 Descripción General del Módulo AD9850 DDS
El Módulo AD9850 DDS (Direct Digital Synthesis) es un generador de señales sinusoidales, cuadradas y triangulares a frecuencia variable, ampliamente utilizado en el ámbito hobista, radioaficionado y didáctico para generar señales de prueba y desarrollo.
✅ Características Técnicas Principales:
- Chip principal: Analog Devices AD9850
- Tensión operativa: 5V DC
- Frecuencia de salida: de 0 Hz hasta aproximadamente 40 MHz (sinusoide recomendada hasta 20 MHz para pureza de la señal)
- Resolución en frecuencia: 32-bit tuning word (frecuencia muy precisa)
- Interfaz de control: Serial (paralelo disponible pero menos usado con Arduino)
- Salidas de señal:
- Salida sinusoidal filtrada
- Salida de onda cuadrada (TTL, hasta 5Vpp)
- Conectores: Encabezado de pines estándar 2.54 mm
- Componentes integrados:
- Oscilador cuarzo de 125 MHz
- Filtro pasa bajos para la salida sinusoidal
- Amplificador operacional para control directo
⚙️ Pinout del módulo AD9850
| PIN | Descripción |
|---|---|
| VCC | Alimentación 5V |
| GND | Tierra |
| D7 – D0 | Bus de datos paralelo (no se usa en serie) |
| W_CLK | Reloj de escritura |
| FQ_UD | Actualiza la frecuencia (latch) |
| DATA | Dato en serie |
| RESET | Reset chip |
| SQ_OUT | Salida de onda cuadrada |
| SIN_OUT | Salida de onda sinusoidal filtrada |
🧠 ¿Cómo Funciona el DDS (Síntesis Digital Directa)?
El principio DDS consiste en generar digitalmente una onda sinusoidal mediante un acumulador de fase, una memoria ROM que contiene valores de la sinusoide, y un convertidor DAC. Esto permite una variación precisa y rápida de la frecuencia de salida con una excelente estabilidad.
🔌 Conexión del módulo AD9850 a Arduino
✨ Esquema de Conexión Arduino UNO:
| Arduino | Módulo AD9850 |
|---|---|
| 5V | VCC |
| GND | GND |
| D2 | RESET |
| D3 | DATA |
| D4 | W_CLK |
| D5 | FQ_UD |
🧪 Ejemplo de Código para Arduino
Puedes controlar el módulo AD9850 fácilmente con una biblioteca dedicada o directamente a través del código. Aquí tienes un ejemplo básico sin biblioteca, para generar una señal a 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);
}
📚 Guía Avanzada: ¿Qué Puedes Hacer?
🔄 Cambiar la Frecuencia Dinámicamente
Puedes escribir una función que lea valores de un potenciómetro o serie y actualice la frecuencia en tiempo real.
🎛️ Modulaciones Posibles
- FSK: cambiando rápidamente la frecuencia
- PSK: cambiando la fase
- AM (limitada): con circuitos externos
- Sweep: generación de barrido de frecuencia para pruebas de respuesta en frecuencia
📈 Salida en Osciloscopio
Conecta SIN_OUT directamente a un osciloscopio o a un amplificador. La señal puede ser débil para cargas de alta impedancia.
📦 Bibliotecas Alternativas (opcional)
Para facilitar el uso, puedes usar una biblioteca Arduino como:
DDS_AD9850
Instalable desde GitHub: https://github.com/F4GOJ/AD9850
Ejemplo con biblioteca:
#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
}
🛠️ Consejos de Uso
- Filtra bien la alimentación para evitar ruido
- Evita frecuencias muy altas si quieres un señal sinusoidal “limpio”
- Para generar ondas triangulares se requiere un filtrado adicional (no soportado nativamente)
- Usa
SQ_OUTsi necesitas una señal TTL precisa
🧾 Aplicaciones Típicas
- Generador de prueba para amplificadores
- Generación de señal RF para radioaficionados
- Análisis de respuesta en frecuencia
- Interfaz con mezclador para experimentos SDR
- Generador de señal para instrumentos musicales
¡Perfecto! Te propongo una guía completa para construir un generador de señales AD9850 con Arduino, que integra todas y tres las funciones que has citado:
🎛️ PROYECTO: Generador de Señal DDS AD9850 Multifunción
🔹 Funcionalidades:
- Control de frecuencia mediante codificador rotativo
- Visualización en pantalla OLED
- Control opcional a través de Bluetooth / serial (teléfono móvil o PC)
🧰 Componentes Necesarios:
| Componente | Cantidad | Notas |
|---|---|---|
| Arduino UNO/Nano | 1 | También Mega funciona |
| Módulo AD9850 DDS | 1 | Frecuencia hasta 40 MHz |
| Encoder rotativo con pulsador | 1 | Modelo EC11 |
| Display OLED 128×64 I2C (SSD1306) | 1 | 0.96″ recomendado |
| Módulo Bluetooth HC-05/HC-06 (opcional) | 1 | Para control remoto |
| Botones opcionales | 1-2 | Para reset/sweep |
| Protoboard o PCB | 1 | y jumper |
⚙️ Esquema de Conexiones
✳️ Conexión AD9850
| AD9850 | Arduino |
|---|---|
| VCC | 5V |
| GND | GND |
| W_CLK | D4 |
| FQ_UD | D5 |
| DATA | D3 |
| RESET | D2 |
| SIN_OUT | Osciloscopio, amplificador, etc. |
🔄 Codificador Rotativo
| Codificador | Arduino |
|---|---|
| CLK | D6 |
| DT | D7 |
| SW (botón) | D8 |
📺 Display OLED (SSD1306 I2C)
| OLED | Arduino |
|---|---|
| VCC | 3.3V o 5V |
| GND | GND |
| SDA | A4 |
| SCL | A5 |
📡 Módulo HC-05 Bluetooth (opcional)
| HC-05 | Arduino |
|---|---|
| VCC | 5V |
| GND | GND |
| TX | RX (D0) |
| RX | TX (D1, con divisor de tensión!) |
🧪 Código Arduino (Funciones básicas integradas)
📦 Bibliotecas requeridas:
U8g2libpara OLEDRotaryEncodero control manualSoftwareSerialpara Bluetooth (si se usa)
Instala desde Library Manager:
U8g2 by olikraus
✅ Código simplificado:
#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 por Bluetooth / Serial Monitor
Agrega esta función para recibir un comando serial del tipo: F2000000 → cambia la frecuencia a 2 MHz
Agregado a 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();
}
}
}
🔄 Sweep Automático (opcional)
Agrega función para barrido entre dos frecuencias:
void sweep(unsigned long fStart, unsigned long fStop, int delayMs) {
for (unsigned long f = fStart; f <= fStop; f += step) {
setFrequency(f);
displayFreq();
delay(delayMs);
}
}
🧾 Expansiones Posibles
- Agrega un menú OLED para elegir forma de onda (cuadrada/sinusoidal)
- Guarda últimas frecuencias en EEPROM
- Puerto USB-C con aislamiento para instrumentos de banco
- App Android Bluetooth para controlar la frecuencia
✅ Conclusión
Tienes ahora una plataforma DDS completamente controlable:
- Manualmente con encoder
- Gráficamente a través de display
- Remotamente a través de smartphone o PC
|
GENERALIDADES |
MODELO |
AD9850 Module DDS Signal Generator |
|
MATERIALES |
pcb + componentes |
|
|
COMPATIBILIDAD |
ARDUINO |
|
|
COMPONENTES ELÉCTRICOS |
VOLTAJE DE ENTRADA |
3,3 – 5 V |
|
PESO Y DIMENSIONES |
PESO DEL PRODUCTO |
15g |
|
PESO DEL PAQUETE |
0.55 kg |
|
|
DIMENSIONES DEL PRODUCTO (L x W x H) |
4.6 x 2.5 x 2 |
|
|
DIMENSIONES DEL PAQUETE (L x W x H) |
10 x 5 x 5 cm |
|
|
CONTENIDO DE LA CÁRTEL |
CONTENIDO DE LA CÁRTEL |
1 x Módulo |
Tenemos disponibles datasheet de todos los componentes, en caso de que no esté presente en la tarjeta de descarga del producto, envíanos un mensaje a través del formulario de contacto y lo publicaremos lo antes posible en nuestro sitio web.
Tutorial: Cómo usar Generador de Señales AD9850 DDS
El módulo AD9850 DDS es un generador de señales de síntesis directa ideal para makers que desean crear y modificar señales sinusoidales con precisión. Este componente es particularmente útil para proyectos de comunicación radio, pruebas y mediciones.
Qué necesitas
- Arduino Uno o compatible
- Cable USB tipo A-B
- Conexiones Jumpers
- Software Arduino IDE
Pasos
- Conectar el módulo AD9850 DDS a los pines digitales del Arduino (verifica en el datasheet para los PIN específicos)
- Descargar e instalar la biblioteca DDS en el software Arduino IDE
- Cargar el sketch de ejemplo proporcionado con la biblioteca en Arduino
- Modificar las configuraciones del sketch según tus necesidades (frecuencia, amplitud de la señal)
- Verifica el funcionamiento del módulo monitoreando la salida en el Serial Monitor del Arduino IDE
- Si es necesario, ajustar los parámetros de la señal para optimizar el rendimiento del proyecto
Código de ejemplo
// 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);
}
Miniproyecto
Crea un generador de señales AM con AD9850 DDS: modula una señal de audio en una frecuencia portadora establecida por el módulo DDS
Errores comunes
- Configurar la frecuencia de la señal fuera del rango permitido (verifica en el datasheet)
- No cargar correctamente el sketch de ejemplo en el software Arduino IDE
- Omitir la instalación de la biblioteca DDS necesaria para el funcionamiento del módulo
- No verificar la conexión física entre AD9850 y Arduino
Accesorios recomendados
- Módulo LCD 16×2
- Amplificador de audio
- Antena de recepción
- Regulador de tensión LM317
Preguntas frecuentes
¿Cuál es la frecuencia mínima y máxima que puedo generar con AD9850 DDS?
La frecuencia varía en función del reloj proporcionado (consulta el datasheet)
¿Cómo puedo controlar el módulo AD9850 DDS sin usar Arduino?
Puedes utilizar un microcontrolador compatible o un circuito lógico para enviar comandos al módulo














Valoraciones
No hay valoraciones aún.