Перейти к содержанию
    

Serhiy_UA

Свой
  • Постов

    859
  • Зарегистрирован

  • Посещение

  • Победитель дней

    1

Serhiy_UA стал победителем дня 4 августа 2022

Serhiy_UA имел наиболее популярный контент!

Репутация

1 Обычный

1 Подписчик

Информация о Serhiy_UA

  • Звание
    Знающий
    Знающий

Контакты

  • ICQ
    Array

Посетители профиля

5 404 просмотра профиля
  1. Буду пробовать искать что-то из SDR на одноплатниках.
  2. Спасибо за советы, но пока внешний компьютер исключается, как и внешний анализатор. Все должно быть портативным и встраиваемым. В приборе есть высокостабильный генератор 406 МГц, может он чем-то помочь?
  3. Стоит задача измерить частоту передатчика 406 МГц, с допустимым разбросом в пределах плюс/минус 1200 Гц. Передатчик излучает OQPSK-сигналы с длиной пакета в 1с и фазовой модуляцией около 80кГц. Излучение идет пакетами с нерегулярными задержками между ними от 2 до 10 с, а сам передатчик расположен в спасательном буе. Буду признателен за советы, ссылки на статьи, сайты и книги, или готовые для этого ИМС.
  4. Большое спасибо за быстрые ответы. Сразу помогла рекомендация от x893. В main.c для переменной Tic5ms доопределил volatile как рекомендовано, теперь все работает нормально: volatile char Tic5ms;
  5. Работаю с платой STM32F407VET6 в среде STM32CubeIDE версии 1.12.1, в которой не получалось запустить программу, работающую нормально в среде IAR версии 7.70. В программах таймер 3, вызывает прерывание каждые 5 мс, и в нем для глобальной переменной выполняется Tic5ms = 1. Для IAR в main.c организован бесконечный цикл входа каждые 5мс в функциональный блок, внутри которого уже Tic5ms = 0. Выглядит цикл так: /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { if(Tic5ms){ MyLedBlink(150); MyUart1_Compil(); Tic5ms = 0; } /* USER CODE END WHILE */ } Для IAR все работает как задумано, действия повторяются каждые 5 мс. Но для CubeIDE этот функциональный блок не работает, в него нет захода без дополнительного оператора HAL_GPIO, что установлен перед if(Tic5ms). В CubeIDE в этом месте программа такая: /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_RESET); if(Tic5ms) { MyLedBlink(150); MyUart1_Compil(); Tic5ms = 0; } /* USER CODE END WHILE */ } То есть, без дополнительного обращения выводу С7 перед if(Tic5ms), вход в блок почему-то в CubeIDE не выполняется. Вместо С7 можно вставить другой вывод, лишь бы был такой дополнительный оператор. Прерывание же для обеих сред выглядит одинаково: void TIM3_IRQHandler(void) { /* USER CODE BEGIN TIM3_IRQn 0 */ extern char Tic5ms; Tic5ms = 1; /* USER CODE END TIM3_IRQn 0 */ HAL_TIM_IRQHandler(&htim3); /* USER CODE BEGIN TIM3_IRQn 1 */ /* USER CODE END TIM3_IRQn 1 */ } В принципе можно работать и с дополнительным оператором, хоть и пришлось помучаться чтобы найти это решение. Но все же вопрос остался, почему так происходит. Других отклонений не находил, программы из обеих сред работают нормально, а выбор в пользу CubeIDE имеет некое преимущество в силу бесплатности и легальности.
  6. Макет для приема данных из QPSK сделан и работает. В основе EP4CE6E22C8 с частотой 25МГц, загрузка чуть более 15 процентов. Задействовано два PLL, три ROM и один RAM, а также полтора десятка fsm. Входная частота пока 390кГц, в схеме реализована автоматическая подстройка к ней. Разборки мои в этом топике конечно дилетантские, но обсуждение было полезным, многое пришлось переосмыслить, но главное результат.
  7. Spirit_1, спасибо за понимание, для меня эта тема была нова. На гитхаб загляну. С помощью подсказок «из зала» мне стало понятней как принимать данные из QPSK, для этого: 1.Определить период тактовой частоты ПТЧ (время между двумя прохождениями на подъемах Q или I через ноль) 2.Найти момент равенства положительных кодов I и Q (соответствует углу 45 градусов), по которому занести в вычитающий счетчик код ПТЧ и вычитать единицу по Clk до достижения нуля. 3.В момент равенства счетчика нулю принять следующую пару кодов I, Q и сравнить между собой. Если разница модулей большая, то просуммировать фазовое приращение\уменьшение с кодом ПТЧ, чтобы уменьшить отклонению в кодах I, Q, чем подстраиваем фазу. Суммарное значение записать в счетчик, продолжив его вычитание по Clk. Далее постоянно выполнять пункт 3. 4.Текущую фазу 45, 135, 225 и 315 градусов и соответствующие им символы 00, 10, 11 и 01 можно определять по знакам кодов I, Q, то есть без вычисления фазы в CORDIC. 5.Символьную синхронизацию (изменение фазы) можно получить с помощью автокорреляции на пол периода. Здесь так же вычисляется между символьный период, а внутри каждого их эти периодов один и тот же символ вычисляется по несколько раз. 6.В задании есть скремблирование каждого символа псевдослучайной М-последовательностью из 255 бит. Для определения момента кадровой синхронизации решено использовать четыре цифровых согласованных фильтра на логических схемах. С помощью этих фильтров также определять какой из символов реально находится в первом квадранте. Если что-то попутал, то поправьте. Работы еще по QPSK много.
  8. _4afc_, не совсем понял Вашу идею. Если оцифровывать входной сигнал в 406 МГц с УВХ менее 2.5 нс, и с АЦП с частотой дискретизацией 10-60 МГц, то как это согласовывается с теоремой Котельникова-Найквиста. Потом, будет ли все же сохранена фаза и её сдвиги на 90, 180 и 360 градусов. Мне не понятен этот метод. Spirit_1, мне показалось, что Вы предложили автокорреляцию выполнять не с задержанным периодом, а с его половиной. Я промоделировал это на своей С++ программе. Результат приятно удивил, получается, что объем вычислений сократился вдвое и этот метод можно использовать. Демодулятор с автокорреляционным (АК) методом выделения момента изменения фазы я нашел в прилагаемой статье на рис.3. Но там предлагалось вычислять АК со сдвигом на период. 02-Kokhanov.pdf
  9. spirit_1, Вы пишите, "Я бы сделал немного по другому" Мои познания в высокочастотной аналоговой технике слабоваты, если можно, приводите принципиальную схему на ИМС, мне станет понятнее, или ссылку на источник (хотя, настаивать не могу). Цель - обсудить несколько методов разграничения битовых последовательностей и выделить лучший. Данные о проекте мною приведены выше, вопросов ещё много, и пока такой. Можно ли сделать две ступени преобразования, например с 406 МГц на 10.7 МГц, а потом где-то на 200 кГц, для дальнейшей цифровой обработки (почему 10.7 МГц - мне сказали, что можно легко купить уже готовый фильтр). Не повлияют ли эти ступени на достоверность фаз, и как лучше в этом случае поступить.
  10. EdgeAlignet, если можно, утоните о каких микросхемах декодеров PSK идет речь. Я столкнулся с тем, что многие ИМС очень скудно описаны, например, AD9361. Предполагаю выделять информацию на ПЧ до 1 МГц.
  11. Провел небольшое моделирование на С++ для отработки алгоритма определения момента изменения фазы путем вычисления автокорреляционной функции с задержкой на период. Здесь три группы графиков с изменением фазы на 90, 180 и 270 градусов. В каждой исходная синусоида, она же сдвинутая на период и значение автокорреляционной функции, вычисленной скользящей сверткой. Думаю, что можно было бы это применить.
  12. spirit_1, спасибо за подсказку. Для меня аналоговая тема сложна, а с ПЛИС и МК – могу многое, опыт большой. Был реальный цифровой вычислитель с измерением фазы и амплитуды на ПЧ 250кГц для регулировок в ФАР у РЛС, но там работал со знатоками аналоговых схем. ZeroIF может и подойдет, надо изучить, особенно если будет дополнительная возможность подключиться компараторами к сигналам I и Q. Это упростит, например, измерения периода, а также позволит в цифре подстраиваться под фазу. Если есть еще варианты в русле темы, то сообщайте, пока со структурой окончательно не определились.
  13. spirit_1, большое спасибо за разъяснения, информация для меня очень интересна. Немного о задаче, что надо решить. Это гражданский контрольно-тестовый прибор для приема данных от спасательных радиобуев, с несущей 406 МГц. Там в секунду надо принять около 300 бит, из них примерно 50 преамбула, 200 информация, 50 контроль информации по БЧХ. То есть итоговая скорость у OQPSK 150 символов в секунду. Каждый бит I и Q у двух-битного символа на протяжении его передачи дополнительно модулирован псевдослучайной М-последовательность из 255 бит, причем I прямой, а Q зеркальной (не инверсной). Таким образом в итоге получаем скорость около 30 кбит/с. В микросхеме AD9361 и подобных, а хотелось бы использовать AD9361, не видно Costas Loop не для QPSK (OQPSK), ни для BPSK. Как там без неё обходятся, пока не понятно. Похоже, еще есть какие-то алгоритмы, так как AD9361 достаточно популярна. Момент изменения фазы у синуса пока планировал определять с помощью автокорреляционной функции, с задержанным на период значением. По части символьной синхронизации с использованием М-последовательности, планирую вычислять окончание символа корреляционным значением из скользящей свертки. Если есть другие методы и соображения, то хотел бы их узнать.
  14. Мне не хватает понимания методов демодуляции QPSK, почему-то эти методы не описаны (или я не нашел) по сравнению с большим множеством описаний модуляторов. Из-за этого не понятна роль в демодуляторах составляющих I и Q. Назначение и важность петли Костаса для восстановления несущей понятна. А как именно получать итоговый код из QPSK – полный туман. Нужна подсказка.
  15. Уважаемый, blackfin, мне не удалось найти ответ по этой ссылке, и по использованию возможностей самой AD9361 тоже. Что-то у меня зреет подозрение, что разность мгновенных фаз, что описана в моем посте выше, всегда равна 90 градусов. В общем, совсем тупик, нигде толково прочесть об этих подробностях в AD9361 не могу.
×
×
  • Создать...