Приветствую Сергей. Сам не так давно возился с AD9958, постараюсь ответить на твои вопросы.
В своем макете LPT не использовал, для управления применил C8051F320. Передачу данных осуществлял в однобитном режиме, так вроде проще.
Итак, относительно вопросов:
1. LC ФНЧ. Насчет Сх в данном виде точно сказать не могу. Можно построить цепь в MicroCap и оценить его влияние. Чаще всего в конструкциях с DDS встречал использование НЧ эллиптического фильтра 3-го порядка. Поиски информации навели на сайт coilcraft.com, где и удалось заказать пару образцов готовых модулей.
2. С фильтр. на питании. Чем больше тем лучше, ставь везде, где можно. Лит. обзор DDS конструкций показывает: от 10 до 50 штук 0,1 uF :)
3. На мой взгляд использование RC задерживающей цепочки - это немного лишнее. С одной стороны задержку можно сформировать программно, с другой - 12 ns (Figure 41 datasheet) не такое уж и большое значение.
4. Управление пятивольтовой ТТЛ можно, при этом предусмотри последовательные резисторы 50 - 100 Ом.
Программирование:
1. Инициализация
Reset = 1;
Reset = 0;
//
DDS_Set(0x01); // Адрес регистра
DDS_Set(0xA3); // Установка множителя
DDS_Set(0x00);
DDS_Set(0x20);
//
IO_Update = 1;
IO_Update = 0;
2. Установка частоты / амплитуды / фазы
DDS_Set(0x00); // Адрес
DDS_Set(0x70); // Выбор 1 канала
// *** IO_Update не нужно
DDS_Set(0x04); // Установка частоты DDS1 --------------------
i = 4;
while (i != 0)
{
FDAT = FREQ1/0x00FFFFFF;
DDS_Set(FDAT&0xFF);
FREQ1 = FREQ1*256;
i--;
}
DDS_Set(0x05); // Установка фазы DDS1 -----------------------
DDS_Set(0x10); // Фаза 90
DDS_Set(0x00);
DDS_Set(0x06); // Установка амплитуды DDS1 ------------------
DDS_Set(0x00);
DDS_Set(GAIN1);
DDS_Set(GAIN2);
// -----------------------------------------------------------------------
DDS_Set(0x00); // Выбор 2 канала ----------------------------
DDS_Set(0xB0);
//
DDS_Set(0x04); // Установка частоты DDS2 --------------------
i = 4;
while (i != 0)
{
FDAT = FREQ2/0x00FFFFFF;
DDS_Set(FDAT&0xFF);
FREQ2 = FREQ2*256;
i--;
}
DDS_Set(0x05); // Установка фазы DDS2 -----------------------
DDS_Set(0x00); // Фаза 0
DDS_Set(0x00);
DDS_Set(0x06); // Установка амплитуды DDS2 ------------------
DDS_Set(0x00);
DDS_Set(GAIN1);
DDS_Set(GAIN2);
//
// -----------------------------------------------------------------------
DDSUpdate = 1; // Применить *********************************
DDSUpdate = 0;
Насчет расчета цифр, в даташите всё написано (см. стр 17).
Пример: фаза 90 градусов
POW = ( фаза * 2^14 ) / 360 = (90 * 16384) / 360 = 4096 = 0x1000 (HEX)