Как стать автором
Обновить

Применение протокола NMEA в задачах определения текущего времени

Время на прочтение2 мин
Количество просмотров11K
Публикуется по следам статьи Делаем собственный NTP-сервер Stratum-1.
В статье было рассказано о том, что можно использовать внешний приёмник GPS, подключенный по последовательному порту (COM) для определения точного времени и синхронизации локального времени компьютера. Но, как показывает опыт, не все так просто. Почему? Попробуем разобраться.

Время с приёмника, например такого как используем мы GARMIN GPS 35-HVS передается по двум каналам. Первый это обычный последовательный канал RS-232 по которому передается время в стандарте NMEA, второй это обычный дискретный сигнал PPS, заведенный на один из служебных сигналов того же RS-232.
Начнем с описания NMEA. Это обычный текстовый протокол по которому друг за другом идут пакеты следующих типов: WPL, AAM, APB, BOD, BWC, RMB, RTE и всякие другие. Конкретные пакеты которые будут идти в каждом конкретном случае зависит от типа GPS приёмника и его настроек.

Для работы с приёмником будем использовать программу NMEATime. Для просмотра пакетов, идущих по последовательному порту будем использовать программу FreeSerialPortMonitor.

Включаем, смотрим:


В этот момент с приёмника идут следующие пакеты:
$GPGGA,082407,5609.0341,N,04713.1558,E,0,00,,,M,,M,,*50
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,3,1,10,05,40,063,,10,28,049,,13,01,349,,15,04,116,*73
$GPGSV,3,2,10,16,38,301,,18,12,186,,21,52,236,,24,74,092,*7F
$GPGSV,3,3,10,29,60,125,,30,09,176,,,,,,,,,*79
$GPRMC,082408,V,5609.0341,N,04713.1558,E,000.0,000.0,301209,011.2,E*68
$GPGGA,082408,5609.0341,N,04713.1558,E,0,00,,,M,,M,,*5F
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,3,1,10,05,40,063,,10,28,049,,13,01,349,,15,04,116,*73
$GPGSV,3,2,10,16,38,301,,18,12,186,,21,52,236,,24,74,092,*7F
$GPGSV,3,3,10,29,60,125,,30,09,176,,,,,,,,,*79
$GPRMC,082409,V,5609.0341,N,04713.1558,E,000.0,000.0,301209,011.2,E*69
$GPGGA,082409,5609.0341,N,04713.1558,E,0,00,,,M,,M,,*5E
$GPGSA,A,1,,,,,,,,,,,,,,,*1E


Порядок, в котором они идут в общем случае не определён.

Нас интересуют пакеты GPGGA и GPZDA.
$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47
Данный пакет в своем первом поле содержит текущее время в формате UTS с точностью до секунды. В примере это 12 часов, 35 минут, 19 секунд.

$GPZDA,201530.00,04,07,2002,00,00*60
Это уже не только время с точностью до секунды, но также дата и текущий часовой пояс. В примере это 4 июля 2002-го года, 20 часов, 15 минут, 30 секунд.

Теперь стоит упомянуть о том как повысить точность определения текущего времени. Очень просто. Нужно использовать сигнал PPS. В моем случае он есть и заведен на CTS сигнал последовательного порта. Этот сигнал интересен тем, что его фронт совпадает с началом текущей секунды, и получив его мы можем утверждать что сейчас идет нулевая миллисекунда. Сигнал PPS присутствует не всегда, а только в том случае, если в зоне видимости антенны находятся достаточное количество спутников. На моём приёмнике для этого нужно 3 спутника.



Следует уточнить что данной задачей я занимаюсь применительно к аппаратуре автоматики для энергетики, которую производит компания, в которой я работаю. Там состояние входа PPS опрашивается с интервалом в 0.83 миллисекунды, соответственно с такой точностью синхронизируется время устройства.

Вот, в принципе, и все.
Теги:
Хабы:
Всего голосов 9: ↑8 и ↓1+7
Комментарии28

Публикации

Истории

Ближайшие события