Проблема с DDS AD9850
- Войдите на сайт для отправки комментариев
Пнд, 11/11/2013 - 06:34
Добрый день!
Проблема с DDS на AD9850 (синяя плата HC-RS08, только что приехала с Китая).
Не могу добиться работы DDS. На выходе ZOUT1 (да и на других) ничего нет. Проверял включением осциллографа между ZOUT1 и GND.
Брак в плате, в руках или программе?
#include <LiquidCrystal.h>
#define DDS_CLOCK 125000000
#define CLOCK 3 //pin connections for DDS
#define LOAD 2
#define DATA 1
#define RESET 0
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void AD9850_init()
{
digitalWrite(RESET, LOW);
digitalWrite(CLOCK, LOW);
digitalWrite(LOAD, LOW);
digitalWrite(DATA, LOW);
}
void AD9850_reset()
{
//reset sequence is:
// CLOCK & LOAD = LOW
// Pulse RESET high for a few uS (use 5 uS here)
// Pulse CLOCK high for a few uS (use 5 uS here)
// Set DATA to ZERO and pulse LOAD for a few uS (use 5 uS here)
// data sheet diagrams show only RESET and CLOCK being used to reset the device, but I see no output unless I also
// toggle the LOAD line here.
digitalWrite(CLOCK, LOW);
digitalWrite(LOAD, LOW);
digitalWrite(RESET, LOW);
delay(5);
digitalWrite(RESET, HIGH); //pulse RESET
delay(5);
digitalWrite(RESET, LOW);
delay(5);
digitalWrite(CLOCK, LOW);
delay(5);
digitalWrite(CLOCK, HIGH); //pulse CLOCK
delay(5);
digitalWrite(CLOCK, LOW);
delay(5);
digitalWrite(DATA, LOW); //make sure DATA pin is LOW
digitalWrite(LOAD, LOW);
delay(5);
digitalWrite(LOAD, HIGH); //pulse LOAD
delay(5);
digitalWrite(LOAD, LOW);
// Chip is RESET now
}
void SetFrequency(unsigned long frequency)
{
unsigned long tuning_word = (frequency * 4294967296LL) / DDS_CLOCK;
digitalWrite (LOAD, LOW);
shiftOut(DATA, CLOCK, LSBFIRST, tuning_word);
shiftOut(DATA, CLOCK, LSBFIRST, tuning_word >> 8);
shiftOut(DATA, CLOCK, LSBFIRST, tuning_word >> 16);
shiftOut(DATA, CLOCK, LSBFIRST, tuning_word >> 24);
shiftOut(DATA, CLOCK, LSBFIRST, 0x0);
digitalWrite (LOAD, HIGH);
}
void setup()
{
lcd.begin(16, 2); // start the library
lcd.setCursor(1,0);
lcd.print("**DDS AD9850**");
}
void loop()
{
AD9850_init;
AD9850_reset;
SetFrequency(1000);
lcd.setCursor(0,1);
lcd.print("Freq=1kHz");
while(1);
}
void setup() { pinMode(RESET, OUTPUT); pinMode(DATA, OUTPUT); pinMode(CLOCK, OUTPUT); pinMode(LOAD, OUTPUT); lcd.begin(16, 2); // start the library lcd.setCursor(1,0); lcd.print("**DDS AD9850**"); AD9850_init; AD9850_reset; } void loop() { delay(500); SetFrequency(10000); while(1); }Разобрался. Тему можно закрыть.
А поделиться информацией? Возможно кому то это тоже может помочь.
kisoft +1, мне любопытно. Хочу на нём собрать гетеродинный приёмник для пассивного считавания EM4100 RFId меток.
Ошибка в том, что я снимал сигнал с выхода QOUT1, а не ZOUT1
QOUT1 всегда 0, QOUT2 всегда 1. Потенциометр не крутил. По идее это выходы не для синуса, а для меандра.
У этой платы обнаружил особенность - чем выше частота (заметнее на частотах > 5Мгц), тем меньше амплитуда сигнала.
Причем, Vmax сигнала остаётся в районе 1В (1.04в, если быть точным), а Vmin с увеличением частоты тоже увеличивается.
Вечером накидаю график зависимости, может будет кому-то полезным.
Записал видео, как меняется амплитуда сигнала в зависимости от генерируемой частоты.
На видео видна форма сигнала, максимальное и минимальное напряжение.
Диапазон частот - 20КГц÷20Мгц с шагом 20КГц
Трафик! 2 мин - 130 Мбайт.
https://dl.dropboxusercontent.com/u/72215607/VID_20131113_191651.3gp
#include <LiquidCrystal.h> #include <EF_AD9850.h> EF_AD9850 AD9850(3,2,0,1); LiquidCrystal lcd(8, 9, 4, 5, 6, 7); unsigned long freq = 10000, delta = 20000; void setup() { AD9850.init(); AD9850.reset(); lcd.begin(16, 2); } void loop() { lcd.home(); delay(10000); lcd.print("** DDS AD9850**"); for(freq=delta; freq<=20000000; freq+=delta){ AD9850.wr_serial(0,freq); lcd.setCursor(0,1); lcd.print("Freq="); lcd.print(freq); lcd.print("Hz "); delay(100); } }Кому будет интересно, составил график зависимости амплитуды от генерируемой частоты
http://s019.radikal.ru/i637/1311/bc/d4b0a5262872.png
А можно фото проекта?
Здравствуйте!
Делаю синтезатор на ардуино и платке с AD9850. Нашел код запустил работает, теперь мне нужно изменить код для введения одной функции. А именно, сейчас синтезатор выдает частоту от 1мгц до 30 мгц а нужно разбить на небольшие отрезки, переключаемые кнопкой, подключенной ну например к выводу A1
Например разбить на 9 кусочков
1. от 1мгц до 2мгц
2. от 2мгц до 3мгц
.....
9 от 9мгц до 10 мгц
И что бы диапазоны переключались цикличиски. Вот что имею. Помогите с кодом пожалуйста
Кто-нибудь вообще в курсе, как правильно подключить и закодить зелёную плату с AD 9850?
Я гуглил, нашёл три скетча, ни один из них ни хрена не работает.
Что надо: скетч, в котором задал частоту и осциллок, подключённый к выводу SinA показывает синусоиду указанной частоты.
Помогите, пожалуйста, может, кто-то уже кодил сей генератор?
Может кому пригодится.
DDS генератор синусоидальных и прямоугольных сигналов в диапазононе частот 0 - 40МГц на базе
Arduino Uno + AD9850 DDS
Для сборки надо:
Arduino Uno R3
шилд DFRobot LCD Keypad Shield
модуль HC-RS08 AD9850 DDS
8 проводов для соединения модулей
Сборка:
1.Подключаем к компьютеру плату Arduino Uno и загружаем в нее Sketch:
#include <LiquidCrystal.h> // Подключение библиотек LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Инициализация LCD с указанием пинов float freq = 10000; // Оглашение переменных -- Частота float bigStep = 1000; // Шаг изменения частоты при нажатии вверх/вниз float littleStep = 10; // Шаг изменения частоты при нажатии вправо/влево int lcd_key = 0; int adc_key_in = 0; #define btnRIGHT 0 // Создание директив для кнопок #define btnUP 1 #define btnDOWN 2 #define btnLEFT 3 #define btnSELECT 4 #define btnNONE 5 #define W_CLK 15 // Пин A1 Arduino - подключен к CLK #define FQ_UD 16 // Пин A2 Arduino - подключен к FQ (FU) #define DATA 17 // Пин A3 Arduino - подключен к DATA #define RESET 18 // Пин A4 Arduino - подключен к RST #define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); } //------------------------------------------------------ int read_LCD_buttons(){ // Функция считывания нажатия кнопок adc_key_in = analogRead(0); if (adc_key_in > 1000) return btnNONE; if (adc_key_in < 50) return btnRIGHT; if (adc_key_in < 150) return btnUP; if (adc_key_in < 315) return btnDOWN; if (adc_key_in < 600) return btnLEFT; if (adc_key_in < 850) return btnSELECT; return btnNONE;} //------------------------------------------------------- void tfr_byte(byte data){ // Функция побитной отправки байта for (int i=0; i<8; i++, data>>=1) { // данных в модуль генератора digitalWrite(DATA, data & 0x01); pulseHigh(W_CLK);}} // Подача импульса на CLK после каждого бита //------------------------------------------------------- void sendFrequency(double frequency) { // Преобразование и отправка int32_t freq = frequency * 4294967295/125000000; // значения частоты for (int b=0; b<4; b++, freq>>=8) {tfr_byte(freq & 0xFF);} tfr_byte(0x000); // Отправка завершательного контрольного байта pulseHigh(FQ_UD);} // Обновление частоты генератора //---------------------------------------------------- void setup() { lcd.begin(16, 2); // Старт библиотеки. Указанием количества символов и строк pinMode(FQ_UD, OUTPUT); pinMode(W_CLK, OUTPUT); pinMode(DATA, OUTPUT); pinMode(RESET, OUTPUT); pulseHigh(RESET); // Отправка импульсов для запуска модуля генератора pulseHigh(W_CLK); pulseHigh(FQ_UD); } //---------------------------------------------------- void loop() { lcd.setCursor(0,0); // Далее вывод текущего значения частоты lcd.print("Freq: "); lcd.setCursor(6,0); lcd.print(" "); lcd.setCursor(6,0); if (freq<1000){lcd.print(freq); lcd.print("Hz");} if ((freq>=1000)&&(freq<1000000)){lcd.print(freq / 1000); lcd.print("kHz");} if ((freq>=1000000)&&(freq<50000000)){lcd.print(freq / 1000000); lcd.print("MHz");} lcd.setCursor(0,1); lcd.print(" Genie v1.0"); if (freq<100){bigStep = 10; // Определение шага грубой и точной littleStep = 1;} // настройки в зависимости от частоты if ((freq>=100)&&(freq<1000)){bigStep = 100; littleStep = 1;} if ((freq>=1000)&&(freq<10000)){bigStep = 1000; littleStep = 10;} if ((freq>=10000)&&(freq<100000)){bigStep = 10000; littleStep = 100;} if ((freq>=100000)&&(freq<1000000)){bigStep = 100000; littleStep = 1000;} if ((freq>=1000000)&&(freq<10000000)){bigStep = 1000000; littleStep = 10000;} if ((freq>=10000000)&&(freq<40000000)){bigStep = 10000000; littleStep = 100000;} lcd_key = read_LCD_buttons(); // Считывание клавиш switch (lcd_key) // Далее обработка нажатий клавиш { case btnRIGHT: {freq += littleStep; break;} case btnLEFT: {freq -= littleStep; break;} case btnUP: {freq += bigStep; break;} case btnDOWN: {if (freq == bigStep){freq -= (bigStep/10);} else {freq -= bigStep;} break;} case btnSELECT: {break;} case btnNONE: {break;} } if (freq<1) freq=1; // Ограничение значений частоты if (freq>40000000) freq=40000000; sendFrequency(freq); // Вызов функции отправки частоты delay (200); // Пауза 200 мс }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 кГц. Его можно изменить нажатиями кнопок вверх/вниз и вправо/влево.
Все пользуем.
Добрый вечер всем. Может кому пригодится. Частота задается через COM порт.
float freq = 0; long com=0;// Оглашение переменных -- Частота #define W_CLK 15 // Пин A1 Arduino - подключен к CLK #define FQ_UD 16 // Пин A2 Arduino - подключен к FQ (FU) #define DATA 17 // Пин A3 Arduino - подключен к DATA #define RESET 18 // Пин A4 Arduino - подключен к RST #define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); } //------------------------------------------------------- void tfr_byte(byte data){ // Функция побитной отправки байта for (int i=0; i<8; i++, data>>=1) { // данных в модуль генератора digitalWrite(DATA, data & 0x01); pulseHigh(W_CLK);}} // Подача импульса на CLK после каждого бита //------------------------------------------------------- void sendFrequency(double frequency) { // Преобразование и отправка int32_t freq = frequency * 4294967295/125000000; // значения частоты for (int b=0; b<4; b++, freq>>=8) {tfr_byte(freq & 0xFF);} tfr_byte(0x000); // Отправка завершательного контрольного байта pulseHigh(FQ_UD);} // Обновление частоты генератора //---------------------------------------------------- void setup() { Serial.begin(9600); pinMode(FQ_UD, OUTPUT); pinMode(W_CLK, OUTPUT); pinMode(DATA, OUTPUT); pinMode(RESET, OUTPUT); } //---------------------------------------------------- void loop() { if (Serial.available()>0) { //если данные пришли com=Serial.parseInt(); freq=com; if (freq<0) freq=0; // Ограничение значений частоты if (freq>40000000) freq=40000000; pulseHigh(RESET); // Отправка импульсов для запуска модуля генератора pulseHigh(W_CLK); pulseHigh(FQ_UD); sendFrequency(freq); // Вызов функции отправки частоты Serial.println(freq); } }Для получения квадратных импульсов с выводов QOUT1 и 2 плату нужно настроить !!! На плате есть переменный резистор R13 (большая синяя фигня на плате с пазами под крестовую отвертку). Подключаем плату к Ардуино, выставляем любую частоту, подключаем QOUT1 и GRN к осцилографу и крутим резистор до появления сигнала. Пришло из Китая 10 плат, ни одна не настоена ! С начала думал брак...
Для получения квадратных импульсов с выводов QOUT1 и 2 плату нужно настроить !!! На плате есть переменный резистор R13 (большая синяя фигня на плате с пазами под крестовую отвертку). Подключаем плату к Ардуино, выставляем любую частоту, подключаем QOUT1 и GRN к осцилографу и крутим резистор до появления сигнала. Пришло из Китая 10 плат, ни одна не настоена ! С начала думал брак...
Фиг его знает, я его уже во все стороны как только не крутил... меандра так и не добился.
Синус нормальный.
Может кто помочь ?
встроил в код генератора вольтметр.
делаю измерения пока постоянного напряжения по входа А1 от 0-5в
почему то показания вольтметра скачат, при том. если я выбираю диапазон от 0-100кгц они пляшут , если от 100кгц до 10мгц они стоят ровно.
такое ощущение что работу ацп кто то сбивает, и оно не успевает считать.
как победить эту проблему не могу.