Очередное обновление проекта в программной части.
Вся история разработок доступна в этой ветке статей по посвящённой разработке трансивера 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
Архив статей по проекту
Обновился, снова рандомные ошибки связи с fpga. Прозвонил соединения, проверил распиновку, все в порядке. Да и не в них дело, т.к. с проектом от 27 марта все работает без переделок. Сейчас удалось добиться стабильной работы на уровне оптимизации 1. Не понятно, почему днем-то все с О3 работало ) Какой-то плавающий баг. К слову, при ошибке на пине 0, к примеру, FPGA_fpgadata_in_tmp8=0. Также, возможно, стоит сделать полное тестирование шины, а в конце выводить итоги теста по всем пинам при возникновении ошибок.
Та картина с проседаниями части спектра, что была снята на видео, не исчезла, осталась в том же месте. Заметил, что надпись AGC не пропадает при отключении AGC, скорее всего то же самое и с BUF, помогает перерисовка экрана.
Только что заметил: на проседания спектра влияет AGC.
Принято, проверю, на AGC даже и не думал)
Выслал ссылку на свежее видео. Проседаний там несколько: одно широкое, выделил стрелкой, и несколько мелких. Они всегда на одних и тех же местах спектра. Помеха от включившегося холодильника )
Пока в размышлениях что с ней поделать, раньше её не было потому что младший бит данных с АЦП терялся и не обрабатывался, сейчас чуйка лучше, но зато помехи видны. С другой стороны — почему она всегда ниже центра спектра, а не, допустим справа…. пока загадка для меня))))
Кстати, у вас какая версия Keil и 6го компилятора? может в версиях дело.
Keil 5.26.2, ARM compiler 6.10.1
У меня 1в1 они же, значит точно не в них. Всё изменение FPGA кода для 6й версии сводится к изменению подхода работы с тактовым сигналом шины STM-FPGA. Сигнал сначала устанавливается, потом снимается. 6й компилятор видел это как ненужную команду и сразу ставил низкий уровень, не поднимая вверх. Есть возможность осциллографом глянуть сигнал STM32_CLK? есть движения? достаточно дешевого китайского с небольшими частотными характеристиками, там не мегагерцы.
Нету осциллографа, я ж поэтому и писал, что хочу в трансивер попробовать добавить его функционал, уже и еще одна микросхема 9226 приехала.
А нет ли возможности указать приоритет для операции тактирования? Возможно, из-за обилия высокоприоритетных прерываний и большого объема вычислений компилятор решает, что до этого кода очередь не дойдет и отбрасывает его.
Возможность есть, для такта уже выставлено высокий приоритет (для EXTI15_10_IRQHandler)
Я имел в виду сигналы stm32_clk и stm32_sync. Вечером посмотрю через квартусовские пробы, что на этих пинах при уровне оптимизации О3.
Обновился до dev-версии, дисплей запустился сразу, спасибо ) Единственное что, в процедуре LCDDriver_SetCursorPosition точно нужна строка «text_cursor_y = y;»? С ней у меня все текстовые символы на экране съезжают вверх лесенкой, я ж поэтому и оставил в высланном коде только строку по х ) К слову, предложение: сделать автоматический расчет адреса FSMC на основании Chip select и LCD Register select, это поможет еще более унифицировать код.
Проседания спектра при включенном AGC остались, все как на видео раньше, и мелкие и крупное.
На пробах картина с О1 и О3 одинаковая, больше замерить нечем, на ардуино разве что логический анализатор собрать )
Приветствую! строчку с Y убрал.
Насчёт расчёта адреса — есть какая-нибудь статья про это? поделитесь ссылкой?
Проседания спектра пока не поборол, в процессе.
Насчёт оптимизации — скиньте мне полностью код проекта, с Вашей распиновкой и прочим, посмотрю, может что замечу, почему может не работать.
Ссылку сходу не найду, принцип такой: по 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-й таймер.
Не нашёл способа получить Register select из настроек FSMC, поэтому вынес в settings.h, в остальном готово. Спасибо!
В расчёте FFT была проблема, поэтому просадка была, сейчас заметно лучше стало.
Сейчас обновился, проседания сместились вправо )
А сейчас? добавил блокировку на буфер, не должно никаких непросчётов вылазить. https://drive.google.com/file/d/0BwXn7GOvH-ELODJuYmtBOThidzhtbm45MGdxM2hYV29rWEtZ/view?usp=sharing
Вроде как пропали проседания. Но появилась полоса на нулевой частоте.
Добавил еще 1 pll на 49152 ) Как временная мера сгодится, на слух качество приема не пострадало. При подключении через USB щелчки пропали. Ранее описанную проблему с кратковременными переходами на передачу на 40м на текущей версии воспроизвести не удалось, видимо, что-то ранее недоделал, как обычно ) САТ работает. Пару раз вылезал BUF, но пока добавил вывод WM8731_Buffer_underrun в дебаг, появляться перестал.
В loop режиме в наушниках какое-то гудение. Если говорить в микрофон, звучание как бы промодулировано этим гудением. При отключенном микрофоне гудение тоже слышно, но оно становится прерывистым.
В loop WM8731_Buffer_underrun =1
Приветствую!
Спасибо! починил, щелчки пропали. Гудения в принципе и не было, только прерывания. Если остались — попробуйте вырубить Boost микрофона и проверить питание.
Разделил BUF на FBF — недостаток пакетов от кодека к FPGA, и WBF — недостаток пакетов от FPGA к кодеку. в lcd.c ещё закомментировано UFB — недостаток пакетов при отправке в USB.
По usb ещё одна ошибка в коде была, возможно сейчас и на 50мгц не будет щелчков, т.к. сейчас буферы двигаются более-менее синхронно.
Вечером, если этот звук останется после обновления, запишу и вышлю Вам ссылку. Тут дело 100% не в питании.
Да, хорошо, погонял и с микрофоном и с USB, гудения не услышал, думаю сейчас всё ок должно быть после исправления.
Фикс помог, звук в LOOP нормализовался, на передачу прослушать пока нечем. Как можно настроить компрессор? Мне кажется, он слишком шумы задирает, судя по спектру.
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;
Приемлемого звучания удалось добиться со следующими настройками:
TX_AGC_STEPSIZE 500.0f
TX_AGC_MAXGAIN 500.0f
TX_AGC_NOISEGATE 15.0f
Нужен динамический микрофон, электретный все шумы собирает.
Надо бы добавить обход автокалибровки FFT при включенном LOOP, т.к. интересные эффекты возникают на экране )
Добавил в проект, у меня также хорошее звучание при таких настройках.