Аппаратура 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-кодек
Скидки, итоги розыгрышей и новости о спутнике RUVDS — в нашем Telegram-канале ????
Комментарии (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. С тех пор я стараюсь его придерживаться.
Модуль в этой концепции выполняет одну функцию. Блок выполняет требования назначения, для реализации которых может содержать несколько модулей. Блок удобно реализовать неким "ядром" с интерфейсом связи с подчинёнными модулями и другими функциональными блоками для создания системы, которую тоже можно рассматривать как блок и т.д.
Поскольку, помощи в создании ПО я не получал, то действовал, как меня учили в институте