Понадобился мне как-то генератор сигналов нестандартной формы, да и вообще генератор вещь в хозяйстве полезная, им орехи колоть можно... В результате на свет появился этот девайс, который я и предлагаю вашему вниманию. Это двухканальный синтезатор произвольного сигнала (СПС). Основан на методе прямого цифрового синтеза, т.е. берем ЦАП и выводим на него цифры из памяти с частотой выборки. Нужной последовательностью цифр формируем "произвольный" сигнал.
СПС способен работать в двух режимах: одноканальном и двухканальном.
Характеристики режимов:
Одноканальный:
Частота выборки - 30 MSPS
Разрешение - 12 бит
Амплитуда сигнала - 0..2В
Шум ~ 30мВ
Частота аналогового сигнала: 114,4Гц - 15 МГц
Сигнал однополярный
Двухканальный:
Частота выборки - 15 MSPS
Разрешение - 12 бит
Амплитуда сигналов - 0..2В
Шум ~ 30мВ
Частота аналогового сигнала: 114,4Гц - 7,5 МГц
Сигналы однополярные
СПС состоит из:
ЦАП AD9765
ПЛИС Altera EPM3128ATC100-7
МК Atmega8-16
SRAM AS7C34096A-12
ЖКИ MT-16S2D
SD flash memory 1 Gbyte
Кварцевый генератор SJK 60MHz
Компьютерный интерфейс на ft232bm
Ну и по мелочи резисторы индуктивности...
Почему непрецизионный? - потому что при проектировании схемы не производилась особая борьба за соотношение сигнал/шум.
Схема.
Принцип работы.
Синтезатор представляет собой отдельное устройство, в энергонезависимую память которого с компьютера один раз записываются сигналы, после чего устройство может работать автономно, без компьютера. При воспроизведении сигнала данные из энергонезависимой памяти, роль которой играет SD карточка, загружаются в оперативную память SRAM, откуда затем и выводятся на ЦАП.
Для автономной работы устройство имеет собственный интерфейс в виде ЖКИ 16х2, и трёх кнопок. С помощью кнопок вверх вниз можно пролистывать сигналы, при этом на ЖКИ будет отображаться имя сигнала. Кнопкой старт/стоп можно запустить воспроизведение сигнала или, если сигнал уже запущен, остановить его вывод.
После выбора и пуска сигнала с помощью кнопок и ЖКИ, сигнал с флешки загружается в оперативку SRAM. По окончанию загрузки запускается режим воспроизведения сигнала, при котором ПЛИС в непрерывном цикле считывает сигнал из оперативки и выводит его на ЦАП.
Выборка из SRAM памяти идет побайтово, со скоростью 60 Мбайт/с, из чего формируются 16-битные числа на выходах ПЛИС со скоростью 30Мсемплов/с. Эти данные посылаются на ЦАП. ЦАП в данной схеме может работать в одноканальном и двухканальном режимах. В зависимости от режима сигнал на выходе ЦАПа формируется со скоростью 30Мсемплов/с в одноканальном и 15Мсемплов/с в двухканальном режиме. ЦАП был найден и установлен только 12битный, поэтому и разрешение выходного сигнала такое же, ничто не мешает поставить 14ти или 16ти битный ЦАП, если он у вас есть, конечно. С другой стороны с 12тибитным ЦАПом и амплитудой 2В мы получаем шаг по напряжению в 0,5 мВ, и вытащить из цифровой схемы сигнал с меньшим шумом уже постараться надо, да и в получившемся сигнале цифровые шумы существенно выше. Меня пока получившийся сигнал/шум устраивает.
SRAM имеет объем 512 Кбайт. Сигнал формируется 2хбайтными значениями. При этом максимально длинный сигнал имеет длительность 512*1024/(2*30 000 000) ? 87,4 мс т.е. частоту 114,4 Гц. Минимально короткий сигнал (меандр) генерируется из двух значений, на частоте равной половине частоты выборки, т.е. 15МГц в одноканальном режиме, 7,5МГц в двухканальном. Если задать сигнал только из одного значения, то в аналоговой части будет выводиться постоянное напряжение.
Софт.
На компьютере сигнал формируется в виде txt файла. Первая строка - имя сигнала. Остальные строки разбиты на столбцы (два столбца для одноканального сигнала, три столбца для двухканального сигнала) разделенные запятой или табуляцией.
Name
0,2048,4095
1,2403,3972
2,2748,3616
3,3072,3072
4,3364,2403
5,3616,1693
6,3821,1025
7,3972,480
8,4064,124
9,4095,1
Формировать сигнал можно в любой подходящей программе, например, Excel или Origin. Первый столбец содержит номер двухбайтной выборки, в остальных столбцах находится уровень сигнала соответствующий этой выборке в десятичном формате. При открытии программой сигнал рисуется в окне. При записи в устройство необходимо задать имя сигнала, которое будет выводиться на ЖКИ. Затем сигналы загружаются в SD через ft232 и микроконтроллер Atmega8 на скорости 150 000 бит/с.
Также сигнал можно считать из флешки для отображения в окне программы. Команда старт/стоп запускает или останавливает сигнал.
После выбора сигнала с помощью кнопок управления, либо с помощью программы, происходит загрузка сигнала с SD памяти в SRAM. Туда же загружается и длина сигнала. После загрузки идет воспроизведение. Адрес выборки постоянно сравнивается в ПЛИС с длиной сигнала, при совпадении ПЛИС повторяет вывод сигнала с начала.
Важно: в двухканальном режиме количество выборок на каждый канал одинаково.
В зависимости от N-канальности сигнала на ЦАП формируются соответствующие синхросигналы.
В принципе возможно использование синтезатора как шестнадцатиканального генератора цифровых последовательностей. Только удобоваримый софт написать надо, чтобы отображал сигналы удобно для просмотра.
Фото:
Тонкости:
Долго возился с корректным выводом синхросигналов на ЦАП в двухканальном и одноканальном режимах. Обязательно в каком-либо из режимов или в обоих сразу проскакивали иглы, некорректные значения на ЦАПе в течение одной выборки. Пришлось организовать различную генерацию синхросигналов на ЦАП для каждого режима. Так как синхросигналы имеют длительность десятки наносекунд, возможно, что при повторении схемы, например с другими ПП, ПЛИС, ЦАП, придется вновь повозиться с этой проблемой.
Раздельные питания для аналоговой и цифровой части ЦАП. Землю на аналоговую часть лучше вывести отдельным проводником прямо с разъема блока питания. Естественно везде, где можно и где нельзя, ставим на питание фильтрующие емкости, как можно ближе к самим микросхемам.
Кушает синтезатор много: 250 мА в стоп-режиме и 350 мА в генерящем без нагрузки, поэтому не рекомендую запитывать его от USB порта, лучше отдельный блок питания.
Вместо SD каточки я припаял переходник на microSD с карточкой.
Длина каждого сигнала в SD памяти равна максимально возможной 512кБайт. Никакая файловая система не используется, поэтому записывать сигналы на карточку с компьютера в виде файлов нельзя
Сигнал во флешке хранится в след формате:
32байта - имя сигнала
3байта - длина сигнала в байтах + 4 (младший байт первый)
1 байт - тип сигнала (пока использован только один бит определяющий двухканальный или одноканальный сигнал)
2 байта - первая выборка сигнала, младший байт первый.
2 байта - вторая выборка
и т.д.
При прошивке МК лучше всего SD карту вынимать, т.к. она использует тот же SPI интерфейс, а программатор может выдавать и 5тивольтовые сигналы.
Несмотря на то, что ЖКИ запитан от 5ти вольт, он хорошо воспринимает сигналы с лог.1 = 3,3В, поэтому несмотря на то, что контроллер запитан от 3,3 В, чтобы корректно работать с SD карточкой и ПЛИС, согласования уровней с ЖКИ не требуется.
Выкладываемые платы редактировались по мере нахождения ошибок в изготовленной (см. фото), таким образом кварцевый генератор благополучно перевернулся на нужную сторону платы, не как на фото, было убрано множество перемычек, но немало и осталось.
Тем не менее, внимательно посмотреть на неё свежим взглядом не помешает.
Платы сделаны ЛУТом.
Недостатки:
Огромный минус в том, что полностью реализованы все ресурсы ПЛИС. Хотелось бы впихнуть ещё делитель тактовой частоты, тогда низкочастотная граница существенно расширилась бы. Также можно было бы реализовать разовое воспроизведение сигнала, когда сигнал из оперативной памяти выводился не циклически, а только один раз по нажатию кнопки "старт". Сделать это несложно, добавив в тип сигнала ещё один бит и останавливая вывод сигнала если бит установлен.
По всему по этому для повторений устройства рекомендую использовать ПЛИС с бОльшим ресурсом логических ячеек.
Заняты все ножки микроконтроллера, некуда навесить сигнализирующие светодиоды и дополнительные кнопки. Опять для повторения рекомендую использовать МК с бОльшим числом ножек.
Выходной каскад ЦАП лучше буферизировать или гальванически развязать с помощью согласующего трансформатора (см. даташит на ЦАП), т.к. без развязки по земле проходят большие цифровые шумы.
Синтезатор сделан в единственном экземпляре и повторяемость устройства неизвестна.
В двухканальном режиме количество выборок на каждый канал одинаково. Поэтому сигналы не произвольны по периоду друг относительно друга. Для обеспечения абсолютно произвольных сигналов нужно взять два комплекта ПЛИС+оперативка и микроконтроллером раздавать два сигнала в две оперативки, а потом независимо выводить их на каналы ЦАПа.
Ещё один недостаток, который автор обнаружил уже после изготовления устройства в том, что они уже есть на рынке :), в том числе и в ассортименте одного из спонсоров этого конкурса - фирмы Hantek. Хотя характеристики промышленного производимого экземпляра отличаются не только в лучшую сторону, например, я видел только одноканальные синтезаторы.
Файлы:
Печатная плата в формате Proteus.
Прошивка МК с исходником.
Прошивка ПЛИС.
Софт для числодробилки.
Примеры сигналов.
Вопросы, как обычно, складываем тут.