Аппаратура SDR (Software-defined Radio), как и следует из названия, представляет собой программно-аппаратный комплекс. В предыдущих частях цикла были рассмотрены преимущественно аппаратные решения радиотракта трансивера Selenite Lite. В большей части данной публикации будет рассмотрена та часть радиостанции, которая предназначена для управления «Radio» и его связи с «Software».
Речь пойдёт о контроллере, на котором реализовано составное устройство USB, включающее в себя звуковое устройство USB и виртуальный COM-порт. Данная конфигурация позволяет управлять трансивером извне по CAT-интерфейсу и производить обмен аудиопотоками с программой, которая производит обработку сигналов для работы в эфире.
Все части цикла статей о создании любительской радиостанции:
▍ Контроллер трансивера Selenite Lite
На рисунке выше приведён практически «минимальный набор» компонентов контроллера, необходимый для работы 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 синтезатора здесь используются в качестве источника тактовой частоты контроллера. Кроме экономии средств это даёт неочевидные преимущества, которые мы сейчас рассмотрим.
На рисунке выше приведена схема тактирования MCU. Выбор частоты HSE, равной 24576 кГц, может показаться странным, но имеет вполне резонное обоснование.
Радиостанция SDR является аппаратурой прямого преобразования только в её «аналоговой» части. Если проследить путь выделенного QSD аналогового сигнала ЗЧ, то он далее подаётся на вход кодека, который преобразует его сначала в отсчёты (samples, частота дискретизации 96 кГц), затем в битовый поток интерфейса I2S (тактовая частота 3072 кГц), а затем – в битовый поток интерфейса USB (тактовая частота 12 МГц). Кроме того, для нормальной работы кодека с потоком 96К, на него должен поступать сигнал MCLK с частотой 24576 кГц.
На радиоприёмный тракт трансивера всё вышеперечисленные сигналы оказывают достаточно серьёзное воздействие. Ситуация усугубляется ещё и тем, что все эти сигналы взаимодействуют по принципу «все со всеми» и за счёт «биений частот» могут создавать сильные широкополосные помехи.
Теперь, если произвести калибровку задающего генератора синтезатора с помощью частотомера или методом, описанным в публикации «Радиолюбительские измерения: когда нет частотомера», то мы сразу получим точную установку частоты не только квадратурного гетеродина, но и всех тактирующих сигналов контроллера.
Решение получилось достаточно необычным: затраты на оборудование сократили, но при этом избавились от ряда интерференционных помех. Благодаря этому решению количество «поражённых точек» радиотракта было сокращено до четырёх: 12000, 12288, 24000 и 24576 кГц. Другие точки есть, но они не так заметны, особенно при работе с хорошей внешней антенной.
▍ Расширение функциональности MVP
Как уже говорилось выше, даже в «минимальный набор» контроллера входят компоненты, добавленные туда «на вырост». На рисунке ниже представлено «расширение» контроллера:
В первую очередь, это оборудование для организации пользовательского интерфейса (UI): TFT-дисплей 2.4” HL1 с разрешением 320х240 точек на дюйм, инкрементный энкодер S6 и кнопочная клавиатура S1…S5.
Дисплей подключён к интерфейсу SPI1, сигналы энкодера обрабатываются с помощью таймера TIM2, выход клавиатуры подключён к встроенному АЦП (ADC) микроконтроллера.
«Расширенный» вариант контроллера предусматривает также управление режимом внешнего усилителя мощности (PA) подачей туда сигнала TX через оптронную развязку U3 и данных по интерфейсу I2C через буфер шины PCA9515A.
Микросхема EEPROM DD3 с управлением по интерфейсу I2C включена в набор совсем «на вырост».
▍ Квадратурный модулятор
Благодаря решению разработать универсальную печатную плату для всех исполнений трансивера Selenite Lite и разместить органы управления непосредственно на ней, на плате осталось достаточно места для размещения квадратурного модулятора (QSE).
Схема квадратурного модулятора приведена на рисунке выше и представляет собой смеситель по схеме Тэйло «наоборот». Отличие данного решения от «традиционных» заключается в отсутствии в цепях формирования сигналов четырёх инвертирующих усилителей на ОУ. Схему удалось упростить благодаря наличию у кодека дифференциальных каскадов на выходе ЦАП (DAC), которые формируют четыре сигнала со сдвигом фаз 0°, 90°, 180°, 270° без всякой дополнительной «обвязки».
Выходы микросхемы DD6 подключены через резисторы R33, R34 к тому же широкополосному ВЧ-трансформатору TR1, что и микросхема DD5 приёмного смесителя (QSD) трансивера. Выводы 1A и 2A микросхемы DD5 подключаются к трансформатору при низком уровне сигнала QSD_EN. Выходы DD6 – при низком уровне сигнала QSE_EN.
На максимальном уровне сигнала однотонального генератора из состава программы HDSDR на нагрузку 50 Ом, подключённую к антенному разъёму платы, QSE трансивера выдаёт мощность порядка 0.125 Вт на всех любительских диапазонах, кроме 160 м (0.080 Вт)
▍ Встроенное ПО контроллера
Встроенное ПО контроллера разработано в среде STM32CubeIDE с использованием библиотеки HAL. Исходный код проекта расположен по адресу: https://github.com/dmitrii-rudnev/selenite-lite
Программное обеспечение проекта организовано по блочно-модульному принципу. При запуске 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-кодек
Автор: Дмитрий Руднев