Добрый день всем! Нужна помощ в написание софта для данной связки. Нужно с посощью меги управлять ДДС-ом, тоесть изменять частоту по последовательной шине! Помогите плиз написать софт для этого дела, желательно под CodeVision! Спасибо всем кто откликнется.
int PIN_RESET = 13; int PIN_FREQ_UPDATE = 12; int PIN_CLOCK = 11; int PIN_DATA = 10;
Наконец-то появилось немного свободного времени. Опробовал и я модули DDS с AD9850. Как и обещал, выкладываю куски кода с небольшими комментариями. Автору темы, наверное, уже не интересно, но может еще кому-то пригодится.
Для управления DDS использован аппаратный SPI. Микроконтроллер ATMEGA8, тактовая частота 8Mhz. Код писан в CVAVR V2.05.3
/*********** Переменные **************/ 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 Гц)
/********** Подготовка управляющего слова *************/
freq = 500000; // 500 кГц например
un.dataword_byte[4]=0b00000000; // два младших бита (0 и 1) Обязательно = 0. // бит 2 устанавливает режим Power-Down // пять старших бит управляют фазой.
un.dataword_freq = freq*k; // частота
/*************Отправка управляющего слова *************/
Ребят огромное спасибо за вклад! Не мог проверить данный код, убил програматор, соорудил новый,в ближайшее время проверю и скажу результат! Написал собственный код, но ничего не получилось, нет на выходе ДДС ничего! Буду разбиратся. Тема ещё актуальная.
Всем спасибо за подсказку! Модуль такой же как на картинке! По SPI действительно всё работает. Единственное теперь схему нужно будет подкоректировать, что бы освободить ноги SPI. И ещё один момент, какой уровень у этого модуля на выходе? Частотомер не берёт, контролировал по приёмнику.
Уровень на выходе (Sin) зависит от нагрузки. у меня около 0,5 вольта было (если память не подводит). Частотомер должен без проблем брать. Если пины SPI заняты можно программно реализовать, посмотрите выше Yusff код выкладывал.
Трудно сказать что происходит, не видя кода . Залейте для пробы этот проект. Формирует попеременно три частоты 1000000, 9999999 и 11000000 Гц каждую по 5 секунд (при тактовой 8МГц). Работает? Ищите ошибки в коде где формируется значение переменной содержащей частоту в герцах, или где формируется управляющее слово.
Добрый день! Спасибо за ответ! Использую именно ваш код! Думаю что, что то с настройками Codevision, так как переменная long затем преобразовывается в char для отображения на LCD и так же выходит затык! Мне кажется что , что то с настройками компилятора, но вот что не понятно! Может нужно что то выставить в настройках? Код очень уж большой, так как пишиться для синтеза под трансивер Mini-Yes! до 10 Мег всё работает на ура, а вот выше всё болт!
Спасибо за ответ! Преобразовую так: char fraq_char[32]; float fraq; . . . fraq=11000000; ftoa(fraq/1000,3,fraq_char); lcd_puts(fraq_char); До этого массив был из 8 бит, увеличил до 32, частота стала выставляться, но не та что нужно! Глюки продолжаются!
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 173
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения