Для отладки будем использовать готовую оценочную плату AD9833 совместно с контроллером STM32F429ZITx на плате nucleo. Для настройки воспользуемся кодогенератором STM32CubeMX.
Под свои нужды были адаптированы два вида реализации библиотеки с использованием аппаратного и программного SPI.
Для программной реализации SPI необходимо выбрать любые три ножки микроконтроллера и настроить их на выход в режиме Push-Pull, а затем переопределить дефайны в h-файле библиотеки для каждой ножки FSYNC, sDATA и sCLK.
Для аппаратной реализации нужно настроить SPI и добавить указатель на используемый аппаратный модуль SPI в h-файле библиотеки. Также надо настроить любую ножку на выход в режиме Push-Pull для линии FSYNC и переопределить её дефайн в h-файле библиотеки.
В библиотеке очень много комментариев поэтому код библиотеки приводить тут не буду. Ссылки на аппаратную и программную реализацию библиотеки, а также на готовый проект и документацию прикреплю в конце поста.
Пример работы с аппаратным SPI.
SPI настраиваем в режиме ведущего, только передача.
Не забываем установить Clock Polarity в High, так как сброс лини FSYNC в ноль когда sCLK находится в 1 – необходимое условие начала кадра и также «защёлкивание» данных идёт по нисходящему фронту.
Для работы библиотеки необходимо проинициализировать микросхему вызовом соответствующей функции. Загрузить и выбрать регистры частоты и фазы (если необходимо) и выбрать форму сигнала.
// Инициализация AD9833
ad9833_init();
// Установка регистра частоты 0 (FREQ_0) на частоту 5кГц:
ad9833_set_frequency(0, 5000);
// Выбор регистра частоты 0:
ad9833_set_freq_out(0);
// Установка формы сигнала и включение генерации:
ad9833_set_mode(AD_SINE);
// Для остановки генерации сигнала выбрать режим OFF:
ad9833_set_mode(AD_OFF);
С помощью соответствующих функций возможно изменение фазы сигнала, по умолчанию фаза равна нулю.
Далее приведу тестовый кусочек кода, в котором через каждые 5 секунд меняется режим работы микросхемы AD9833. После инициализации генерируется синус, частота берётся из первого регистра – 2кГц, затем синус с частотой 4096 Гц из второго регистра и на конец треугольник с частотой 4096 Гц.
Результаты:
Отличное соотношение сигнал/шум без применения какой либо фильтрации на выходе.
Прикреплённые материалы:
Библиотека с аппаратным SPI: https://drive.google.com/file/d/19dUkgkxUvOKh_ZxGKoy2DkiCNSYalTcG/view?usp=sharing
Библиотека с программным SPI: https://drive.google.com/file/d/1RZFo9dnBVBu_BrumciQb-GuOQ0kUSGAm/view?usp=sharing
AD9833 пример работы: https://drive.google.com/file/d/1qjT95a7Lyqb1xrDRoUrEyUfZ6wYIooBW/view?usp=sharing
Техническое описание и рекомендации по программированию: https://drive.google.com/file/d/12DhABqJcfDSMntjD_w1kXBB2eMD8b71Q/view?usp=sharing
На сайте разработчика можно оценить работу микросхемы: https://tools.analog.com/en/simdds/?part=AD9833&fin=25M&mult=1&ftw=D1B7&rso=111111&harmonicDB=-50&useFilters=0