Давно интересовал вопрос использования 16-битного АЦП STM32H7 для обработки I/Q сигналов в реальном времени.
Почти год ушел на эксперименты и реализацию КВ SDR приемника на базе Tayloe mixer и MCU STM32H723ZGT6, и вот что у меня получилось: принимаемый КВ диапазон 1...30МГц, вывод обработанного аудио через внутренний 12-битный ЦАП или вывод I/Q потока на ПК через UAC1.

Четырехслойная плата, размером 100х60мм, спроектирована таким образом, что не задействованные пины MCU выведены на PLS разъемы, для дальнейшего расширения проекта

Входная часть построена на детекторе Тейло

пробовал и схемы с трансформаторами, в том числе и с балансным включением, особых изменений не заметил. Пока остановился на данном варианте, но и он не лишен недостатка, разность в чувствительности между 160m и 10m диапазонами примерно 1..2dB, соответственно на десятке слабее.
С выхода смесителя на ключах сигналы поступают на инструментальные операционные усилители, которые обеспечивают хорошее подавление синфазных помех, и далее на активный ФНЧ 4-го порядка выполненный на ОУ по схеме Саллена-Ки

АЧХ ФНЧ, на картинке модели двух вариантов, 48кГц и ~24кГц

по факту такого ФНЧ оказалось не совсем достаточно, дело в том, что по краям спектра с полосой 48кГц, просматриваются алиасы от сильных сигналов на частотах примерно +/- 25..30 kHz от нулевой частоты после оцифровки. Но так как основная обработка сигнала выполняется вблизи нулевой частоты, с этим недостатком можно смириться!
Далее сигналы идут непосредственно на входы АЦП STM32H723ZGT6.
Ключевой смеситель тактируется дешевым генератором Si5351 с частотой х4

Код программы MCU написан в среде STM32CubeIDE, используются библиотеки HAL, TinyUSB (составное USB устройство) и CMSIS-DSP (цифровая обработка сигнала) входящей в состав STM32CubeMX. Почему HAL? А потому, что использование HAL это быстрый вход в разработку приложений на MCU STM32!
На дисплее отображается текущая частота настройки, активность AGC/NOTCH, уровень принимаемого сигнала по шкале S-metr, спектр водопада в полосе +/-24 kHz от нулевой частоты, ноль — это центр спектра водопада, на спектре отображаются границы полосы пропускания при демодуляции. В нижней части дисплея отображаются режимы функциональных трех кнопок. При подключении по USB к ПК, спектр водопада и уровень сигнала S-metr, не отображаются, выводится соответствующая надпись на дисплее

Все настраиваемые параметры хранятся во внешней флеш-памяти.
Управление осуществляется механическим энкодером с кнопкой, и тремя функциональными кнопками.
При подключении устройства к USB компьютера, в системе определяется составное USB устройство, COM порт, и аудио устройство записи.
Осваивал ЦОС сначала с разработки приложения на C# для оценки/обработки сигналов с АЦП STM32H723

Приложение позволяет анализировать не только сырые данные I/Q, но и WAV файлы с I/Q сигналами.
На том же C# был написан генератор I/Q сигналов

Режим работы АЦП MCU выбран как два независимых АЦП1/2, но тактируются они одним сигналом триггера таймера 8 с частотой 48 kHz, хотя в STM32 есть парный режим работы АЦП — Dual mode. Как утверждает документация от ST, в данном режиме выборка данных с двух АЦП происходит в один момент времени, но как я не бился с данным режимом, постоянно получал линейное увеличение зеркала сигнала при уводе частоты сигнала от нуля. Либо я читаю документацию поперек, либо что-то другое, чего я еще не знаю!
После оцифровки к сигналу применяются коррекции: DC — удаление постоянной составляющей, амплитудная и фазовая коррекции, коэффициенты этих коррекций, кроме DC для каждого диапазона свои. После коррекций сигнал отправляется в кольцевой буфер, далее в режиме подключения по USB к ПК сигналы I/Q отправляются в UAC1 для обработки на ПК, а в автономном режиме работы (без ПК), сигналы I/Q обрабатываются в MCU, выполняется быстрое преобразование Фурье (FFT) для спектра водопада, демодуляция SSB/CW, затем применяется АРУ и/или NOTCH фильтр, и в завершении своего цифрового пути, сигнал отправляется на внутренний ЦАП (цифро-аналоговый преобразователь), выход ЦАП внутри MCU направлен на внутренний операционный усилитель OPAMP1 который работает в качестве буфера, далее через простой RC ФНЧ, выполненный на R45 и C75, сигнал уже снимается либо на наушники, либо можно подать на аудио УМ для использования динамика. Вот как выглядит сигнал с внутреннего 12-ти битного ЦАП без RC ФНЧ и с RC ФНЧ


Внутренний ЦАП MCU тактируется тем же триггером таймера 8 что и АЦП. Внутренний ЦАП имеет разрядность 12 бит. Но если не быть аудиоманом, этого вполне достаточно для комфортного прослушивания как радиолюбительских так и вещательных КВ станций. Проводил эксперименты с подключением внешнего дешевого, но очень не плохого ЦАП на базе PCM5102 выполненного в виде отдельного модуля

тут уже разрядность можно использовать от 16 до 24 бит, и соответственно звук даже в варианте 16 бит на выходе этого ЦАП более приятный для восприятия.
Фрагменты кода ЦОС, есть у меня на сайте. Там же и история проекта.
Дальше планирую кроме оптимизации наработанного, перейти и к передающей части!
В завершении данного повествования видео работы моего стенда, в ролике три сцены: работа приложения, автономная работа на внутренний ЦАП любительский диапазон 40м и вещательный диапазон 41м, сигнал с антенны CW40100, подается напрямую на вход смесителя без ДПФ.
Тут несомненно есть еще над чем работать!
73!
Комментарии (10)

vv_kuznetsov
03.04.2026 17:34Интересный проект. По идее должен работать лучше, чем uSDR и ему подобные. Я примерно два года назад экспериментировал с uSDR-PICO, но удовлетворительных результатов не добился. АЦП встроенный в МК для реализации SDR всё же не годится. В итоге uSDR-PICO уступает аналоговому аппарату за ту же цену по всем параметрам. Основная проблема была в шуме при приёме. Встроенный АЦП RP2040 видимо плохо подходит для реализации SDR. Про мои эксперименты можно почитать здесь: http://qrp.ru/forum/9-Самодельная-техника/13479-SDR-трансивер-uSDR-PICO Cуществует ещё проект MBPTRX от VK7IAN, где также используется RP2040 и отдельная микросхема кодека: https://github.com/ianm8/MBPTRX

R9OFG Автор
03.04.2026 17:34Есть документ AN5354 от ST про 16-битные АЦП в STM32H7 серии, он и заинтересовал. Звучит очень достойно даже на внутренний ЦАП, все же на радиолюбительских участках мы не Моцарта в консерватории слушаем))) Рядом, для сравнения, стоит аналоговый STEP-II, ни какого криминала в работе SDR стенда не заметил. Кто из них лучше/хуже, тут сравнение не совсем корректное, по шуму одинаково, по чувствительности тоже +/-, но из-за применения цифровых фильтров при децимации/демодуляции SDR тут впереди без сомнений.
Кстати проблему алиасинга уже поборол, подняв частоту оцифровки АЦП с 48кГц до 96кГц и применив правильную децимацию с фильтрацией.
Планирую из всего этого сделать карманный КВ трансивер для полей. Уже начал эксперименты с полярной модуляцией SSB, по аналогии с uSDX, но только у них 8кГц, а я пробую на 48кГц, вот видео первого эксперимента.

alcotel
03.04.2026 17:34Мощно!
По схеме пара вопросов интересны:
= Вроде же во взятом мк внутри есть свои синтезаторы частоты. Или они слишком грязные?
= Выходы триггеров расщепителя фазы на U9 по идее должны быть одинаково нагружены, иначе задержка поползёт. Или это не так критично?
= с аудио-кодеком имхо удобнее, потому что антиалайзинговые фильтры встроены. И гораздо лучшего качества, чем на рассыпухе. И на выход можно сигнал забайпасить. Да и дифференциальные входы тоже имеются.
R9OFG Автор
03.04.2026 17:34ШИМ? Можно получить и 30МГц но из за целочисленных значений PSC/ARR таймеров от точности даже в 1кГц можно только мечтать!
Не заметил криминала.
Конечно с аудио-кодеком удобнее, но интересно было реализовать на внутренностях стмки.

alcotel
03.04.2026 17:34Встроенный в мк дробный ФАПЧ вполне может заменить внешний U8. Может быть и ШИМ к этому подключить можно, но по описанию я навскидку ничего полезного не нашёл.
Внутри одного чипа можно считать, что задержки сигналов идентичны. Но выход QSD-1 нагружен на один вход, а выход QSD-0 - на два. Это даёт лишнюю разность задержек, и сигналы I/Q перестают быть линейно независимыми. Не считал, на сколько здесь это критично, но обычно стараются каналы I/Q делать по-максимуму одинаковыми.
Если уж делать на внутреннем АЦП, я бы поднял частоту дискретизации, и окончательную фильтрацию сделал уже в цифре. Камень-то достаточно мощный, и опять же идентичность каналов была бы лучше. И входы АЦП сразу дифференциальные!

R9OFG Автор
03.04.2026 17:341-2: надо перечитать доку, оценить возможности.
3: И так поднял х2, как писал выше в комментариях, тем самым поборол алиасинг FIR-ом перед децимацией. Можно и выше попробовать. Тут как, если подавать на входы ацп идеальный IQ с точным балансом 0/90 по фазе и равностью амплитуд, криминала вообще нет, а если с аналоговой части, то конечно необходима коррекция.
RezonanS1
Интересный проект, развлекался тоже лет 10 назад подобным образом. Правда на pic24, и с 10 битными встроенными ацп. Схема в принципе такая же. Сишка по-моему если память не изменяет может 0/90 выдавать. Можно без триггеров.
R9OFG Автор
Сишка да, может фазу менять, но на высоких частотах там нет точно 0/90.