Установка часов реального времени по GPS

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

я так понимаю, что ТС необходима синхронность времени  на девайсах расположенных в радиусе 100км, при одинаковости прошивок не вижу сложностей, от слова совсем, я даже писать бы ничего не стал (да и не программист), залил Мишин планер в АПМ и радовался, там кстати можно добавить и свои функции, проект доступен в сырцах, даже с предварительно настроенной IDE

Antsanv
Offline
Зарегистрирован: 18.12.2018

Добрый вечер. 
Есть вот такой код. Получаем время от GPS и пишем в DS3231.
 

tmElements_t tm;
        tm.Hour = fix.dateTime.hours; 
        tm.Minute = fix.dateTime.minutes;
        tm.Second = fix.dateTime.seconds;
        tm.Day = fix.dateTime.date; 
        tm.Month = fix.dateTime.month;
        tm.Year = fix.dateTime.year + 30; //from 2000 + 30 = 1970
        time_t t = makeTime(tm) + (timezone * SECS_PER_HOUR + (isDayLightSaving ? daylightOffset_sec : 0));
        uint8_t corSec = 0;
        uint32_t UTCms = gps.UTCms();
        Serial.print(F("UTCms: ")); Serial.println(UTCms);
        while (UTCms >= 1000UL) {         // Step by seconds until we're in the current UTC second
            UTCms -= 1000UL;
            corSec++;
            Serial.println('+');
        }
        uint32_t delt = millis();
        uint16_t restToFullSec = 1000UL - UTCms;
        while (millis() - delt < restToFullSec) { }//wait full second
        corSec++;
            Serial.print(F("UTCms - corSec: ")); Serial.println(UTCms); 
            Serial.print(F("corSec: ")); Serial.println(corSec);
            t += corSec; 
            setTime(t);
            rtc.adjust(DateTime(t)); 

 

gps.UTCms() - это сохраненный период между условно истинным началом секунды UTC и полученным значением времени от GPS.
Вроде все логично, но иногда на двух часах возникает разница от 1 до 3 сек. Не могу понять в чем дело.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Antsanv пишет:

Вроде все логично, но иногда на двух часах возникает разница от 1 до 3 сек. Не могу понять в чем дело.

С какой целью пишете в "Ищу исполнителя" ?

Antsanv
Offline
Зарегистрирован: 18.12.2018

Перепутал

Antsanv
Offline
Зарегистрирован: 18.12.2018

andy-k пишет:

Нужен процесс подстройки часов реального времени под GPS при том, что в них только секунды можно указать.

Вам удалось решить задачу? Столкнулся с подобной, есть что обсудить.

andy-k
Offline
Зарегистрирован: 14.05.2012

Antsanv пишет:

Вам удалось решить задачу? Столкнулся с подобной, есть что обсудить.

Нет, все руки не дойдут, был вынужден переключиться на другие проекты

Antsanv
Offline
Зарегистрирован: 18.12.2018

Я вроде реализовал синхронизацию по началу такта, но кажется сам GPS дает неверные данные при холодном запуске. Ровно 3 сек. Через 5-7 мин корректирует.

andy-k
Offline
Зарегистрирован: 14.05.2012

Вот вроде бы не видел такого. 3 секунды то они заметны очень

Antsanv
Offline
Зарегистрирован: 18.12.2018

andy-k пишет:

Вот вроде бы не видел такого. 3 секунды то они заметны очень

Ну вот так. NEO-6M разные, две библиотеки пробовал. Причем в одной руками правил чтобы время брал только из сообщения ZDA

rst
Offline
Зарегистрирован: 25.06.2018

Antsanv пишет:
Ну вот так. NEO-6M разные, две библиотеки пробовал. Причем в одной руками правил чтобы время брал только из сообщения ZDA
Ключевое слово тут "библиотеки".  ;)

Antsanv
Offline
Зарегистрирован: 18.12.2018

rst пишет:

Antsanv пишет:
Ну вот так. NEO-6M разные, две библиотеки пробовал. Причем в одной руками правил чтобы время брал только из сообщения ZDA
Ключевое слово тут "библиотеки".  ;)

Не думаю.

TinyGPSPlus - отключил все лишнее, добавил ZDA, делаю commit только по приходу данных ZDA. В порту четко видно что иногда время от GPS уменьшается ровно на 3 сек. Особенно часто при холодном старте. 

mable
Offline
Зарегистрирован: 09.10.2019

Если поделитесь кодом, то смогу у себя, на паре нео6м, погонять и может вместе определим причину такого поведения и способы решения. Самому интересна  тема синхронизации нескольких устройств по времени с GPS. 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

mable пишет:

Если поделитесь кодом, то смогу у себя, на паре нео6м, погонять и может вместе определим причину такого поведения и способы решения. Самому интересна  тема синхронизации нескольких устройств по времени с GPS. 

А чего там определять то ? Смотрите количество видимых спутников в интересующие вас моменты. Должно помочь.

Antsanv
Offline
Зарегистрирован: 18.12.2018

Напишите email, поделюсь кодом. Может найдем причину.

mable
Offline
Зарегистрирован: 09.10.2019

Контакты

mable@mail.ru

whatsUp, viber +7 9173432595

telegram https://t.me/Mr_Mable

mable
Offline
Зарегистрирован: 09.10.2019

Antsanv

Посмотрел эту библиотеку, точность не впечатлила. Плюс-минус пара сотен мс.

Сделал через прерывание на PPS, все отлично работает, точность +-1 мс, никуда ничего не убегает.

Antsanv
Offline
Зарегистрирован: 18.12.2018

Именно так. Только с прерыванием. У меня несколько сложнее получается - на борту есть DS3231 от которого берется время. Так что погрешность несколько больше, а именно на время чтения по I2C.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Antsanv пишет:

Именно так. Только с прерыванием. У меня несколько сложнее получается - на борту есть DS3231 от которого берется время. Так что погрешность несколько больше, а именно на время чтения по I2C.

Это время всегда одинаковое, компенсируйте.

Antsanv
Offline
Зарегистрирован: 18.12.2018

Как? Время априори всегда одинаковое. У Вас есть код как это время получить или просто разговор не о чем?