![](https://habrastorage.org/webt/rp/ex/lr/rpexlrxdol8qrgslmhv32imkoyu.jpeg)
Аппаратура SDR (Software-defined Radio), как и следует из названия, представляет собой программно-аппаратный комплекс. В предыдущих частях цикла были рассмотрены преимущественно аппаратные решения радиотракта трансивера Selenite Lite. В большей части данной публикации будет рассмотрена та часть радиостанции, которая предназначена для управления «Radio» и его связи с «Software».
Речь пойдёт о контроллере, на котором реализовано составное устройство USB, включающее в себя звуковое устройство USB и виртуальный COM-порт. Данная конфигурация позволяет управлять трансивером извне по CAT-интерфейсу и производить обмен аудиопотоками с программой, которая производит обработку сигналов для работы в эфире.
Все части цикла статей о создании любительской радиостанции:
▍ Контроллер трансивера Selenite Lite
![](https://habrastorage.org/webt/d7/cr/db/d7crdbcazcltbfmrbgzkygclz8o.jpeg)
На рисунке выше приведён практически «минимальный набор» компонентов контроллера, необходимый для работы MVP проекта «Селенит». Из схемы можно исключить ещё несколько компонентов, например, «часовой кварц» с батарейкой, которые оставлены «на вырост».
В «минимальный набор» входит MCU STM32F411CEU6, аудиокодек TLV320AIC3104IRHB и синтезатор частоты Si5351A-B-GT. Схемы включения всех этих микросхем совершенно стандартные. Обмен аудиопотоками между MCU и кодеком осуществляется по интерфейсу I2S2, управление кодеком и синтезатором производится по интерфейсу I2C3.
Переключение полосовых фильтров блока ДПФ производится сигналами S1 и S2. Переключение режимов «приём-передача» производится сигналами TX, QSE_EN и QSD_EN.
Разъём PTT (Push-To-Talk) предназначен для подключения телеграфного ключа или кнопки (педали) PTT, но при этом выполняет ещё две дополнительные функции. При загрузке контроллера с низким уровнем на любом из контактов разъёма PTT при подключении по USB контроллер определяется как устройство DFU. При загрузке MCU с высоким уровнем на входе BOOT0 к разъёму подключён UART1.
Питание контроллера осуществляется или от разъёма USB, или от внешнего источника +5В через контакты разъёма XS1. «Цифровая» и «аналоговая» части трансивера питаются от одной и той же микросхемы линейного стабилизатора напряжения +3.3 В, обозначенной на схеме как U1. Радиотракт трансивера и синтезатор «развязаны» по питанию от MCU через дроссели. Линейный стабилизатор напряжения U2 (+1.8 В) служит для питания «ядра» кодека.
Работа контроллера в качестве звукового устройства USB подробно разобрана в публикации: Звуковая карта USB на STM32. Часть 1: Используем I2S-кодек
Пример использования контроллера в качестве CAT-интерфейса радиостанции приведён в публикации: CAT-интерфейс для трансивера «Радио-76»
▍ Тактирование контроллера
Внимательный читатель уже заметил, что в схему контроллера включён синтезатор Si5351A-B-GT, работа которого в качестве генератора плавного диапазона была описана в предыдущей части цикла. Оставшийся свободным выход и вторая PLL синтезатора здесь используются в качестве источника тактовой частоты контроллера. Кроме экономии средств это даёт неочевидные преимущества, которые мы сейчас рассмотрим.
![](https://habrastorage.org/webt/b-/sk/1r/b-sk1rnymeixmnz0xefw4zuplke.jpeg)
На рисунке выше приведена схема тактирования MCU. Выбор частоты HSE, равной 24576 кГц, может показаться странным, но имеет вполне резонное обоснование.
Радиостанция SDR является аппаратурой прямого преобразования только в её «аналоговой» части. Если проследить путь выделенного QSD аналогового сигнала ЗЧ, то он далее подаётся на вход кодека, который преобразует его сначала в отсчёты (samples, частота дискретизации 96 кГц), затем в битовый поток интерфейса I2S (тактовая частота 3072 кГц), а затем – в битовый поток интерфейса USB (тактовая частота 12 МГц). Кроме того, для нормальной работы кодека с потоком 96К, на него должен поступать сигнал MCLK с частотой 24576 кГц.
На радиоприёмный тракт трансивера всё вышеперечисленные сигналы оказывают достаточно серьёзное воздействие. Ситуация усугубляется ещё и тем, что все эти сигналы взаимодействуют по принципу «все со всеми» и за счёт «биений частот» могут создавать сильные широкополосные помехи.
Теперь, если произвести калибровку задающего генератора синтезатора с помощью частотомера или методом, описанным в публикации «Радиолюбительские измерения: когда нет частотомера», то мы сразу получим точную установку частоты не только квадратурного гетеродина, но и всех тактирующих сигналов контроллера.
Решение получилось достаточно необычным: затраты на оборудование сократили, но при этом избавились от ряда интерференционных помех. Благодаря этому решению количество «поражённых точек» радиотракта было сокращено до четырёх: 12000, 12288, 24000 и 24576 кГц. Другие точки есть, но они не так заметны, особенно при работе с хорошей внешней антенной.
▍ Расширение функциональности MVP
Как уже говорилось выше, даже в «минимальный набор» контроллера входят компоненты, добавленные туда «на вырост». На рисунке ниже представлено «расширение» контроллера:
![](https://habrastorage.org/webt/-n/1i/km/-n1ikmmzqn5rqmry4jol6v-qkcw.jpeg)
В первую очередь, это оборудование для организации пользовательского интерфейса (UI): TFT-дисплей 2.4” HL1 с разрешением 320х240 точек на дюйм, инкрементный энкодер S6 и кнопочная клавиатура S1…S5.
Дисплей подключён к интерфейсу SPI1, сигналы энкодера обрабатываются с помощью таймера TIM2, выход клавиатуры подключён к встроенному АЦП (ADC) микроконтроллера.
«Расширенный» вариант контроллера предусматривает также управление режимом внешнего усилителя мощности (PA) подачей туда сигнала TX через оптронную развязку U3 и данных по интерфейсу I2C через буфер шины PCA9515A.
Микросхема EEPROM DD3 с управлением по интерфейсу I2C включена в набор совсем «на вырост».
▍ Квадратурный модулятор
Благодаря решению разработать универсальную печатную плату для всех исполнений трансивера Selenite Lite и разместить органы управления непосредственно на ней, на плате осталось достаточно места для размещения квадратурного модулятора (QSE).
![](https://habrastorage.org/webt/vo/11/bh/vo11bhp9wlquhyobkyoqtbtadoe.jpeg)
Схема квадратурного модулятора приведена на рисунке выше и представляет собой смеситель по схеме Тэйло «наоборот». Отличие данного решения от «традиционных» заключается в отсутствии в цепях формирования сигналов четырёх инвертирующих усилителей на ОУ. Схему удалось упростить благодаря наличию у кодека дифференциальных каскадов на выходе ЦАП (DAC), которые формируют четыре сигнала со сдвигом фаз 0°, 90°, 180°, 270° без всякой дополнительной «обвязки».
Выходы микросхемы DD6 подключены через резисторы R33, R34 к тому же широкополосному ВЧ-трансформатору TR1, что и микросхема DD5 приёмного смесителя (QSD) трансивера. Выводы 1A и 2A микросхемы DD5 подключаются к трансформатору при низком уровне сигнала QSD_EN. Выходы DD6 – при низком уровне сигнала QSE_EN.
![](https://habrastorage.org/webt/g5/eg/0t/g5eg0toa51zx7ostiuzno5cwwk8.jpeg)
На максимальном уровне сигнала однотонального генератора из состава программы HDSDR на нагрузку 50 Ом, подключённую к антенному разъёму платы, QSE трансивера выдаёт мощность порядка 0.125 Вт на всех любительских диапазонах, кроме 160 м (0.080 Вт)
▍ Встроенное ПО контроллера
Встроенное ПО контроллера разработано в среде STM32CubeIDE с использованием библиотеки HAL. Исходный код проекта расположен по адресу: https://github.com/dmitrii-rudnev/selenite-lite
![](https://habrastorage.org/webt/d-/qs/k-/d-qsk-rakagcap6pvi7gh7x_o1k.jpeg)
Программное обеспечение проекта организовано по блочно-модульному принципу. При запуске main.c производится инициализация компонентов библиотеки HAL и всех периферийных устройств, включая устройство FS USB. В процессе инициализации создаются глобальные переменные, включая переменную trx, предназначенную для хранения состояния трансивера и его текущих настроек.
Далее в бесконечном цикле производится запуск обработчика состояния интерфейса PTT (ptt_if.c), предназначенного для непосредственного управления радиостанцией: переключения режима «приём-передача», настройки частоты гетеродинов, переключения гетеродинов, переключения ДПФ и т.п.
Интерфейс CAT (cat_if.c) производит обмен данными с виртуальным COM-портом. Интерфейс DSP (dsp_if.c) предназначен для работы с кодеком и звуковым устройством USB. Интерфейс пользователя (user_if.c) служит для обработки состояния энкодера и клавиатуры, а также вывода информации на дисплей. Запуск обработчиков состояния этих интерфейсов (handlers) производится из ptt_if.c.
Исходный код проекта не содержит драйвер составного устройства USB, только виртуальный COM-порт. Связано это с тем, что изначально проект использовал версию STM32Cube FW_F4 V1.26.2. Текущая версия среды разработки от ST использует HAL версии STM32Cube FW_F4 V1.27.0 с другой структурой устройства USB и на предыдущую версию библиотеки вернуться не даёт.
Принципы объединения дуплексного звукового устройства USB и виртуального COM-порта в составное устройство USB подробно разобраны в публикации:
Составное устройство USB на STM32. Часть 4: Два-в-одном
Пример реализации CAT-интерфейса на STM32F411CEU6:
CAT-интерфейс для трансивера «Радио-76»
Надеюсь, кому-то более компетентному в программировании, чем я, удастся актуализировать проект под текущую версию HAL, и он поделится с миром результатом.
Обновление «прошивки» трансивера в штатном режиме производится через подключение по USB. Контроллер трансивера переводится в режим DFU нажатием на телеграфный ключ при включении питания.
▍От автора
Преимуществом трансивера Selenite Lite по сравнению с большинством других любительских SDR-радиостанций является управление по CAT-интерфейсу, а также наличие встроенной звуковой платы. Реализовано это на недорогих микроконтроллере и аудиокодеке.
Применение в качестве источника тактовой частоты «половинки» используемого, в качестве квадратурного гетеродина синтезатора, частоты Si5351A является нетривиальным решением, позволившим, с одной стороны, упростить конструкцию, но и с другой стороны, повысить качество обработки сигналов.
Размеры печатной платы трансивера во многом обусловлены размерами и взаимным расположением дисплея, клавиатуры и энкодера, которые включены в состав контроллера «на вырост».
Теперь о печальном…
Одним из главных мотивов забросить проект для меня была необходимость самостоятельной разработки программного обеспечения. И были на то обстоятельства неодолимой силы…
Попытки привлечь кого-нибудь из профессиональных программистов поработать над адаптацией готового open source ПО для трансивера mcHF под мой проект привели к тому, что все они вежливо отказались, но дали мне ряд ценных советов:
- Пользоваться Linux Debian.
- Подробно изучить Reference Manual конкретного MCU.
- Освоить, наконец-то, что-то объектно-ориентированное, например C++.
- Не пользоваться никаким IDE: только vim, make и CMSIS.
- Не отвлекать людей от работы, ибо всё есть в интернет.
Расчётные шесть человеко-месяцев на проект на глазах превращались в «десять лет без права переписки», и тогда я решил «стрелять себе в ногу».
Сначала я поставил на свой компьютер STM32CubeMX. Для MS Windows, естественно, и стал разбирать сгенерированный на HAL код и примеры для отладочных плат. Параллельно на этих примерах шло освоение синтаксиса Си. Так мне удалось самостоятельно «обвязать» всю «периферию».
Крепким орешком оказалось звуковое устройство USB, но и с ним удалось разобраться: спасибо romanetz_omsk и Andreas Richter (DF8OE).
Публикацией цикла про составное устройство USB я намеревался проект «Селенит» закрыть. Однако публикация имела резонанс, и я решил повременить с закрытием и приступить к разработке печатной платы опытного образца трансивера Selenite.
Ничто не предвещало… Но об этом, и о чудесном превращении трансивера Selenite в Selenite Lite читайте в следующей, заключительной части цикла.
Схема электрическая принципиальная, перечень элементов и рисунок печатной платы SDR-трансивера Selenite Lite содержатся в документе «Selenite Lite User Manual», расположенном в репозитории проекта «Selenite Lite».
Больше информации о проекте можно найти в некоммерческом telegram-канале «Проект «Селенит».
72/73! de RD9F
Источники:
1. Dan Tayloe. Ultra Low Noise, High Performance, Zero IF Quadrature Product Detector and Preamplifier
2. Поляков В.Т. Радиолюбителям о технике прямого преобразования – М.: Патриот, 1990
3. CAT-интерфейс для трансивера «Радио-76»
4. Составное устройство USB на STM32. Часть 4: Два-в-одном
5. Звуковая карта USB на STM32. Часть 1: Используем I2S-кодек
Скидки, итоги розыгрышей и новости о спутнике RUVDS — в нашем Telegram-канале ????
![](https://habrastorage.org/webt/4g/dr/oa/4gdroaajo7o0zzvwwx5__rlzhwi.png)
Комментарии (8)
sim2q
14.12.2023 21:45Радиотракт трансивера и синтезатор «развязаны» по питанию от MCU через дроссели
Не уверен на сколько это правильно, но в своих схемах всегда ещё и на VDD сразу около МК помимо ставлю дроссель, что бы ничего не расползалось по плате. В единичных поделиях это не напрягает. Но специально каких то измерений не делал. В старой бытовой технике схемы которые люблю рассматривать, некоторые цифросигналы уходящие "в аналог" ещё и специально замедляли RC или 20-30 Ом.
dmitriyrudnev Автор
14.12.2023 21:45Во вторник будет заключительная часть, где описано, как я потратил год на развязки и экранирование :(
Из забавного: по требованиям ST развязка по питанию быть должна, но для того, чтобы развязать VDD от помехи от PLL на выводе VDDA
N1X
14.12.2023 21:45Vdd от PLL, не наоборот? Просто всегда Vdd воспринимается как наиболее шумный домен, а на VDDA висит АЦП, в малоногих еще и Vref, и подсознательно это всегда воспринимается как что-то, что нужно фильтровать от Vdd, а не наоборот. Ваше сообщение заставило над этим задуматься...
dmitriyrudnev Автор
14.12.2023 21:45Вот картинка из datasheet от stm32f411. Весь "тактовый домен", включая PLL, запитан от VDDA:
dmitriyrudnev Автор
14.12.2023 21:45Ещё: между VDDA и VSSA по требованиям ST должны стоять "в параллель" керамические конденсаторы 1 мкФ и 0.1 мкФ, обычно так делают для развязки по питанию именно PLL
sim2q
14.12.2023 21:45Аж pdf скачал... буду встраивать stm32 (правда мелкий f0) в приёмник, заранее напрягаюсь относительно вот этого вот всего. Медный скотч вот выбираю:)
iggr63
Звучит немного архаично для программного обеспечения даже микроконтроллера. А что считается за программный блок в вашем случае?
dmitriyrudnev Автор
Коллега! Я с радостью приму Вашу помощь в разработке ПО для проекта любыми неархаичными методиками.
В 1989 году в рамках курса по микропроцессорной технике меня ознакомили с модульным принципом организации ПО на примере ОС UNIX. С тех пор я стараюсь его придерживаться.
Модуль в этой концепции выполняет одну функцию. Блок выполняет требования назначения, для реализации которых может содержать несколько модулей. Блок удобно реализовать неким "ядром" с интерфейсом связи с подчинёнными модулями и другими функциональными блоками для создания системы, которую тоже можно рассматривать как блок и т.д.
Поскольку, помощи в создании ПО я не получал, то действовал, как меня учили в институте