Atmega8+DDS AD9850

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

Atmega8+DDS AD9850

Сообщение Gef79 »

Добрый день всем!
Нужна помощ в написание софта для данной связки.
Нужно с посощью меги управлять ДДС-ом, тоесть изменять частоту по последовательной шине!
Помогите плиз написать софт для этого дела, желательно под CodeVision!
Спасибо всем кто откликнется.

int PIN_RESET = 13;
int PIN_FREQ_UPDATE = 12;
int PIN_CLOCK = 11;
int PIN_DATA = 10;

void AD9850Reset() {
digitalWrite(PIN_FREQ_UPDATE, 0);

digitalWrite(PIN_RESET, 0);
digitalWrite(PIN_RESET, 1);
digitalWrite(PIN_RESET, 0);

digitalWrite(PIN_CLOCK, HIGH);
digitalWrite(PIN_CLOCK, LOW);

digitalWrite(PIN_FREQ_UPDATE, 1);
digitalWrite(PIN_FREQ_UPDATE, 0);
}

//frequency in Hertz
void AD9850Update(double frequency) {
unsigned char i, w;
long int tuningWord;

tuningWord = frequency* 4294.967296f / 125.0f;

shiftOut(PIN_DATA, PIN_CLOCK, LSBFIRST, tuningWord);
shiftOut(PIN_DATA, PIN_CLOCK, LSBFIRST, tuningWord >> 8);
shiftOut(PIN_DATA, PIN_CLOCK, LSBFIRST, tuningWord >> 16);
shiftOut(PIN_DATA, PIN_CLOCK, LSBFIRST, tuningWord >> 24);
shiftOut(PIN_DATA, PIN_CLOCK, LSBFIRST, 0x0);

digitalWrite(PIN_FREQ_UPDATE, 1);
digitalWrite(PIN_FREQ_UPDATE, 0);
}

Вот примерный код под аурдино, как можно его переписать под CodeVision?
Тактовая частота ДДС -125 МГц.
bobr25
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Ср мар 10, 2010 16:19:15

Re: Atmega8+DDS AD9850

Сообщение bobr25 »

В ближайшие пару дней, если время позволит, опробую модуль на AD9850.
Если ваш вопрос еще актуален, выложу куски кода с пояснениями.
Аватара пользователя
Yusff
Встал на лапы
Сообщения: 124
Зарегистрирован: Сб окт 20, 2012 14:07:16

Re: Atmega8+DDS AD9850

Сообщение Yusff »

Игрался с таким модулем. До применения в SDR так и не дошло :) Установка только частоты, без фазы. Как раз кодевижн.
Вложения
main.c
(2.21 КБ) 887 скачиваний
bobr25
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Ср мар 10, 2010 16:19:15

Re: Atmega8+DDS AD9850

Сообщение bobr25 »

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

Re: Atmega8+DDS AD9850

Сообщение bobr25 »

Наконец-то появилось немного свободного времени. Опробовал и я модули DDS с AD9850.
Как и обещал, выкладываю куски кода с небольшими комментариями.
Автору темы, наверное, уже не интересно, но может еще кому-то пригодится.

Для управления DDS использован аппаратный SPI. Микроконтроллер ATMEGA8, тактовая частота 8Mhz. Код писан в CVAVR V2.05.3

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

#include <spi.h>
#define FQ_UD PORTB.2                 //куда подключен вывод FQ_UD AD9850

/*********** Переменные **************/
union un_dataword                  //5 Байт, объединение  содержит данные для передачи AD9850
{
unsigned long dataword_freq;        // 32 бит слово,  для управления частотой 
unsigned char dataword_byte[5];   // массив для побайтного доступа 
}un;

unsigned long freq;                  // частота Hz
unsigned char i;                       // счетчик
float k = 34.359738368;          // коэффициент  = 4294967296 / F_DDS_IN  где   F_DDS_IN - тактовая частота DDS Гц)

void main(void)
{

/********** Конфигурация SPI **********/

// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 2000,000 kHz
// SPI Clock Phase: Cycle Start
// SPI Clock Polarity: Low
// SPI Data Order: LSB First
SPCR=0x70;
SPSR=0x00;

/********** Подготовка управляющего слова *************/

freq = 500000;       // 500 кГц например

un.dataword_byte[4]=0b00000000;  // два младших бита (0 и 1) Обязательно = 0.
                              // бит 2 устанавливает режим Power-Down
                              // пять старших бит управляют фазой.

 un.dataword_freq = freq*k;       //  частота

/*************Отправка управляющего слова *************/

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




P.S. Проверенно в железе.
Gef79
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Ср дек 15, 2010 16:49:44

Re: Atmega8+DDS AD9850

Сообщение Gef79 »

Ребят огромное спасибо за вклад! Не мог проверить данный код, убил програматор, соорудил новый,в ближайшее время проверю и скажу результат!
Написал собственный код, но ничего не получилось, нет на выходе ДДС ничего! Буду разбиратся.
Тема ещё актуальная.
bobr25
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Ср мар 10, 2010 16:19:15

Re: Atmega8+DDS AD9850

Сообщение bobr25 »

Вот мой пробный проект целиком. (куски которого выкладывал выше)

Соединение Меги с AD9850:

MOSI ---> D7
SCK ---> W_CLK
PB2 ---> FQ_UD
Вложения
AD9850_test.rar
(34 КБ) 905 скачиваний
Gef79
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Ср дек 15, 2010 16:49:44

Re: Atmega8+DDS AD9850

Сообщение Gef79 »

Огромное спасибо! Сегодня вечером протестирую и погляжу сразу не заняты ли у меня ноги SPI под другие нужды.
Аватара пользователя
Yusff
Встал на лапы
Сообщения: 124
Зарегистрирован: Сб окт 20, 2012 14:07:16

Re: Atmega8+DDS AD9850

Сообщение Yusff »

Gef79 писал(а):но ничего не получилось, нет на выходе ДДС ничего

А так не забыли сделать?
СпойлерИзображение
Вложения
se.png
(7.88 КБ) 6668 скачиваний
bobr25
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Ср мар 10, 2010 16:19:15

Re: Atmega8+DDS AD9850

Сообщение bobr25 »

Кстати, еще обратите внимание на ногу Rset (Pin 12). Должен быть резистор на землю (3,9k).
Gef79
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Ср дек 15, 2010 16:49:44

Re: Atmega8+DDS AD9850

Сообщение Gef79 »

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

Re: Atmega8+DDS AD9850

Сообщение bobr25 »

У меня такой модуль:
СпойлерИзображение

В нем нужно только D2 соединить с GND, больше ничего не нужно.
Какой модуль у вас?
Gef79
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Ср дек 15, 2010 16:49:44

Re: Atmega8+DDS AD9850

Сообщение Gef79 »

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

Re: Atmega8+DDS AD9850

Сообщение bobr25 »

Уровень на выходе (Sin) зависит от нагрузки. у меня около 0,5 вольта было (если память не подводит). Частотомер должен без проблем брать.
Если пины SPI заняты можно программно реализовать, посмотрите выше Yusff код выкладывал.
Gef79
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Ср дек 15, 2010 16:49:44

Re: Atmega8+DDS AD9850

Сообщение Gef79 »

Спасибо за ответ! Действительно размах сигнала около 0,5В, проблемма была в частотомере!
Продолжаю трудится над проектом дальше!
Gef79
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Ср дек 15, 2010 16:49:44

Re: Atmega8+DDS AD9850

Сообщение Gef79 »

Вылез новый косяк! Заливаю частоту через SPI. Так вот при установке частоты выше 9999999 Гц, перестаёт устанавливатся частота!!! Куда копать?
bobr25
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Ср мар 10, 2010 16:19:15

Re: Atmega8+DDS AD9850

Сообщение bobr25 »

Трудно сказать что происходит, не видя кода .
Залейте для пробы этот проект.
Формирует попеременно три частоты 1000000, 9999999 и 11000000 Гц каждую по 5 секунд (при тактовой 8МГц).
Работает? Ищите ошибки в коде где формируется значение переменной содержащей частоту в герцах, или где формируется управляющее слово.
Вложения
TEST.RAR
(38.72 КБ) 459 скачиваний
Gef79
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Ср дек 15, 2010 16:49:44

Re: Atmega8+DDS AD9850

Сообщение Gef79 »

Добрый день! Спасибо за ответ! Использую именно ваш код! Думаю что, что то с настройками Codevision, так как переменная long затем преобразовывается в char для отображения на LCD и так же выходит затык! Мне кажется что , что то с настройками компилятора, но вот что не понятно! Может нужно что то выставить в настройках?
Код очень уж большой, так как пишиться для синтеза под трансивер Mini-Yes! до 10 Мег всё работает на ура, а вот выше всё болт!
bobr25
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Ср мар 10, 2010 16:19:15

Re: Atmega8+DDS AD9850

Сообщение bobr25 »

По настройкам компилятора не подскажу, попробуйте сформулировать и задать вопрос в теме про CVAVR

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

Re: Atmega8+DDS AD9850

Сообщение Gef79 »

Спасибо за ответ! Преобразовую так:
char fraq_char[32];
float fraq;
.
.
.
fraq=11000000;
ftoa(fraq/1000,3,fraq_char);
lcd_puts(fraq_char);
До этого массив был из 8 бит, увеличил до 32, частота стала выставляться, но не та что нужно! Глюки продолжаются!
Ответить

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