Anvelina PRO III: Завершение v2.2.14Final

Автор: | 04.07.2026

Anvelina PRO III: Завершение v2.2.14Final. Физика АЦП, сетевые «призраки» и уроки честного инжиниринга

В прошлой статье мы провели масштабную «хирургию» DSP-тракта: переписывали модули насыщения, убирали артефакты водопада и добавляли TPDF-дизеринг. Но настройка трансивера — это не только цифровая обработка сигналов. После того как «сердце» (DSP) забилось ровно, пришло время привести в порядок «периферию»: точность измерений мощности, стабильность сетевого стека и чистоту самого RTL-кода.

В этом отчете я расскажу, как мы боролись с завышением мощности на НЧ-диапазонах, почему «лечение» косметических предупреждений компилятора может сделать хуже, и как выглядит финальная сборка версии 2.2.14Final.

1. Загадка «лишних ватт» на НЧ-диапазонах

Симптом. После настройки DSP пользователи заметили интересную особенность: на высоких диапазонах (20м и выше) показания мощности в Thetis были идеальны. Но чем ниже мы опускались (40м, 80м, 160м), тем больше трансивер «завышал» мощность. На 160 метрах при реальных 100 Вт индикатор мог показывать около 110 Вт. На 40м погрешность была меньше, около 5 Вт.

Физика проблемы: «Эхо» в мультиплексоре АЦП. Корень проблемы лежал не в софте, а в «железе» — в микросхеме АЦП ADC78H90. Это 8-канальный АЦП последовательного приближения (SAR), который опрашивает наши датчики (FWD, REV, ток, напряжение и т.д.) по очереди через внутренний мультиплексор.

У любого SAR-АЦП внутри есть конденсатор (около 25 пФ), который накапливает заряд для измерения. Когда мы переключаемся с канала, где было высокое напряжение (например, датчик тока на 160м, где токи большие), этот конденсатор не успевает полностью «успокоиться» за отведенное время. Остаточный заряд «отравляет» следующее измерение. В datasheet TI об этом написано прямо: «при переключении каналов первый отсчет отражает старый канал».

Получалось, что измерение мощности «ловило эхо» от предыдущего измерения.

Решение на уровне FPGA (Orion_ADC.v). Мы изменили логику опроса в модуле Orion_ADC.v. Теперь каналы FWD и REV (которые отвечают за мощность) опрашиваются дважды подряд.

  • Первое преобразование (flush): сбрасывает «эхо» с внутреннего конденсатора АЦП. Этот результат мы отбрасываем.
  • Второе преобразование (чистое): возвращает честное значение, которое уже идет в расчеты.

Скорость опроса самих мощностных каналов не упала (они всё так же ловят пиковые значения), а вот V/I/Exciter/Supply стали опрашиваться на 25% медленнее. Но поскольку это медленные DC-сигналы (постоянное напряжение и ток), такая задержка абсолютно некритична.

Решение на уровне софта (Thetis): Per-band калибровка

Даже с идеальным АЦП (после dummy conversion) остался один физический нюанс: сам tandem-match детектор на плате имеет частотную зависимость. Это нормально! Даже на одинаковых экземплярах Anvelina PRO III цифры будут немного отличаться — влияет разброс параметров компонентов детектора, длина дорожек, паразитные емкости.

Раньше в Thetis была только глобальная калибровка. Мы добавили пополосную (per-band) калибровку детектора. В меню Setup → PA Settings появилась новая вкладка «Det. Cal.». Для каждого диапазона (от 160м до 6м) можно задать свой множитель k (от 0.50 до 2.00, шаг 0.01).

Рис. 1. Вкладка «Det. Cal.» в настройках Thetis. Видно откалиброванные значения для НЧ диапазонов (160м: 0.91, 80м: 0.92, 40м: 0.96). Кнопка «Reset to Defaults» позволяет мгновенно сбросить все настройки к 1.00.

Как это работает для пользователя:

  1. На 20м диапазоне оставляем множитель 1.00 (он становится эталоном).
  2. Переходим на 160м, подаем 100 Вт (по внешнему ваттметру). Если Thetis показывает 110 Вт, мы вписываем в поле 160м множитель 0.91 (100 / 110 = 0.91).
  3. Формула в софте теперь выглядит так: Watts = V² · k / bridge_volt.

Кнопка «Reset to Defaults» позволяет мгновенно сбросить все множители к 1.00 — это очень удобно для отката или если вы хотите начать калибровку заново.

Важный технический момент: множитель k применяется одновременно и к прямой (FWD), и к обратной (REV) мощности. Поскольку КСВ (SWR) вычисляется как корень из отношения Rev/Fwd, множитель k в формуле сокращается. КСВ не изменится, что абсолютно физически корректно!

Даже без калибровки (со значениями по умолчанию 1.00) точность измерений стала лучше, чем в предыдущих версиях — благодаря исправлению crosstalk в АЦП. Но если вы хотите идеальной точности на всех диапазонах — потратьте 10 минут на калибровку с внешним ваттметром.

2. Сетевые «призраки»: охота на ложные Sequence Errors

Симптом. При быстром переподключении Thetis к трансиверу (разорвать и сразу соединить кабель или перезапустить софт) иногда «проскакивала» ошибка последовательности пакетов (Sequence Errors). Счетчик ошибок в интерфейсе начинал расти, хотя звук и управление работали идеально.

Изначально проблема казалась простой: при переподключении софт сбрасывает счетчик пакетов в ноль, а FPGA «помнит» старое состояние. Мы начали с простого фикса: добавили флаг first_pkt, который игнорировал ошибку на самом первом пакете. Но на практике, при очень быстром reconnect, Thetis не всегда успевал сбросить таймаут, и «призрак» оставался.

Тогда мы применили комплексный подход (Решения A+B+C):

  • Отравление старого состояния (Poison): При обрыве связи старый номер пакета принудительно устанавливается в 0xFFFFFFFF. Любое новое число гарантированно не совпадет со старым «мусором».
  • Детектор «шага назад»: Если Thetis при переподключении начинает слать пакеты с номера 0, а FPGA ждет продолжения старой последовательности, мы понимаем, что это reconnect, а не ошибка.
  • Окно доверия (Grace Window): Мы дали соединению «право на ошибку». Первые 3 пакета после переподключения FPGA просто пропускает (считает, что идет «рукопожатие» и синхронизация счетчиков), и только начиная с 4-го пакета включает строгий контроль монотонности.

В процессе Quartus выдал предупреждение, что регистр seq_locked «присваивается, но не читается» (ошибка 10036). Мы быстро переписали условие, и теперь этот регистр служит еще и статусным флагом: «синхронизация установлена». Счетчик ошибок теперь ведет себя безупречно.

3. Честный инжиниринг: когда «лечение» делает хуже

В нашем сообществе принято делиться не только успехами, но и ошибками. В процессе аудита Ethernet-подсистемы мы столкнулись с классической ситуацией: попыткой убрать косметическое предупреждение компилятора, мы едва не сломали архитектуру.

Эксперимент с тактовой частотой 2.5 МГц. Компилятор Quartus выдавал несколько предупреждений (код 15064) о том, что тактовая частота 2.5 МГц (которая нужна для MDIO и SCK) идет не через выделенную глобальную сеть, а через обычную логику. Мы попробовали сгенерировать эти 2.5 МГц не через PLL (аппаратный синтезатор частот), а обычным цифровым счетчиком в коде Verilog. Результат: Да, предупреждение 15064 ушло. Но Quartus тут же выдал десятки новых предупреждений (серии 332000), потому что счетчик тактировал FSM-машины через обычную трассировку. Мы поменяли «шило на мыло». Откатили изменения. PLL дает чистый глобальный клок, а джиттер на 2.5 МГц физически не важен. Предупреждение 15064 мы просто приняли как косметическое.

Эксперимент с задержками Ethernet (RGMII). Мы попытались назначить входные задержки (INPUT_DELAY_CHAIN) для пинов Ethernet. Результат: Компилятор проигнорировал наши настройки (WARNING 171167). Оказалось, что в семействе Cyclone IV E просто нет программируемых per-pin задержек на входах. Это фича более старших семейств (Arria, Cyclone V). В Cyclone IV E компенсация делается либо на уровне самого PHY-чипа, либо фазой тактового сигнала. Наша ошибка — мы не проверили спецификацию конкретного семейства ПЛИС до внесения правок.

Что осталось от аудита: Мы удалили «мертвый код» из модуля rgmii_recv.v. Там была логика для 100-мегабитного режима, которая никогда не использовалась (наш дизайн работает только в Gigabit). RTL-код стал чище, короче и понятнее, а поведение не изменилось.

Итоги версии 2.2.14Final

Финальная сборка AnvelinaPROIII_1000T_2.2.14Final закрыта по таймингу (Timing slack +1.190 ns, 0 violations).

Что мы имеем в сухом остатке:

  • Чистый DSP: Насыщение работает корректно, водопад линеаризован TPDF-дизерингом, убраны артефакты.
  • Честная мощность: АЦП больше не «фонит» сам на себя, а в Thetis появилась удобная пополосная калибровка для учета физики детектора.
  • Стабильная сеть: Ложные ошибки последовательности при переподключениях полностью устранены.
  • Аккуратный код: Удален мертвый код, откатаны ошибочные архитектурные решения, код стал соответствовать возможностям именно Cyclone IV E.

Проект Anvelina PRO III продолжает свое плановое эволюционное развитие. Прошивка протестирована на железе и готова к повседневной работе в эфире.

Обратная связь: Коллеги, если будете тестировать новую вкладку «Det. Cal.» в Thetis, делитесь впечатлениями! Насколько удобным получился интерфейс калибровки? Ждем ваших отзывов на форуме OpenHPSDR.

Скачать прошивку 2.2.14Final можно тут: https://eu2av.net/download/file.php?id=2062

73!
Юрий (EU2AV)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *