Проблема с DDS AD9850

Darth_Vader
Offline
Зарегистрирован: 12.10.2013

Добрый день!

Проблема с DDS на AD9850 (синяя плата HC-RS08, только что приехала с Китая).

Не могу добиться работы DDS. На выходе ZOUT1 (да и на других) ничего нет. Проверял включением осциллографа между ZOUT1 и GND.

Брак в плате, в руках или программе?

01#include <LiquidCrystal.h>
02 
03#define DDS_CLOCK 125000000
04#define CLOCK 3  //pin connections for DDS
05#define LOAD  2
06#define DATA  1
07#define RESET 0
08 
09LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
10 
11void AD9850_init()
12{
13  digitalWrite(RESET, LOW);
14  digitalWrite(CLOCK, LOW);
15  digitalWrite(LOAD, LOW);
16  digitalWrite(DATA, LOW);
17}
18 
19 
20 
21void AD9850_reset()
22{
23  //reset sequence is:
24  // CLOCK & LOAD = LOW
25  //  Pulse RESET high for a few uS (use 5 uS here)
26  //  Pulse CLOCK high for a few uS (use 5 uS here)
27  //  Set DATA to ZERO and pulse LOAD for a few uS (use 5 uS here)
28   
29  // data sheet diagrams show only RESET and CLOCK being used to reset the device, but I see no output unless I also
30  // toggle the LOAD line here.
31   
32  digitalWrite(CLOCK, LOW);
33  digitalWrite(LOAD, LOW);
34     
35  digitalWrite(RESET, LOW);
36  delay(5);
37  digitalWrite(RESET, HIGH);  //pulse RESET
38  delay(5);
39  digitalWrite(RESET, LOW);
40  delay(5);
41      
42  digitalWrite(CLOCK, LOW);
43  delay(5);
44  digitalWrite(CLOCK, HIGH);  //pulse CLOCK
45  delay(5);
46  digitalWrite(CLOCK, LOW);
47  delay(5);
48  digitalWrite(DATA, LOW);    //make sure DATA pin is LOW
49      
50  digitalWrite(LOAD, LOW);
51  delay(5);
52  digitalWrite(LOAD, HIGH);  //pulse LOAD
53  delay(5);
54  digitalWrite(LOAD, LOW);
55  // Chip is RESET now
56}
57 
58void SetFrequency(unsigned long frequency)
59{
60  unsigned long tuning_word = (frequency * 4294967296LL) / DDS_CLOCK;
61  digitalWrite (LOAD, LOW);
62 
63  shiftOut(DATA, CLOCK, LSBFIRST, tuning_word);
64  shiftOut(DATA, CLOCK, LSBFIRST, tuning_word >> 8);
65  shiftOut(DATA, CLOCK, LSBFIRST, tuning_word >> 16);
66  shiftOut(DATA, CLOCK, LSBFIRST, tuning_word >> 24);
67  shiftOut(DATA, CLOCK, LSBFIRST, 0x0);
68   
69  digitalWrite (LOAD, HIGH);
70}
71 
72 
73void setup()
74{
75  lcd.begin(16, 2);              // start the library
76  lcd.setCursor(1,0);
77  lcd.print("**DDS AD9850**");
78}
79 
80void loop()
81{
82  AD9850_init;
83  AD9850_reset;
84  SetFrequency(1000);
85  lcd.setCursor(0,1);
86  lcd.print("Freq=1kHz");
87  while(1);
88}

 

Darth_Vader
Offline
Зарегистрирован: 12.10.2013
Поправил setup() и loop(), но ничего не изменилось
01void setup()
02{
03  pinMode(RESET, OUTPUT);
04  pinMode(DATA, OUTPUT);
05  pinMode(CLOCK, OUTPUT);
06  pinMode(LOAD, OUTPUT);
07  lcd.begin(16, 2);              // start the library
08  lcd.setCursor(1,0);
09  lcd.print("**DDS AD9850**");
10  AD9850_init;
11  AD9850_reset;
12}
13 
14void loop()
15{
16  delay(500);
17  SetFrequency(10000);
18  while(1);
19}

 

 

Darth_Vader
Offline
Зарегистрирован: 12.10.2013

Разобрался. Тему можно закрыть.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

А поделиться информацией? Возможно кому то это тоже может помочь.

std
Offline
Зарегистрирован: 05.01.2012

kisoft +1, мне любопытно. Хочу на нём собрать гетеродинный приёмник для пассивного считавания EM4100 RFId меток.

Darth_Vader
Offline
Зарегистрирован: 12.10.2013

Ошибка в том, что я снимал сигнал с выхода QOUT1, а не ZOUT1

QOUT1 всегда 0, QOUT2 всегда 1. Потенциометр не крутил. По идее это выходы не для синуса, а для меандра.

У этой платы обнаружил особенность - чем выше частота (заметнее на частотах > 5Мгц), тем меньше амплитуда сигнала.

Причем, Vmax сигнала остаётся в районе 1В (1.04в, если быть точным), а Vmin с увеличением частоты тоже увеличивается.

Вечером накидаю график зависимости, может будет кому-то полезным.

 

Darth_Vader
Offline
Зарегистрирован: 12.10.2013

Записал видео, как меняется амплитуда сигнала в зависимости от генерируемой частоты.

На видео видна форма сигнала, максимальное и минимальное напряжение.

Диапазон частот - 20КГц÷20Мгц с шагом 20КГц

Трафик! 2 мин - 130 Мбайт.

https://dl.dropboxusercontent.com/u/72215607/VID_20131113_191651.3gp

01#include <LiquidCrystal.h>
02 
03#include <EF_AD9850.h>
04 
05EF_AD9850 AD9850(3,2,0,1);
06 
07LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
08 
09unsigned long freq = 10000, delta = 20000;
10 
11void setup() {
12  AD9850.init();
13  AD9850.reset();
14  lcd.begin(16, 2);
15 
16}
17 
18void loop() {
19  lcd.home();
20  delay(10000);
21  lcd.print("** DDS AD9850**");
22  for(freq=delta; freq<=20000000; freq+=delta){
23    AD9850.wr_serial(0,freq);
24    lcd.setCursor(0,1);
25    lcd.print("Freq=");
26    lcd.print(freq);
27    lcd.print("Hz   ");
28    delay(100);
29  }
30 
31}

 

Darth_Vader
Offline
Зарегистрирован: 12.10.2013

Кому будет интересно, составил график зависимости амплитуды от генерируемой частоты

http://s019.radikal.ru/i637/1311/bc/d4b0a5262872.png

iwe
Offline
Зарегистрирован: 22.10.2014

А можно фото проекта?

wowscheg
Offline
Зарегистрирован: 14.02.2012

Здравствуйте!

Делаю синтезатор на ардуино и платке с AD9850. Нашел код запустил работает, теперь мне нужно изменить код для введения одной функции. А именно, сейчас синтезатор выдает частоту от 1мгц до 30 мгц а нужно разбить на небольшие отрезки, переключаемые кнопкой, подключенной ну например к выводу A1

Например разбить на 9 кусочков

1. от 1мгц до 2мгц

2. от 2мгц до 3мгц

.....

9 от 9мгц до 10 мгц

И что бы диапазоны переключались цикличиски. Вот что имею. Помогите с кодом пожалуйста

 

Скай
Offline
Зарегистрирован: 05.02.2015

Кто-нибудь вообще в курсе, как правильно подключить и закодить зелёную плату с AD 9850?
Я гуглил, нашёл три скетча, ни один из них ни хрена не работает. 
Что надо: скетч, в котором задал частоту и осциллок, подключённый к выводу SinA показывает синусоиду указанной частоты. 

Помогите, пожалуйста, может, кто-то уже кодил сей генератор?

Mining
Offline
Зарегистрирован: 31.01.2016

Может кому пригодится.
DDS генератор синусоидальных и прямоугольных сигналов в диапазононе частот 0 - 40МГц на базе
Arduino Uno + AD9850 DDS

Для сборки надо:
Arduino Uno R3
шилд DFRobot LCD Keypad Shield
модуль HC-RS08 AD9850 DDS
8 проводов для соединения модулей

Сборка:
1.Подключаем к компьютеру плату Arduino Uno и загружаем в нее Sketch:

2.Получаем сообщение "Done uploading." = значит все сделано правильно и приступаем к соединению модулей.

На ножки Arduino Uno втыкаем в DFRobot LCD Keypad Shield.
Затем HC-RS08 AD9850 DDS подключить с помощью проводников по следующей схеме:
Выводы Arduino Uno соединяем с штырьками HC-RS08 AD9850 DDS
+5V → VCC
GND → GND
A1   → W_CLK
A2   → FU_UD
A3   → DATA
A4   → RESET

Выходной сигнал снимаем с pin модуля HC-RS08 AD9850 DDS:
QOUT1, QOUT2 =прямоугольный сигнал
ZOUT1 и ZOUT2 =синусоидальный

2. Подаем питание. Через несколько секунд появляется значение частоты по умолчанию- 10 кГц. Его можно изменить нажатиями кнопок вверх/вниз и вправо/влево.

Все пользуем.

ivenir
Offline
Зарегистрирован: 16.05.2016

Добрый вечер всем. Может кому пригодится. Частота задается через COM порт. 

01float freq = 0;
02long com=0;// Оглашение переменных -- Частота
03#define W_CLK 15 // Пин A1 Arduino - подключен к CLK
04#define FQ_UD 16 // Пин A2 Arduino - подключен к FQ (FU)
05#define DATA 17  // Пин A3 Arduino - подключен к DATA
06#define RESET 18 // Пин A4 Arduino - подключен к RST
07#define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); }
08//-------------------------------------------------------
09void tfr_byte(byte data){ // Функция побитной отправки байта
10 for (int i=0; i<8; i++, data>>=1) { // данных в модуль генератора
11  digitalWrite(DATA, data & 0x01);
12  pulseHigh(W_CLK);}} // Подача импульса на CLK после каждого бита
13//-------------------------------------------------------
14void sendFrequency(double frequency) { // Преобразование и отправка
15  int32_t freq = frequency * 4294967295/125000000;  // значения частоты
16  for (int b=0; b<4; b++, freq>>=8) {tfr_byte(freq & 0xFF);}
17  tfr_byte(0x000);   // Отправка завершательного контрольного байта
18  pulseHigh(FQ_UD);}  // Обновление частоты генератора
19//----------------------------------------------------
20void setup()
21{
22 Serial.begin(9600);
23 pinMode(FQ_UD, OUTPUT);
24 pinMode(W_CLK, OUTPUT);
25 pinMode(DATA, OUTPUT);
26 pinMode(RESET, OUTPUT);
27}
28//---------------------------------------------------- 
29void loop()
30{
31 if (Serial.available()>0) {  //если данные пришли
32 com=Serial.parseInt();
33  freq=com;
34 if (freq<0) freq=0; // Ограничение значений частоты
35 if (freq>40000000) freq=40000000;
36 pulseHigh(RESET); // Отправка импульсов для запуска модуля генератора
37 pulseHigh(W_CLK);
38 pulseHigh(FQ_UD);
39 sendFrequency(freq);   // Вызов функции отправки частоты
40Serial.println(freq);
41 }
42}

 

anteynew
Offline
Зарегистрирован: 06.06.2016

Для получения квадратных импульсов с выводов QOUT1 и 2 плату нужно настроить !!! На плате есть переменный резистор R13 (большая синяя фигня на плате с пазами под крестовую отвертку). Подключаем плату к Ардуино, выставляем любую частоту, подключаем QOUT1 и GRN к осцилографу и крутим резистор до появления сигнала. Пришло из Китая 10 плат, ни одна не настоена ! С начала думал брак...

kostya261
Offline
Зарегистрирован: 12.05.2016

anteynew пишет:

Для получения квадратных импульсов с выводов QOUT1 и 2 плату нужно настроить !!! На плате есть переменный резистор R13 (большая синяя фигня на плате с пазами под крестовую отвертку). Подключаем плату к Ардуино, выставляем любую частоту, подключаем QOUT1 и GRN к осцилографу и крутим резистор до появления сигнала. Пришло из Китая 10 плат, ни одна не настоена ! С начала думал брак...

 

Фиг его знает, я его уже во все стороны как только не крутил... меандра так и не добился.

Синус нормальный.

777Andrej
Offline
Зарегистрирован: 09.04.2014

Может кто помочь ?
встроил в код генератора вольтметр. 
делаю измерения пока постоянного напряжения по входа А1 от 0-5в 
почему то показания вольтметра скачат, при том. если я выбираю диапазон от 0-100кгц они пляшут , если от 100кгц до 10мгц они стоят ровно.
такое ощущение что работу ацп кто то сбивает, и оно не успевает считать. 
как победить эту проблему не могу.