DUC-DDC ТРАНСИВЕР UA3REO: РЕЛИЗ ВЕРСИИ 1.4

Очередное обновление проекта в программной части.


Вся история разработок доступна в этой ветке статей по посвящённой разработке трансивера UA3REO.

В этой версии все изменения касаются только прошивки, не затрагивая аппаратную часть, среди них (по сравнению с версией 1.3):

+FPGA: При умножении в микшере RX отброшен неиспользуемый бит, сокращение ресурсов, увеличение чувствительности | Thx to Genadi Zawidowski

При умножении чисел 12 на 12 бит, старший бит всегда дублирует предыдущий. Поэтому в CIC мы можем работать не с 24 битным числом, а с 23. Что заметно улучшает чувствительность и сокращает используемые ресурсы FPGA.

+FPGA: Улучшена работа CIC модулей, улучшена чувствительность

CIC переклчен в режим Truncate, что также дало улучшение чувствительности приёмного тракта.

+FPGA: При переключении TX/RX неиспользуемые модули отключаются

В FPGA реализован механизм, отключающий CIC, компенсаторы и прочие модули тракта, если они в данный момент не используются в работе. В теории это даёт снижение динамического энергопотребления.

+STM32: CW мода режим TX

Реализован режим передачи для CW(морзе).

+STM32: Управление CW ключом через DTR линию Debug порта

Т.к. пока нет физического порта подключения ключа, телеграфом можно работать используя компьютер с соответствующим ПО.

+STM32: Таймаут передачи после отпускания ключа (от дребезга реле)

При переходе в режим передачи происходит небольшая задержка в 10мс, чтобы все реле успели сработать и запустить усилитель.

+STM32: Заполнение LCD цветом и отрисовка квадратов происходит через DMA

Работа с LCD экраном заметно ускорилась, т.к. все трудоёмкие операции возложены на отдельный контроллер прямого доступа к памяти, который освобождает процессор для выполнения других задач.

+STM32: Расширение поддержки CAT комманд | Thx to RA4ASN

Добавлены некоторые CAT команды, без которых некорректно работал софт WSJT-X.

+STM32: Оптимизирована работа системного меню

Код системного меню переписал, что упростило его поддержку и развитие, ускорило вывод элементов на экран.

+STM32: Усреднение FFT против резких всплесков сигналов | Thx to RA4ASN

При выводе FFT берётся среднее из двух последних выборок, что позволяет избежать резких всплесков от помех и ошибок квантования АЦП.

+STM32: FFT/водопад в режиме передачи | Thx to RA4ASN

В режиме передачи реализован FFT и водопад, который отображает спект передаваемого сигнала с микрофона.

+STM32: Обмен IQ сигналов в четных зонах Найквиста

При приёме сигналов на частотах, кратных двойке частоте АЦП (при 50мгц генераторе это 25-50, 75-100, 125-150 мгц и т.п.) сигналы IQ меняются местами, это необходимо для корректного отображения спектра сигналов.

+STM32: Переход на ARM C Compiler 6

Добавлена поддержка современного компилятора, что позволит более эффективно использовать флеш-память, а также увеличит быстродействие и безопасность прошивки.

+STM32: Автоподавление постоянной DC составляющей сигнала с АЦП

Изза несовершенства входного тракта и АЦП, сигнал всегда смещён на некую составляющую по постоянному току, что вызывает мнимую «полосу» на нулевой частоте спектра. Добавлено автоподавление и корректировка этой составляющей.

+STM32: Улучшение модуляции AM/FM

Исправлены ошибки при передаче сигналов в режимах AM и FM.

+STM32: Регулируемая полоса модуляции FM

В зависимости от полосы, автоматически меняется глубина модуляции FM.

+Мелкие фиксы ошибок и доработки

Файлы проекта доступны в 2х версиях (в архиве на момент публикации, и в репозитории github, постоянно обновляемые и с исправлениями ошибок), в них включены файлы и исходные коды прошивок, даташиты, смета, схемы и чертежи плат.

Архив проекта версии 1.4
Репозиторий проекта на GitHub
Архив статей по проекту


28 мыслей о “DUC-DDC ТРАНСИВЕР UA3REO: РЕЛИЗ ВЕРСИИ 1.4”

  1. Обновился, снова рандомные ошибки связи с fpga. Прозвонил соединения, проверил распиновку, все в порядке. Да и не в них дело, т.к. с проектом от 27 марта все работает без переделок. Сейчас удалось добиться стабильной работы на уровне оптимизации 1. Не понятно, почему днем-то все с О3 работало ) Какой-то плавающий баг. К слову, при ошибке на пине 0, к примеру, FPGA_fpgadata_in_tmp8=0. Также, возможно, стоит сделать полное тестирование шины, а в конце выводить итоги теста по всем пинам при возникновении ошибок.
    Та картина с проседаниями части спектра, что была снята на видео, не исчезла, осталась в том же месте. Заметил, что надпись AGC не пропадает при отключении AGC, скорее всего то же самое и с BUF, помогает перерисовка экрана.

        1. Выслал ссылку на свежее видео. Проседаний там несколько: одно широкое, выделил стрелкой, и несколько мелких. Они всегда на одних и тех же местах спектра. Помеха от включившегося холодильника )

          1. Пока в размышлениях что с ней поделать, раньше её не было потому что младший бит данных с АЦП терялся и не обрабатывался, сейчас чуйка лучше, но зато помехи видны. С другой стороны — почему она всегда ниже центра спектра, а не, допустим справа…. пока загадка для меня))))

        1. У меня 1в1 они же, значит точно не в них. Всё изменение FPGA кода для 6й версии сводится к изменению подхода работы с тактовым сигналом шины STM-FPGA. Сигнал сначала устанавливается, потом снимается. 6й компилятор видел это как ненужную команду и сразу ставил низкий уровень, не поднимая вверх. Есть возможность осциллографом глянуть сигнал STM32_CLK? есть движения? достаточно дешевого китайского с небольшими частотными характеристиками, там не мегагерцы.

          1. Нету осциллографа, я ж поэтому и писал, что хочу в трансивер попробовать добавить его функционал, уже и еще одна микросхема 9226 приехала.
            А нет ли возможности указать приоритет для операции тактирования? Возможно, из-за обилия высокоприоритетных прерываний и большого объема вычислений компилятор решает, что до этого кода очередь не дойдет и отбрасывает его.

            1. Возможность есть, для такта уже выставлено высокий приоритет (для EXTI15_10_IRQHandler)

              1. Я имел в виду сигналы stm32_clk и stm32_sync. Вечером посмотрю через квартусовские пробы, что на этих пинах при уровне оптимизации О3.

  2. Обновился до dev-версии, дисплей запустился сразу, спасибо ) Единственное что, в процедуре LCDDriver_SetCursorPosition точно нужна строка «text_cursor_y = y;»? С ней у меня все текстовые символы на экране съезжают вверх лесенкой, я ж поэтому и оставил в высланном коде только строку по х ) К слову, предложение: сделать автоматический расчет адреса FSMC на основании Chip select и LCD Register select, это поможет еще более унифицировать код.
    Проседания спектра при включенном AGC остались, все как на видео раньше, и мелкие и крупное.
    На пробах картина с О1 и О3 одинаковая, больше замерить нечем, на ардуино разве что логический анализатор собрать )

    1. Приветствую! строчку с Y убрал.
      Насчёт расчёта адреса — есть какая-нибудь статья про это? поделитесь ссылкой?
      Проседания спектра пока не поборол, в процессе.
      Насчёт оптимизации — скиньте мне полностью код проекта, с Вашей распиновкой и прочим, посмотрю, может что замечу, почему может не работать.

      1. Ссылку сходу не найду, принцип такой: по Chip select выбирается базовый адрес или банк (он же адрес регистра): NE1 — 0x60000000, NE2 — 0x6a000000, NE3 — 0x6b000000, NE4 — 0x6c000000, а по значению LCD Register select рассчитывается смещение адреса данных: Ax — в базовом адресе устанавливается х+1 бит по счету: у меня это будет 7-й бит (NE4 и A6)= 0x6c000080, у Вас 19-й (NE1 и A18)= 0x60080000.
        Свой проект на почту выслал. Отличия в распиновке (а также перенес EXTI5->EXTI1), коде дисплея и энкодере, я использую для него 8-й таймер.

        1. Не нашёл способа получить Register select из настроек FSMC, поэтому вынес в settings.h, в остальном готово. Спасибо!

    2. В расчёте FFT была проблема, поэтому просадка была, сейчас заметно лучше стало.

          1. Вроде как пропали проседания. Но появилась полоса на нулевой частоте.

  3. Добавил еще 1 pll на 49152 ) Как временная мера сгодится, на слух качество приема не пострадало. При подключении через USB щелчки пропали. Ранее описанную проблему с кратковременными переходами на передачу на 40м на текущей версии воспроизвести не удалось, видимо, что-то ранее недоделал, как обычно ) САТ работает. Пару раз вылезал BUF, но пока добавил вывод WM8731_Buffer_underrun в дебаг, появляться перестал.
    В loop режиме в наушниках какое-то гудение. Если говорить в микрофон, звучание как бы промодулировано этим гудением. При отключенном микрофоне гудение тоже слышно, но оно становится прерывистым.

    1. Приветствую!
      Спасибо! починил, щелчки пропали. Гудения в принципе и не было, только прерывания. Если остались — попробуйте вырубить Boost микрофона и проверить питание.
      Разделил BUF на FBF — недостаток пакетов от кодека к FPGA, и WBF — недостаток пакетов от FPGA к кодеку. в lcd.c ещё закомментировано UFB — недостаток пакетов при отправке в USB.
      По usb ещё одна ошибка в коде была, возможно сейчас и на 50мгц не будет щелчков, т.к. сейчас буферы двигаются более-менее синхронно.

      1. Вечером, если этот звук останется после обновления, запишу и вышлю Вам ссылку. Тут дело 100% не в питании.

        1. Да, хорошо, погонял и с микрофоном и с USB, гудения не услышал, думаю сейчас всё ок должно быть после исправления.

          1. Фикс помог, звук в LOOP нормализовался, на передачу прослушать пока нечем. Как можно настроить компрессор? Мне кажется, он слишком шумы задирает, судя по спектру.

            1. settings.h:
              #define TX_AGC_STEPSIZE 100.0f //Время срабатывания компрессора голосового сигнала на передачу (меньше-быстрее)
              #define TX_AGC_MAXGAIN 500.0f //Максимальное усиление микрофона при компрессировании
              #define TX_AGC_NOISEGATE 2.0f //Минимальный уровень сигнала для усиления (ниже — шум, отрезаем)

              для отладки можно использовать stm32f4xx_it.c (выводит текущую амплитуду с микрофона до компрессора):
              sendToDebug_str(«Processor TX MAX amplitude: «); sendToDebug_float32(dbg_Processor_TX_MAX_amplitude,false);

              но это для передачи, в режиме LOOP компрессор на усиление не работает, чтобы его включить удалите из списке игнорируемых мод audio_processor.c:
              if ((ALC_need_gain>1.0f) && (TRX_getMode()==TRX_MODE_DIGI_L || TRX_getMode()==TRX_MODE_DIGI_U || TRX_getMode()==TRX_MODE_IQ|| TRX_getMode()==TRX_MODE_LOOPBACK)) ALC_need_gain=1.0f;

              1. Приемлемого звучания удалось добиться со следующими настройками:
                TX_AGC_STEPSIZE 500.0f
                TX_AGC_MAXGAIN 500.0f
                TX_AGC_NOISEGATE 15.0f
                Нужен динамический микрофон, электретный все шумы собирает.

                Надо бы добавить обход автокалибровки FFT при включенном LOOP, т.к. интересные эффекты возникают на экране )

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

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