Страница 1 из 4

Atmega8+DDS AD9850

Добавлено: Вс май 12, 2013 14:40:58
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 МГц.

Re: Atmega8+DDS AD9850

Добавлено: Пт май 24, 2013 19:16:21
bobr25
В ближайшие пару дней, если время позволит, опробую модуль на AD9850.
Если ваш вопрос еще актуален, выложу куски кода с пояснениями.

Re: Atmega8+DDS AD9850

Добавлено: Сб май 25, 2013 20:36:46
Yusff
Игрался с таким модулем. До применения в SDR так и не дошло :) Установка только частоты, без фазы. Как раз кодевижн.

Re: Atmega8+DDS AD9850

Добавлено: Сб май 25, 2013 22:03:49
bobr25
Спасибо. Пригодится.
Для SDR лучше на двух синхронизированных модулях сделать, или взять другой DDS чип чтобы сразу иметь квадратурные сигналы.

Re: Atmega8+DDS AD9850

Добавлено: Пн июн 03, 2013 21:58:33
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. Проверенно в железе.

Re: Atmega8+DDS AD9850

Добавлено: Чт июн 13, 2013 14:49:26
Gef79
Ребят огромное спасибо за вклад! Не мог проверить данный код, убил програматор, соорудил новый,в ближайшее время проверю и скажу результат!
Написал собственный код, но ничего не получилось, нет на выходе ДДС ничего! Буду разбиратся.
Тема ещё актуальная.

Re: Atmega8+DDS AD9850

Добавлено: Чт июн 13, 2013 16:03:25
bobr25
Вот мой пробный проект целиком. (куски которого выкладывал выше)

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

MOSI ---> D7
SCK ---> W_CLK
PB2 ---> FQ_UD

Re: Atmega8+DDS AD9850

Добавлено: Чт июн 13, 2013 16:22:35
Gef79
Огромное спасибо! Сегодня вечером протестирую и погляжу сразу не заняты ли у меня ноги SPI под другие нужды.

Re: Atmega8+DDS AD9850

Добавлено: Чт июн 13, 2013 17:33:28
Yusff
Gef79 писал(а):но ничего не получилось, нет на выходе ДДС ничего

А так не забыли сделать?
СпойлерИзображение

Re: Atmega8+DDS AD9850

Добавлено: Чт июн 13, 2013 18:09:34
bobr25
Кстати, еще обратите внимание на ногу Rset (Pin 12). Должен быть резистор на землю (3,9k).

Re: Atmega8+DDS AD9850

Добавлено: Чт июн 13, 2013 20:24:22
Gef79
Такс! Ноги как по схеме я соеденил, а вот по поводу резюка не скажу, так как это готовая маленькая аурдиновская платка, надо будет поглядеть!

Re: Atmega8+DDS AD9850

Добавлено: Чт июн 13, 2013 22:20:13
bobr25
У меня такой модуль:
СпойлерИзображение

В нем нужно только D2 соединить с GND, больше ничего не нужно.
Какой модуль у вас?

Re: Atmega8+DDS AD9850

Добавлено: Чт июн 13, 2013 23:57:45
Gef79
Всем спасибо за подсказку!
Модуль такой же как на картинке!
По SPI действительно всё работает.
Единственное теперь схему нужно будет подкоректировать, что бы освободить ноги SPI.
И ещё один момент, какой уровень у этого модуля на выходе? Частотомер не берёт, контролировал по приёмнику.

Re: Atmega8+DDS AD9850

Добавлено: Пт июн 14, 2013 19:35:09
bobr25
Уровень на выходе (Sin) зависит от нагрузки. у меня около 0,5 вольта было (если память не подводит). Частотомер должен без проблем брать.
Если пины SPI заняты можно программно реализовать, посмотрите выше Yusff код выкладывал.

Re: Atmega8+DDS AD9850

Добавлено: Ср июн 19, 2013 20:51:04
Gef79
Спасибо за ответ! Действительно размах сигнала около 0,5В, проблемма была в частотомере!
Продолжаю трудится над проектом дальше!

Re: Atmega8+DDS AD9850

Добавлено: Чт июн 20, 2013 22:50:16
Gef79
Вылез новый косяк! Заливаю частоту через SPI. Так вот при установке частоты выше 9999999 Гц, перестаёт устанавливатся частота!!! Куда копать?

Re: Atmega8+DDS AD9850

Добавлено: Пт июн 21, 2013 08:27:50
bobr25
Трудно сказать что происходит, не видя кода .
Залейте для пробы этот проект.
Формирует попеременно три частоты 1000000, 9999999 и 11000000 Гц каждую по 5 секунд (при тактовой 8МГц).
Работает? Ищите ошибки в коде где формируется значение переменной содержащей частоту в герцах, или где формируется управляющее слово.

Re: Atmega8+DDS AD9850

Добавлено: Пт июн 21, 2013 11:49:20
Gef79
Добрый день! Спасибо за ответ! Использую именно ваш код! Думаю что, что то с настройками Codevision, так как переменная long затем преобразовывается в char для отображения на LCD и так же выходит затык! Мне кажется что , что то с настройками компилятора, но вот что не понятно! Может нужно что то выставить в настройках?
Код очень уж большой, так как пишиться для синтеза под трансивер Mini-Yes! до 10 Мег всё работает на ура, а вот выше всё болт!

Re: Atmega8+DDS AD9850

Добавлено: Пт июн 21, 2013 12:34:05
bobr25
По настройкам компилятора не подскажу, попробуйте сформулировать и задать вопрос в теме про CVAVR

Как вы преобразуете
переменная long затем преобразовывается в char
?
Куда деваете не влезающие в Char данные?

Re: Atmega8+DDS AD9850

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