Atmega8+DDS AD9850

Обсуждаем контроллеры компании Atmel.
bobr25
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Ср мар 10, 2010 16:19:15

Re: Atmega8+DDS AD9850

Сообщение bobr25 »

Понятно, в строку преобразуете.
32 байта строка, наверно, здесь не нужна.
Вы собираетесь выводить строку из 9 символов, значит достаточно строки в 10 байт.

Попробуйте для начала убрать деление на 1000 , сделайте вывод на LCD в герцах (временно).
Вам потребуется строка длиной 9 байт и вместо функции ftoa использовать ltoa (если я правильно помню).
Это даст возможность локализовать проблему (если конечно проблема в этой части)
Gef79
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Ср дек 15, 2010 16:49:44

Re: Atmega8+DDS AD9850

Сообщение Gef79 »

Добрый день! Действительно вся проблемма с функцией ftoa,с ltoa всё работает! Терь возник вопрос, как отделить сотые через точку и вывести на LCD,например: 28850.060 ?
bobr25
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Ср мар 10, 2010 16:19:15

Re: Atmega8+DDS AD9850

Сообщение bobr25 »

можно вот так

Код: Выделить всё


#include <stdio.h>
/*****/

char fraq_char[10];
/****/

sprintf(fraq_char,"%+5u.%03u",freq/1000,freq%1000);
Gef79
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Ср дек 15, 2010 16:49:44

Re: Atmega8+DDS AD9850

Сообщение Gef79 »

Спасибо за ответ! Сегодня вечером попробую!
Такй вариант так же расматривал, но не понял что задают эти выражения: "%+5u.%03u", поясните плиз.
bobr25
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Ср мар 10, 2010 16:19:15

Re: Atmega8+DDS AD9850

Сообщение bobr25 »

это форматирование вывода
+ - выравнивание в право
5 - пять символов
u - без знаковое целое

03 - три символа, если символов меньше дополняются нулями слева

чтобы разобраться, поищите примеры использования функций printf и sprintf
Gef79
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Ср дек 15, 2010 16:49:44

Re: Atmega8+DDS AD9850

Сообщение Gef79 »

Ок! Спасибо за науку, буду разбератся с функциями!
Gef79
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Ср дек 15, 2010 16:49:44

Re: Atmega8+DDS AD9850

Сообщение Gef79 »

Докладываю! Выражение sprintf(fraq_char,"%+5u.%03u",freq/1000,freq%1000); не работает!
Переменная freq у меня float.
bobr25
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Ср мар 10, 2010 16:19:15

Re: Atmega8+DDS AD9850

Сообщение bobr25 »

В чем выражается не работа?
stdio.h подключена?
На каких значениях freq проверяли?

Перед тем как это выражение выкладывать, я его проверял, у меня оно работает.
bobr25
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Ср мар 10, 2010 16:19:15

Re: Atmega8+DDS AD9850

Сообщение bobr25 »

Не заметил сразу
Gef79 писал(а):Переменная freq у меня float.
, поэтому и не работает.
Зачем она float?
Если по моему коду делали она должна быть unsigned long.
Gef79
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Ср дек 15, 2010 16:49:44

Re: Atmega8+DDS AD9850

Сообщение Gef79 »

Пробовал перевести в unsigned long, снова ничего!
Прикрепляю файлик, подскажите что не так!
Забавно, в Протеусе не работает, залил в контроллер, работает через раз!
Ничего не понимаю, глюки)!
Вложения
sin.c
(9.39 КБ) 616 скачиваний
bobr25
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Ср мар 10, 2010 16:19:15

Re: Atmega8+DDS AD9850

Сообщение bobr25 »

Модель протеусную еще выложите.
Если вечером время будет посмотрю подробнее.

перетащил из вашего файла в тестовый проект вот это

Код: Выделить всё

unsigned long fraq = 28850000;

char fraq_char[10];



sprintf(fraq_char,"%+5u.%03u",fraq/1000,fraq%1000);
      lcd_gotoxy(5,0);
      lcd_puts(fraq_char);

Все работает.

Проект в приложенном архиве, в папке proteus модель для протеуса.
Попробуйте на своем CVAVR скомпилировать, будет ли работать.
Вложения
2.RAR
(210.65 КБ) 442 скачивания
Gef79
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Ср дек 15, 2010 16:49:44

Re: Atmega8+DDS AD9850

Сообщение Gef79 »

Спасибо, нарыл проблему! В компиляторе не правильно было выставлено int,width!
Вот архивчик с проектом на данный момент!
Рабочий проект sinAD2.Не доглядел, открыл в evaluationвот в нём работает, но есть ограничение по софту! В версии 2.03.09 не работает!
Вложения
Sintez_AD.zip
(292.08 КБ) 452 скачивания
Sasha Lauta
Родился
Сообщения: 11
Зарегистрирован: Пн апр 26, 2010 22:54:01

Re: Atmega8+DDS AD9850

Сообщение Sasha Lauta »

Всем привет. Вопрос по AD9850, проблема в том что синтезатор выдает немного не то что рассчитано по формулам.
Пример.
Имеем собранную схему. Кварцевый генератор на 125 МГц.
Как получить 1 Гц на выходе устройства?
Для начала нам необходимо вычислить коэффициент деления K:
K = Fген / 2^32 = 125 000 000 / 4 294 967 296 = 0.02910…
Находим код, который необходимо отослать в DDS:
Код = Fвых / K = 1 (Гц) / 0.02910 = 34,3642…. = 34

Управляющее слово состоит из пяти байт, если я ничего не путаю, пятый байт нам не нужен, это управления фазой.
Выводим 34 в двоичной форме 00000000 00000000 00000000 00000000 00100010
Но на выходе я получаю не 1Гц а 255Гц, подозрительно чтото 255 Гц, такое впечатления что проблема в коэффициенте деления, может кто то сталкивался или просто знает в чем проблема, подскажите.
В данный момент, если прикинуть, 225/34=6,6. Тоесть минимальная частота гдето 7Гц, чтото не то :cry:
bobr25
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Ср мар 10, 2010 16:19:15

Re: Atmega8+DDS AD9850

Сообщение bobr25 »

Попробуйте получить еще несколько других частот (например 100Гц 1000Гц 10000Гц)
и напишите что получили на выходе DDS.

Подозреваю что при передаче в чип DDS управляющее слово сдвинуто на 1 байт.
Sasha Lauta
Родился
Сообщения: 11
Зарегистрирован: Пн апр 26, 2010 22:54:01

Re: Atmega8+DDS AD9850

Сообщение Sasha Lauta »

Я тоже так подозреваю, выставляю 10Гц, получаю 2550Гц. А что можно сделать
Sasha Lauta
Родился
Сообщения: 11
Зарегистрирован: Пн апр 26, 2010 22:54:01

Re: Atmega8+DDS AD9850

Сообщение Sasha Lauta »

Всем спасибо за ответы, нашел причину :)) , на бумажке то я пишу что в управляющем слове 5 байт а програмно забыл за 5 байт и командное слово получилось 4 байта. Вот этот здвиг на один байт и получился :oops:
Аватара пользователя
Garin
Потрогал лапой паяльник
Сообщения: 351
Зарегистрирован: Пн сен 12, 2011 12:13:46

Re: Atmega8+DDS AD9850

Сообщение Garin »

Здравствуйте, тоже заинтересовался схемой с генератором AD9850, но по форуму так и не понял, доделал генератор кто до конца?
Если можно поделитесь пожалуйста схемой подключения и рабочим проектом. :beer:
bobr25
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Ср мар 10, 2010 16:19:15

Re: Atmega8+DDS AD9850

Сообщение bobr25 »

Я свою пока не доделал, отложил из за отсутствия времени.
Готовых проектов в сети много, со схемами и прошивками, под разные цели.
Или возьмите мой проект (выкладывал выше) и доделайте под свои цели,
там осталось только дисплей с кнопками или валкодером прикрутить, управление ДДС полностью работает.

Если нужен именно готовый проект, могу прислать в личку несколько ссылок, или гугол поможет.
Аватара пользователя
Garin
Потрогал лапой паяльник
Сообщения: 351
Зарегистрирован: Пн сен 12, 2011 12:13:46

Re: Atmega8+DDS AD9850

Сообщение Garin »

bobr25 смотрел ваш архив, я так понял что там пока заготовки.
Интересует именно начальный проект с управлением AD9850, и принципиальная схема что куда подключено. А ссылки готовых проектов спасибо не надо.
Эта тема та что мне нужно, у меня такая платка есть .
Тока в программировании я слабак, успехи небольшие есть в CodeVisionAVR , но так только "вершки"... вот и спросил, может поделитесь , если есть успехи, а если у меня получится что , так я тоже в долгу не останусь. :beer:
bobr25
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Ср мар 10, 2010 16:19:15

Re: Atmega8+DDS AD9850

Сообщение bobr25 »

Посмотрите мои сообщения от Пн июн 03, 2013 21:58:33 там код по управлению AD9850 с комментариями,
от Чт июн 13, 2013 16:03:25 там подключение меги к DDS модулю и полностью проект для CodeVisionAVR (AD9850_test.rar) Проверен на таком же точно модуле.
В этом проекте частота задается однократно и настраивает DDSку на нее.
Чтобы менять частоту на ходу последовательность такая:
1. задали частоту в переменной freq.
2. готовим управляющее слово

Код: Выделить всё

un.dataword_byte[4]=0b00000000; 
un.dataword_freq = freq*k;     

3. отправляем управляющее слово

Код: Выделить всё

FQ_UD =1;
       FQ_UD =0;
       
        for (i=0; i<5; i++)
        {
        spi(un.dataword_byte[i]);
         }
         
        FQ_UD =1;
        FQ_UD =0;     

4. Новая частота установлена, наслаждаемся результатом.
Ответить

Вернуться в «AVR»