Description
📡 Module Générateur de Signaux par Synthèse Numérique Directe AD9850 (Module DDS) – Description Complète et Guide d’Utilisation avec Arduino
🔧 Description Générale du Module AD9850 DDS
Le Module AD9850 DDS (Direct Digital Synthesis) est un générateur de signaux sinusoïdaux, carrés et triangulaires à fréquence variable, largement utilisé dans le domaine du hobby, de l’amateur radio et de l’éducation pour générer des signaux de test et de développement.
✅ Caractéristiques Techniques Principales:
- Puce principale: Analog Devices AD9850
- Tension d’alimentation: 5V DC
- Fréquence de sortie: de 0 Hz jusqu’à environ 40 MHz (sinusoïde recommandée jusqu’à 20 MHz pour la pureté du signal)
- Résolution en fréquence: 32-bit tuning word (fréquence très précise)
- Interface de contrôle : Série (parallèle disponible mais moins utilisée avec Arduino)
- Sorties de signal :
- Sortie sinusoïdale filtrée
- Sortie d’onde carrée (TTL, jusqu’à 5Vpp)
- Connecteurs : Connecteur pin standard 2,54 mm
- Composants intégrés :
- Oscillateur quartz à 125 MHz
- Filtre passe-bas pour la sortie sinusoïdale
- Amplificateur opérationnel pour pilotage direct
⚙️ Pinout du Module AD9850
| PIN | Description |
|---|---|
| VCC | Alimentation 5V |
| GND | Mass |
| D7 – D0 | Bus de données parallèle (non utilisé en série) |
| W_CLK | Clock d’écriture |
| FQ_UD | Mise à jour de la fréquence (latch) |
| DATA | Donnée sérielle |
| RESET | Réinitialisation du chip |
| SQ_OUT | Sortie d’onde carrée |
| SIN_OUT | Sortie d’onde sinusoïdale filtrée |
🧠 Comment fonctionne le DDS (Direct Digital Synthesis) ?
Le principe DDS consiste à générer numériquement une onde sinusoïdale à l’aide d’un accumulateur de phase, d’une mémoire ROM contenant des valeurs de sinusoïde, et d’un convertisseur DAC. Cela permet une variation précise et rapide de la fréquence de sortie avec une excellente stabilité.
🔌 Connexion du module AD9850 à Arduino
✨ Schéma de connexion Arduino UNO:
| Arduino | Module AD9850 |
|---|---|
| 5V | VCC |
| GND | GND |
| D2 | RESET |
| D3 | DATA |
| D4 | W_CLK |
| D5 | FQ_UD |
🧪 Exemple de Code pour Arduino
Vous pouvez contrôler facilement le module AD9850 avec une bibliothèque dédiée ou directement via le code. Voici un exemple de base sans bibliothèque, pour générer un signal à 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);
}
📚 Guide Avancé : Ce Que Vous Pouvez Faire
🔄 Changer la Fréquence Dynamiquement
Vous pouvez écrire une fonction qui lit des valeurs d’un potentiomètre ou en série et met à jour la fréquence en temps réel.
🎛️ Modulations Possibles
- FSK : en changeant rapidement la fréquence
- PSK : en changeant la phase
- AM (limitée) : avec circuit externe
- Sweep : génération de balayage de fréquence pour les tests de réponse en fréquence
📈 Sortie sur Oscilloscope
Connecter SIN_OUT directement à un oscilloscope ou à un amplificateur. Le signal peut être faible pour des charges à haute impédance.
📦 Bibliothèques alternatives (optionnelles)
Pour faciliter l’utilisation, vous pouvez utiliser une bibliothèque Arduino comme :
DDS_AD9850
Installable depuis GitHub : https://github.com/F4GOJ/AD9850
Exemple avec bibliothèque :
#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
}
🛠️ Conseils d’utilisation
- Filtrez bien l’alimentation pour éviter le bruit
- Évitez les fréquences trop élevées si vous voulez un signal sinusoïdal « propre »
- Pour générer des ondes triangulaires, un filtrage supplémentaire est nécessaire (non pris en charge nativement)
- Utilisez
SQ_OUTsi vous avez besoin d’un signal TTL précis
🧾 Applications typiques
- Générateur de test pour amplificateurs
- Génération de signaux RF pour les amateurs radio
- Analyse de réponse en fréquence
- Interface avec mélangeur pour expériences SDR
- Générateur de signaux pour instruments musicaux
Parfait ! Je vous propose une guide complète pour construire un générateur de signaux AD9850 avec Arduino, intégrant toutes les trois fonctions que vous avez citées :
🎛️ PROJET : Générateur de Signal DDS AD9850 Multifonction
🔹 Fonctionnalités :
- Contrôle de fréquence par encodeur rotatif
- Affichage sur écran OLED
- Contrôle optionnel par Bluetooth / série (smartphone ou PC)
🧰 Composants Nécessaires :
| Composant | Quantité | Notes |
|---|---|---|
| Arduino UNO/Nano | 1 | Le Mega fonctionne aussi |
| Module AD9850 DDS | 1 | Fréquence jusqu’à 40 MHz |
| Encoder rotatif avec bouton | 1 | Modèle EC11 |
| Afficheur OLED 128×64 I2C (SSD1306) | 1 | 0,96″ recommandé |
| Module Bluetooth HC-05/HC-06 (optionnel) | 1 | Pour contrôle à distance |
| Boutons optionnels | 1-2 | Pour réinitialisation/épuration |
| Plaque d’essai ou PCB | 1 | et câblage |
⚙️ Schéma de Connexion
✳️ Connexion AD9850
| AD9850 | Arduino |
|---|---|
| VCC | 5V |
| GND | GND |
| W_CLK | D4 |
| FQ_UD | D5 |
| DATA | D3 |
| RESET | D2 |
| SIN_OUT | Oscilloscope, amplificateur etc |
🔄 Encodeur Rotatif
| Encodeur | Arduino |
|---|---|
| CLK | D6 |
| DT | D7 |
| SW (bouton) | D8 |
📺 Afficheur OLED (SSD1306 I2C)
| OLED | Arduino |
|---|---|
| VCC | 3.3V o 5V |
| GND | GND |
| SDA | A4 |
| SCL | A5 |
📡 Module Bluetooth HC-05 (optionnel)
| HC-05 | Arduino |
|---|---|
| VCC | 5V |
| GND | GND |
| TX | RX (D0) |
| RX | TX (D1, avec diviseur!) |
🧪 Code Arduino (Fonctions de base intégrées)
📦 Bibliothèques requises:
U8g2libpour OLEDRotaryEncodergestion manuelleSoftwareSerialpar Bluetooth (si utilisé)
Installez depuis le gestionnaire de bibliothèques :
U8g2 by olikraus
✅ Code simplifié :
#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();
}
📡 Contrôle par Bluetooth / Serial Monitor
Ajoutez cette fonction pour recevoir un commande série du type : F2000000 → change la fréquence à 2 MHz
Ajout à 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();
}
}
}
🔄 Balayage Automatique (optionnel)
Ajoutez une fonction pour balayer entre deux fréquences :
void sweep(unsigned long fStart, unsigned long fStop, int delayMs) {
for (unsigned long f = fStart; f <= fStop; f += step) {
setFrequency(f);
displayFreq();
delay(delayMs);
}
}
🧾 Extensions Possibles
- Ajoutez un menu OLED pour choisir forme d’onde (carrée/sinusoidale)
- Sauvegardez les dernières fréquences dans l’EEPROM
- Port USB-C avec isolation pour banc d’instruments
- Application Android Bluetooth pour contrôler la fréquence
✅ Conclusion
Vous avez maintenant une plateforme DDS entièrement contrôlable:
- Manuellement avec encodeur
- Graphiquement via afficheur
- Rémotement via smartphone ou PC
|
GÉNÉRAUX |
MODÈLE |
Module AD9850 DDS Générateur de Signal |
|
MATÉRIAUX |
pcb + composants |
|
|
COMPATIBILITÉ |
ARDUINO |
|
|
COMPOSANTS ÉLECTRIQUES |
TENSION D’ENTRÉE |
3,3 – 5 V |
|
POIDS ET DIMENSIONS |
POIDS DU PRODUIT |
15g |
|
POIDS DU COLIS |
0.55 kg |
|
|
DIMENSIONS DU PRODUIT (L x W x H) |
4.6 x 2.5 x 2 |
|
|
DIMENSIONS DU COLIS (L x W x H) |
10 x 5 x 5 cm |
|
|
CONTENU DU PAQUET |
CONTENU DU PAQUET |
1 x Module |
Nous avons les fiches techniques de tous les composants, si elles ne sont pas présentes dans le téléchargement du produit, envoyez-nous un message via le formulaire de contact et nous les publierons sur notre site dès que possible.
Tutoriel : Comment utiliser le générateur de signaux AD9850 DDS
Le module AD9850 DDS est un générateur de signaux à synthèse directe idéal pour les makers qui souhaitent créer et modifier des signaux sinusoïdaux avec précision. Ce composant est particulièrement utile pour les projets de communication radio, de test et de mesure.
Ce qu’il faut
- Arduino Uno ou compatible
- Câble USB type A-B
- Connexions cavalier
- Logiciel Arduino IDE
Étapes
- Connecter le module AD9850 DDS aux broches digitales de l’Arduino (vérifier le datasheet pour les broches spécifiques)
- Télécharger et installer la bibliothèque DDS dans le logiciel Arduino IDE
- Charger l’exemple de sketch fourni avec la bibliothèque sur l’Arduino
- Modifier les paramètres du sketch en fonction de vos besoins (fréquence, amplitude du signal)
- Vérifier le fonctionnement du module en surveillant la sortie dans le Serial Monitor de l’Arduino IDE
- Si nécessaire, ajuster les paramètres du signal pour optimiser les performances du projet
Exemple de 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-projet
Créer un générateur de signal AM avec AD9850 DDS : moduler un signal audio sur une fréquence portante établie par le module DDS
Erreurs courantes
- Définir la fréquence du signal en dehors de la plage autorisée (vérifier le datasheet)
- Ne pas charger correctement l’exemple de sketch dans le logiciel Arduino IDE
- Omettre l’installation de la bibliothèque DDS nécessaire au fonctionnement du module
- Ne pas vérifier la connexion physique entre AD9850 et Arduino
Accessoires conseillés
- Module LCD 16×2
- Amplificateur audio
- Antenne de réception
- Régulateur de tension LM317
Questions fréquentes
Quelle est la fréquence minimale et maximale que je peux générer avec AD9850 DDS?
La fréquence varie en fonction du clock fourni (vérifiez le datasheet)
Comment puis-je contrôler le module AD9850 DDS sans utiliser Arduino?
Vous pouvez utiliser un microcontrôleur compatible ou un circuit logique pour envoyer des commandes au module














Avis
Il n’y a pas encore d’avis.