Troyka-gps/glonass v2

Тема в разделе "Arduino & Shields", создана пользователем AlexeyCh, 12 ноя 2020.

  1. AlexeyCh

    AlexeyCh Нуб

    Для оперативного решения одной задачи приобрел данный модуль (из заголовка темы). Задача такая. Имеется несколько АЦП (подключаются по USB к ПК). АЦП нужны для непрерывной записи данных с некоторых датчиков. АЦП могут запускаться только вручную при помощи специального софта. АЦП расположены на больших расстояниях друг от друга. Сети, интернета и прочей связи нет. То есть АЦП можно запускать только вручную при обходе этих датчиков. Задача - привязать записи со всех АЦП к единой временной шкале UTC с большой точностью, хотя бы до десятков миллисекунд. Моя идея заключается в следующем. У АЦП есть вход для сигнала синхронизации, то есть вручную в программе запускается регистрация, происходит подготовка (инициализация) АЦП к записи, далее АЦП ждет прихода на синхровход сигнала, по фронту которого немедленно начинает регистрировать. Моя идея заключается в следующем: GPS-модуль получает точное время, ардуино фиксирует это время и подает синхроимпульс для запуска регистрации. С помощью такого устройства я смогу последовательно запустить все АЦП и знать точные времена запуска каждого АЦП. Потом все записи смогу привести к единой временной шкале. Так как UART интерфейс очень медленный, неизбежны задержки, пока ардуино примет время, распарсит его и т.д., время уже будет неактуально, самое печальное, что такие задержки не имеют фиксированной продолжительности. Моя идея борьбы с этим - использовать прием данных с UART по прерыванию. То есть приходит самый первый байт сообщения NMEA, фиксирую этот момент в обработчике прерываний через t1=millis(). Дальше принимаю данные сообщения, если это сообщение RMC, без ошибок, то есть я уверен в правильности сообщения, фиксирую снова момент времени через t2=millis() и сразу же отправляю синхроимпульс. Таким образом, я знаю t0 - точное время передачи одного (самого первого байта), знаю точное время между приходом первого байта и запуском синхроимпульса (t2-t1). Итого, полученное по gps время + рассчитанные задержки должны отражать точное время запуска синхроимпульса. Выглядит все логично. Но у меня есть некоторые сомнения касательно самого модуля GPS. Модуль шлет сообщения раз в секунду. Сколько я мониторил эти сообщения, у них у всех миллисекунды обнулены. Вот некоторые сообщения:
    $GNRMC,115914.00,A,5547.19213,N,03741.46304,E,0.222,,091120,,,A,V*1B
    $GNRMC,115915.00,A,5547.19151,N,03741.46293,E,0.401,,091120,,,A,V*17
    $GNRMC,115916.00,A,5547.19093,N,03741.46282,E,0.386,,091120,,,A,V*13
    Этот модуль вообще обеспечивает точность предоставляемого времени до долей секунд?.
    Как модуль высчитывает время? Допустим, он получает сигналы с нескольких спутников, которые использует для вычисления точного времени UTC. Допустим это все происходит одновременно, и решение происходит мгновенно, сообщение формируется мгновенно. Далее мгновенно ли модуль отправляет это сообщение в порт? Почему в перечисленных сообщениях все времена подозрительно округлены до единиц секунд? Реально ли обозначенная мной задача?
     
  2. parovoZZ

    parovoZZ Гуру

    Смотри в сторону TXCO.
     
  3. AlexeyCh

    AlexeyCh Нуб

    Решил задачу по другому. Завел вывод PPS от gps модуля на пин, поддерживающий прерывание (пин подтянул к земле через 10ком). Установил прерывание по фронту сигнала. В обработчике прерывания дергаю нужной ногой контроллера, т.е. подаю синхронизирующий импульс. Причем в обработчике прерываний добавил условие, чтоб дергал ногой только тогда, когда данные по времени достоверны (эта информация есть в сообщении RMC протокола NMEA). Таким образом, логика моего устройства следующая:при запуске сначала устанавливается прием сигналов от достаточного количества спутников. Как только данные по времени начинают приходить достоверные, поднимается флаг, который в обработчике прерываний позволяет выполнить условие и дернуть ногой синхронизации. После этого первое же пришедшие по uart сообщение RMC будет отражать точное время того момента, когда был подан мой синхросигнал. То есть я завязываюсь на сигнал PPS, именно по его фронту осуществляю генерацию синхроимпульса. Так как этот сигнал PPS при достаточно хорошей связи со спутниками очень точный.