форум Радиолюбительского ДВ портала > Технический раздел
DDS синтезатор передатчика
rn3aus:
Если у Вас есть и другие замечания к тексту программы и хотели бы еще что-то посоветовать - пожалуйста, сделайте это, лучше сразу по всем пунктам.
GM:
Александр, дорогой уважаемый! Ну, такой я, критикан доморощенный. Мне дай волю, я всех закритикую, начиная с себя :-).
Замечаний много, но я себя сдерживаю, а то вы будете меня бояться пуще огня :-). Поэтому я понемножку, чтобы сильно вас не расстраивать.
Инструкция RETI среди прочего, как то, восстановление адреса основной программы из стека и инкремент стека, ещё устанавливает бит I=1, т.е., в некотором роде эквивалентна инструкции SEI (тоже устанавливает бит I=1 SREG). Ну вот, и в подпрограмме RX_COMPLETE_INT у вас есть вызов rcall TIM0_COMPB, который заканчивается RETI (т.е., в данном случае SEI), разрешая таким образом все глобальные прерывания. Я всю вашу программу не анализировал, но этого примера достаточно, чтобы так не делать.
Ещё такой нюанс. Возникло прерывание RX_COMPLETE_INT и вы получаете первый байт по прерыванию, а остальные - по готовности. Теперь представьте себе, что внутри ПП прерывания разрешены прерывания, и опять возникнет прерывание RX_COMPLETE_INT. Какие ваши действия и как вы потом засинхронизируетесь с последующими посылками?
А ещё у вас прерывается генерация синуса на время 4 мс, 12 мс, мощный передатчик начинает работать в "рваном" ритме, регтайм так сказать, вам уже кто-то говорил, что передатчик верещит, и это не есть гуд.
[А вообще, призываю вас испытать мою программу для синтезатора. Там не нужен ВЕСЬ ваш список команд (кроме маяка и еепрома), достаточно передачи одного пакета из 4-х байт. При приеме пакета генерация синуса не прерывается, пакет исполняется через 2 мкс после получения последнего байта, не надо высчитывать такты проца. Частота выборок 2 Мвыб/с, т.о., цифровой шум снижен примерно на 3 дБ, "зеркалка" отъехала на 2000-137=1863 кГц. По приему пакета всегда высылается квитанция. Ладно, это всё лирика.]
rn3aus:
Несколько комментариев. Позволю себе немного позащищать изделие :-)
(Нас читают те любители, которые ищут вариант сделать себе синтезатор и выйти в эфир. Не хотелось бы в них посеять сомнение в том, что наш синтезатор нормально работает. Он нормально работает, и им много лет пользуюсь и я, и другие любители. Его можно улучшить, что будет сделано в следующей версии.)
[Все не так страшно как кажется, я думаю Вы согласитесь со мной. Если ошибаюсь - поправьте.
1) Вызов TIM0_COMPB, о котором идет речь, нужен для перевода синтезатора в режим AutoBeacon, чтобы он начал это делать немедленно по получению команды G от компьютера. Больше компьютер до завершения работы маяка никаких команд слать не будет, поэтому в данном случае вполне допустимо разрешить прерывание чуть-чуть раньше, так как никаким вложенным прерываниям возникнуть неоткуда - СОМ-порт пуст, таймер сброшен, кнопку жать незачем.
2) Прерывание RX_COMPLETE_INT возникает, как я понимаю, по приходу первого байта. МК смотрит, какая это команда и если она из нескольких байт, то дожидается прихода всех остальных. В это время прерывания запрещены. Так что синхронизация не теряется. Если же приходит неожиданный байт, он, как нераспознанный, просто вызовет ответ контроллера и будет проигнорирован.
Да и откуда взяться лишним байтам? Если только какие-то мощные наводки на кабель. Но в этой ситуации никакой синтезатор, ни мой, ни Ваш нормально работать не будет - у Вас частота начнет сама собой выбираться неизвестно какая.
3) Паузы сигнала во время обработки команд есть. Этот недостаток давно известен и в основном успешно преодолен введением быстрых однобайтных команд без квитанции. При этом "гибнет" 6 отсчетов сигнала на одну команду. Этот недостаток надеюсь изжить в следующей версии, кое-какие мысли есть.
Впрочем, это тоже лирика.]
Вашу версию синтезатора можно было бы начать использовать для работы в эфире, введя, как мне кажется, недостающие необходимые функции. Сам по себе любой синтезатор мало что может без довольно сложной программы управления на компьютере. Чтобы обеспечить работу синтезатора в тех или иных любительских режимах одной функции установки частоты, к сожалению, недостаточно.
Нельзя ли Вашу прошивку доработать так, чтобы она умела необходимый минимум:
- установка частоты (это есть)
- вкл-откл РТТ
- вкл-откл тона. (Для чего нужно: ведь можно прекращать формирование сигнала просто записав нулевую частоту? Нужно для обеспечения когерентности сигнала. То есть когда выход выключен, аккумулятор фазы продолжает считать и в момент включения выхода сигнал продолжится с нужной фазой, обеспечивая когерентное накопление на приеме.)
- инверсия фазы.
Если это получится, можно было бы подправить и мою программу управления DDS_ctrl и иметь все богатство разнообразных режимов на Вашем качественном DDS.
GM:
--- Цитата: rn3aus от 14 Апрель 2019, 14:28:36 ---Прерывание RX_COMPLETE_INT возникает, как я понимаю, по приходу первого байта
--- Конец цитаты ---
Ну, я же вам нарисовал один из возможных сценариев. Оно и потом возникает при приеме каждого следующего байта (так называемы pending), и откладывается на некоторое время, когда прерывания будут разрешены, ну а когда подошла инструкция RETI, оно, это прерывание, тут как тут.
--- Цитата: GM от 14 Апрель 2019, 00:59:29 ---Нельзя ли Вашу прошивку доработать так, чтобы она умела необходимый минимум:
- установка частоты (это есть)
- вкл-откл РТТ
- вкл-откл тона. (Для чего нужно: ведь можно прекращать формирование сигнала просто записав нулевую частоту? Нужно для обеспечения когерентности сигнала. То есть когда выход выключен, аккумулятор фазы продолжает считать и в момент включения выхода сигнал продолжится с нужной фазой, обеспечивая когерентное накопление на приеме.)
- инверсия фазы.
Если это получится, можно было бы подправить и мою программу управления DDS_ctrl и иметь все богатство разнообразных режимов на Вашем качественном DDS.
--- Конец цитаты ---
1) Да, установка частоты реализована. Код частоты любой от 0х00000000 до 0x7FFFFFFF. Возможно стоит ограничить диапазон кодов в диапазоне частот 135-138 кГц или что-то около того. Как бы допзащита от ошибочно переданных байт.
2) Включение/Отключение передатчика. Если имеется в виду сигнал 0/1 на какой-то ноге МК, то это легко осуществить. В принципе можно выдавать до 8 сигналов, если ног проца хватит :-).
3) Сделать можно, но надо ли? За одну секунду любая когерентность нарушится, даже если синтезатор выдаёт абсолютное значение частоты, то присутствуют погрешности первого гетеродина приёмника, а то и второго, генератора звуковой карты, так что когерентность становится проблематичной. Вообще, я думал, что в цифре у вас имеется квадратурный приёмник и подстройка частоты осуществляется каждый раз при приеме новой посылки. Хотя нет, у вас просто БПФ на весь ДВ диапазон.
4) Инверсия фазы. Имеется в виду установка фазы сигнала относительно предыдущего значения? Мы с вами как-то касались этого вопроса, так что такая установка фазы реализована, просто не хотел пугать народ всякими наворотами. Фаза устанавливается с дискретом 360/65536=0.005493 град, естественно, без прерывания генерации синуса. Надеюсь, этого достаточно?
Да, уже говорил, повторюсь. Наличие фильтра НЧ или ПП на выходе синтезатора крайне желательно. Я сейчас подключил ДДС на основе AD9851 к микроконтроллеру, сижу, играюсь. Плату ДДС купил по интернету, ну и в качестве МК взял плату ардуино-уно, а энкодер - от какой-то бытовой техники. Не айс, зато ничего не надо делать, в смысле паять, пиши себе программу. А, нет, паять пришлось 12 проводков - от ардуины к синтезатору и 4 провода к энкодеру. Ну так вот, фильтр на плате синтезатора не гуд, частота до 55 МГц ещё ничего, а потом начинается джиттер, уровень сигнала резко падает. Хотя должен признать, опорник 30 МГц хорош, выбег частоты 5-6 Гц, а потом стоит, как у волка на морозе..хвост.
rn3aus:
--- Цитата: GM от 14 Апрель 2019, 16:29:24 ---2) Включение/Отключение передатчика. Если имеется в виду сигнал 0/1 на какой-то ноге МК, то это легко осуществить.
--- Конец цитаты ---
Это сигнал 0-1 на ноге PD6.
(Я исхожу из того, чтобы МК с новой прошивкой просто вставить в панельку имеющегося готового синтезатора)
--- Цитата: GM от 14 Апрель 2019, 16:29:24 ---3) Сделать можно, но надо ли? За одну секунду любая когерентность нарушится, даже если синтезатор выдаёт абсолютное значение частоты, т
--- Конец цитаты ---
Нужно. Все эти погрешности на приеме у приличных людей близки к нулю. Важно для приема OPERA/opds. Там желательна когерентность всех посылок, передаваемых на одной частоте. Некогерентный сигнал тоже принимается, но с проигрышем в помехоустойчивости.
--- Цитата: GM от 14 Апрель 2019, 16:29:24 ---4) Инверсия фазы. Имеется в виду установка фазы сигнала относительно предыдущего значения?
--- Конец цитаты ---
Да, ОФТ. Точность достаточна, конечно.
Будет время, опишите поподробнее протокол управления Вашим синтезатором, посмотрю, что смогу сделать.
Навигация
Перейти к полной версии