DDS генератор на Arduino + AD9850
- Войдите на сайт для отправки комментариев
Сб, 25/06/2016 - 18:50
Народ, кто нибудь придавал мучению китайский модуль с AD9850 управляя ардуиной?

Возможно ли получить минимальный шаг перестройки 0.0291 Hz, как заявлено даташите: "The AD9850’s innovative high speed DDS core provides a 32-bit frequency tuning word, which results in an output tuning resolution of 0.0291 Hz for a 125 MHz reference cloc input." ?
Эксперементируй -вот sketch
Спасибо! Но что то в скетче не могу найти где установить минимальный шаг перестройки. Хочу увидеть заявленный 0.0291 Hz ))
Ivan_Kornege, нигде. Там много всего нужно поменять что б ввести частоты с запятой.
Ivan_Kornege, нигде. Там много всего нужно поменять что б ввести частоты с запятой.
Ivan_Kornege, совершенно не интересно честно говоря, я и в своём генераторе не стал делать шаг меньше герца за отсутствием смысла. Да и модуля такого нет..
Ivan_Kornege, совершенно не интересно честно говоря, я и в своём генераторе не стал делать шаг меньше герца за отсутствием смысла. Да и модуля такого нет..
Ну, и при исследовании различного рода катушек индуктивности генератор с такой точностью очень даже нужен. Многие человеки за такой генератор скажут ОГРОМНОЕ СПАСИБО! Уговорил? Работаем в ЧЕТЫРЕ руки? ))
Ivan_Kornege, откуда ж у меня спортивному интересу взяться, ежели нет этого модуля? Присылай модуль в дар - напишу :)
Тут пример самый простой, что можно найти, я с него начинал
http://blog.riyas.org/2014/02/quickly-test-ad9850-ebay-module-with-arduino-and-software-defined-radio.html
void sendFrequency(double frequency) { int32_t freq = frequency * 4294967295 / 125000000; // note 125 MHz clock on 9850Ivan_Kornege, откуда ж у меня спортивному интересу взяться, ежели нет этого модуля? Присылай модуль в дар - напишу :)
В скетч добавишь шаг пеерстройки 0.0291 Hz, который Mining здесь подогнал #1
?
Свою старую как то не фонтан тебе слать я еЁ трохи покоцал пояльником. Бульба вырастет к сентяброю -продам и прямиком от китайца отправлю новенькую AD9850.
И у тебя время будет для творческого разбега )). К зиме бум с табой такие красавцы с DDS ))
Ivan_Kornege, не вопрос - сделаю. Но в принципе до сентября ты и сам бы успел научиться :-)
Ivan_Kornege, не вопрос - сделаю. Но в принципе до сентября ты и сам бы успел научиться :-)
dimax, скважность прямоугольника на блоке HC-SR08 регулируется подстроечником (номинал10к) за счёт смещения напряжения на входе компоратора (нога VINN). Можно ли выкинуть подстроечник и приклячить 10-битный ЦАП TLC5615CD и сделать управление с ардуины?
Тут пример самый простой, что можно найти, я с него начинал
http://blog.riyas.org/2014/02/quickly-test-ad9850-ebay-module-with-arduino-and-software-defined-radio.html
void sendFrequency(double frequency) { int32_t freq = frequency * 4294967295 / 125000000; // note 125 MHz clock on 9850Ivan_Kornege, можно конечно, там же просто смещение задаётся. Но может фаза сигнала задрожать, если выход цап шумный окажется.
Тут пример самый простой, что можно найти, я с него начинал
http://blog.riyas.org/2014/02/quickly-test-ad9850-ebay-module-with-arduino-and-software-defined-radio.html
void sendFrequency(double frequency) { int32_t freq = frequency * 4294967295 / 125000000; // note 125 MHz clock on 9850Ещё пример:
Ставим крутилку на аналог А5 и меняем частоту. 1е2 задаёт масштаб. Так вот, из-за того что аналог порт возвращает интежер значение, получить желаемый шаг по частоте не представляется возможным. Даже если масштаб (х 1е2) убрать, всё равно 1 Гц, а не 0.029Гц как хотелось. Вообще проблема , если она есть, из разряда правильного шкалирования данных.
Функция
voidsendFrequency(doublefrequency) жуёт даблы, но на ардуино, насколько мне известно, нет разницы между флотами и даблами, поетому я и сказал "передавайте флоты".Пардон за шрифт, форум не имеет опции "изменить размер" и после копи-пасте куска с декларацией функции всё пошло, как говорят, фак апНеожиданно... китаец вдруг прислал в подарок шилд, для ардуины UNO, с кнопками и дисплеем1602. И вот я слепил UNO с шилдом и приклячил AD9850
вот чеё вышло
Ну и скетч накидал как смог ))
/* Генератор синусоидальных и прямоугольных сигналов в диапазононе частот от 1Гц до 40МГц. Управляется генератор с помощью четырех кнопок - две (вверх/вниз) для грубой настройки, и две (влево/вправо) - для точной. Шаг настройки изменяется в зависимости от текущей частоты. Комплектация для сборки мезонином: - Arduino Uno R3 - Шилд DFRobot LCD Keypad Shield (на борту кнопки и диспей 1602) - Модуль генератора сигналов AD9850 DDS - 8 проводников для соединения модулей - USB кабель Инструкция по сборке: 1) Скачайте и установите Arduino ID. Компилируется в 1.6.8 -провернеро 13-09-2016г.). 2)Подключите к компьтеру плату Arduino Uno и загрузите в нее скетч. 3)После загрузки приступать к следующему этапу -соединению модулей. Keypad Shield нужно просто воткнуть поверх Arduino Uno, а модуль генератора подключить с помощью проводников по схеме: Выводы Arduino Выводы модуля генератора AD9850 +5V VCC GND GND A1 W_CLK A2 FU_UD A3 DATA A4 RESET 4) После сборки еще раз проверяем правильность подключения, если все правильно -можно подавать питание. 5) Через несколько секунд появится значение частоты по умолчанию - 1000000.00 Hz (1.00MHz), которое можно изменить нажатиями кнопок вверх/вниз и вправо/влево. Выходной сигнал снимается с контактов (контактных штырьков) модуля генератора QOUT1, QOUT2(прямоугольный), ZOUT1 и ZOUT2 (синусоидальный) */ #include <LiquidCrystal.h> // Подключение библиотеки дисплея LCD1602 LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Инициализация LCD1602 с указанием пинов. Устанавливаем номера пинов к которым подключен дисплей float freq = 1000000; // Оглашение переменных -- Частота по умолчани при первом запуске 1,00МГц . Можно поставить свою с которой будет стартовать. 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(float 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); // Старт библиотеки дисплея. Устанавливаем количество символов в строке (16) и количство строк (2) pinMode(FQ_UD, OUTPUT); //Пин AD9580 pinMode(W_CLK, OUTPUT); //Пин AD9580 pinMode(DATA, OUTPUT); //Пин AD9580 pinMode(RESET, OUTPUT); //Пин AD9580 pulseHigh(RESET); // Отправка импульсов для запуска модуля генератора AD9580 pulseHigh(W_CLK); pulseHigh(FQ_UD); } //---------------------------------------------------- void loop() { lcd.setCursor(0,0); //Устанавливаем курсор на первую строчку , где задаем 0- слева отступаем ноль символов считая с левой стророны и 0-первая строка где выводится этот текст "Fr" - freq (частота) lcd.print("Fr: "); //выводится этот текст "Fr:" в первой строке lcd.setCursor(4,0); //Устанавливаем курсор на первую строчку , задаем 4- с лева отступаем четыре символа считая с левой стророны и 0- первая строка lcd.print(" "); // выводится значение частоты генератора lcd.setCursor(4,0); // Устанавливаем курсор на первую строчку , задаем 4- с лева отступаем четыре символа считая с левой стророны и 0- первая строка if (freq<1000){lcd.print(freq); // Выводится обозначение частоты "Hz" есесли частота меньше 1000Hz lcd.print("Hz");} if ((freq>=1000)&&(freq<1000000)){lcd.print(freq / 1000); // Выводится обозначение частоты "kHz" есесли частота больше 1000 и меньше 1000000 Hz lcd.print("kHz");} //Дробим МегаГерцовый диапозон. Мне надо шагать не более чем 1Гц от 1000000 Гц (1МГц)до 1999999 Гц (1,999999МГц)---------------------- if ((freq>=1000000)&&(freq<2000000)){lcd.print(freq); //выводит на дисплей частоту от 1000000 Гц (1МГц)до 1999999 Гц (1,999999МГц) lcd.print("Hz");} // выводит на дисплей обозначение частоты в Hz //------------------------------------------------------------------------------------------------------------------------------------------ if ((freq>=2000000)&&(freq<50000000)){lcd.print(freq / 1000000); lcd.print("MHz");} lcd.setCursor(0,1); // //Устанавливаем курсор на вторую строчку , где задаем 0- слева отступаем ноль символов считая с левой стророны и 1 -вторая строка. lcd.print(" Arduino+AD9850"); // Текст второй (нижней) строки. Пробелами от ковычек до символов делаем отступ от левого края. // Управление генератором AD9850------------------------------------------------------------------------------------------------------------ if (freq<100){bigStep = 10; // Определение шага грубой-bigStep 10Hz littleStep = 1;} //Определение шага точной-littleStep 1Hz 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;} //в диаппозоне от 1МГц до 2МГц мне надо шагать помельче. В данном случае шаг 1Гц кнопками лево/право. if ((freq>=1000000)&&(freq<2000000)){bigStep = 100000; // если частота больше или равна 1,00МГц и меньше 2,00МГц большой шаг 100КГц кнопи ввер/вниз littleStep = 1;} // мелкий шаг 1 это 1Гц кнопки в лево/вправо Если заменить на littleStep = 10;} шагать будет 10Гц Если littleStep = 100;} шагает 100Гц и т.д. if ((freq>=2000000)&&(freq<10000000)){bigStep = 1000000; // если частота больше или равна 2,00МГц и меньше 10,00МГц littleStep = 10000;} // мелкий шаг 10000 это 10кГц if ((freq>=10000000)&&(freq<40000000)){bigStep = 10000000; // если частота больше или равна 10,00МГц littleStep = 100000;} // мелкий шаг 100000 это 100кГц ------------------------------------------------------------------------------------------------------------------------------------------ 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; //я установил максимум 40МГц sendFrequency(freq); // Вызов функции отправки частоты delay (200); // Пауза 200 мс }Поделюсь и я.
Генератор частоты на Arduino (Atmega328, 16MHz) + AD9850 с выводом информации на дисплей Nokia 5110
2-а диаппазона:
1-й 1,0 Hz - 1000,0 kHz
2-й 1000,0 - 40000,0 kHz
Шаг регулировки частоты:
0 = 1,0000 kHz
1 = 0,1000 kHz
2 = 0,0100 kHz
3 = 0,0010 kHz
4 = 0,0001 kHz
Для управления частотой генератора используется энкодер типа Rotary Encoder KY-040
Что куда подключать - комментарии в скетче. Схема пока в голове надо начертить.
.
AVGN, здорово! Работает!
Не обманывайте пользователя, шаг не может быть меньше 0.029, обсуждалось выше
AVGN супер работа, весь скетч в комментариях (отдельное СПАСИБО!) да еще и русифицировал!
MagicianT, ты про что? в мануале речь идет про шаг 0.0291 Hz, а скетч AVGN минимальный шаг 0,1Hz. Дедушка MINING подтвердил, а он как СОВЕТСКИЙ ☭ РАДИОЛЮБИТЕЛЬ И ИНЖЕНЕР ошибок не допускает☝
Я про фото в посте 19, там шаг 0.0001.
MagicianT, аффтар не парился, и всё выводит в килогерцах :)))
Оппс, я и не заметил. Юзер интерфейс надо доработать, а то понапишут кГц, ГГц, а ты сиди и нули подсчитывай.
AVGN супер работа, весь скетч в комментариях (отдельное СПАСИБО!) да еще и русифицировал!
MagicianT, ты про что? в мануале речь идет про шаг 0.0291 Hz, а скетч AVGN минимальный шаг 0,1Hz. Дедушка MINING подтвердил, а он как СОВЕТСКИЙ ☭ РАДИОЛЮБИТЕЛЬ И ИНЖЕНЕР ошибок не допускает☝
Да, откомпилировалось слёту в версии 1.6.5, библиотеку доставлял стандартными средствами, заимствовал по ссылке в скетче )))
Только сегодня приехал сей девайс, вечером буду пытать, посмотрим что на С1-65 покажет на 40 мегагерцах
УПС один девайс битый, жрёт 330ма, греется, на выходе по нулям
Кстати, в фунции ввода частоты разве не надо умножать прямо на коэффициент???
ua6em, коротышей нет? Когда ко мне приехала платка ad9851 и я её взял в руки -то был в шоке, такое ощущение, что кто-то на ней учился паять, про смыв флюса уже не говорю.. это само собой. Купил -промой:)
ua6em, коротышей нет? Когда ко мне приехала платка ad9851 и я её взял в руки -то был в шоке, такое ощущение, что кто-то на ней учился паять, про смыв флюса уже не говорю.. это само собой. Купил -промой:)
Глаза уже не те, сам чип припаян качественно, а вот всё остальное паяли в сарае, сомнение именно в том, что чип сильно разогревается, как бы не просадили статикой при пайке
Второй раз нахожу столь непонятное соединение выводов модуля, вопрос - с какой целью это сделано?

ua6em, в даташите было какое-то упоминание на сей счёт, лень смотреть. Но вроде суть в том, что для последовательного доступа нужно какие-то лапки подтянуть к питанию. Здесь видимо их просто повесили на +5, а лишние входы на землю.
Версия с библиотекой AD9850SPI.h
Второй раз нахожу столь непонятное соединение выводов модуля, вопрос - с какой целью это сделано?

Так в даташите на AD9850 прописано.
подключал так - скетч работает - ноги d0-d7 в воздухе - что я неправильно делаю
ua6em, так в модуле все нужные лапы уже подтянуты, так что всё ок.
dimax - понятно! Глядя на схему не увидел, что это есть!
Еще бы понять, что такое может коротить, что ток жрёт и греется?
Синус конечно шикарный, по картинке на осциллографе КНИ лучше 1%, визуально просто идеальный на 300 Килогерцах, никто не мерял? Мне сейчас нечем
простой тестовый скетч
ua6em, внимательно осмотреть, проверить на ляпы под лупой. Всяко бывает, мож там чип задом наперёд припаян..
ua6em, внимательно осмотреть, проверить на ляпы под лупой. Всяко бывает, мож там чип задом наперёд припаян..
Дима, ты прав, чип на 180 перевернули, вот это уроды, ну бабки вернут 100%, отфотографирую и на спор поставлю
Поделитесь хоть зачем шаг меньше 1 Гц. Там от температуры они десятками гуяют, да и на слух вроде не слышно.
Поделитесь хоть зачем шаг меньше 1 Гц. Там от температуры они десятками гуяют, да и на слух вроде не слышно.
Хотя забей. Если у тебя уши вместо осциллографа, то тебе это нафиг не надо ))))))
ua6em, внимательно осмотреть, проверить на ляпы под лупой. Всяко бывает, мож там чип задом наперёд припаян..
Дима, ты прав, чип на 180 перевернули, вот это уроды, ну бабки вернут 100%, отфотографирую и на спор поставлю
Сомневаюсь! Ток был приличный, подбило стабилизатор на UNO на 3.3 вольта, от него запитывалось
Я же его в прибор ставить буду, там пионерия не нужна
Сегодня посмотрю моим цифровым HANTEK 6022BE сигнал с AD9850, пришёл сегодня оный, первое впечатление весьма и весьма хреновое, конечно осциллограф со стоимостью за мильён наверное прекрасен, а это всё игрушки.
Два канала, но параметры развёртки для обоих одни, видимо коммутатор используется. Это конечно не DSO но
Пока не смог включить открытый вход, может и нет такого режима (((
Жду вечера, что цифирь покажет )))
Сомневаюсь! Ток был приличный, подбило стабилизатор на UNO на 3.3 вольта, от него запитывалось
Я же его в прибор ставить буду, там пионерия не нужна
Сегодня посмотрю моим цифровым HANTEK 6022BE сигнал с AD9850, пришёл сегодня оный, первое впечатление весьма и весьма хреновое, конечно осциллограф со стоимостью за мильён наверное прекрасен, а это всё игрушки.
Два канала, но параметры развёртки для обоих одни, видимо коммутатор используется. Это конечно не DSO но
Пока не смог включить открытый вход, может и нет такого режима (((
Жду вечера, что цифирь покажет )))
Я брал у китайца хантек DSO 5202P за 12т.р хороший прибор. Но сейчас народ пишет у нас в гандурасе таможня лютуе и обдирает радиолюбителей как липку мля...
ua6em, снял с ad9851 осцилограммы 40 и 70 MHz своим осциллом сравните потом :) Кликабельно.
ua6em, снял с ad9851 осцилограммы 40 и 70 MHz своим осциллом сравните потом :) Кликабельно.
Хорошо! На аналоговом синусоида идеальная, неожиданно так, у меня он до 20 мегагерц, на 20 и сниму картинку
300 Кгц )))
Назвать прибором это чудо язык не поворачивается, максимум осциллографический пробник
Оно даже уровень сигнала правильно померять не может (((
Откалибровал, измерил амплитуду, врёт на 0,37 вольта )))
Поделитесь хоть зачем шаг меньше 1 Гц. Там от температуры они десятками гуяют, да и на слух вроде не слышно.
Не гуляют, сейчас ставят термостабилизированные кварцевые генераторы. Можно часы тактировать - до того точно.
В районе или лучше 1 ppm ? Ой не верю, что на тех модулях такие, разве что где то взять или купить и поставить.
Morroc, примерно 2ppm Но что ставят фактически тут конечно "по системе фортуна" :-)
Назвать прибором это чудо язык не поворачивается, максимум осциллографический пробник
Оно даже уровень сигнала правильно померять не может (((
Конечно за эти деньги ничего нормального не купить, но можно было их отложить в кубышечку, и поднакопить на человеческий осцилл. Тем более у вас аналоговый ведь есть, так что потерперть ещё можно. А так фактически выброшенные деньги получилось.
вы советские цифровые 80-х годов не видели вот то была жесть )))
аналоговый взял на время на работе до того как взял осцил заказал - горело
ну посмотреть сигнал можно
dimax, Вы случайно не разбирались с функцией сдвига фазы в AD9851?
Можно ли управлять сдвигом фазы с помощью Arduino?
Пытаюсь сделать FM модуляцию на базе AD9851 под управлением Arduino .
Ardudue, изучал, но практически не использовал, для чего? Приёмники не проверить, у них частоты не те, да и купить фм-трансмиттер за 100руб если что не проблема. А фазу двигать не трудно, для этого желательно подключить модуль в паралельном режиме, и после установки частоты отсылать только изменённый первый байт данных, в котором 5 старших бит отвечают за фазу.
dimax, Вы случайно не разбирались с функцией сдвига фазы в AD9851?
Можно ли управлять сдвигом фазы с помощью Arduino?
Пытаюсь сделать FM модуляцию на базе AD9851 под управлением Arduino .
Посмотрите здесь
Что получилось у автора https://youtu.be/FJdQhJg-_6k
Пытался разобраться с проектом, но не доковырял