• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Синхронизация часов.

sasasa

Member
Нашёл такую картинку. Видно что мне нужные 5мкс не предел для WiFi WL8 синхронизации. Это обнадёживает :)
WL8.JPG
 
Последнее редактирование:

sasasa

Member
Так как код обработки UDP пакета у Вас будет одинаков, то и время периферийного устройства будет сохранятся в один и тот же момент (от возникающих аппаратных прерываний
Попробовал просто Ping с мобилки на ЕСПку. Результат разочаровал 8.21-26.1мс. Я думаю что UDP не будет быстрее, там кажется пакет ещё длиннее, и тем более оочень уж большой разброс по времени :(
 

Сергей_Ф

Moderator
Команда форума
@sasasa Вы точно не путаете мс и мкс? У ping мс прыгают в диапазоне десятков мс!!! Как тут может быть точность в микро? Забудьте про wifi. Лучше nrf мучайте, если на 100 м добьют.
 

sasasa

Member
Точно мс. Не знаю откуда микросекунды. Тут результат от двух разных программ. На разных ЕСПках такой же результат. Мерил с расстояния 3-х метров

Screenshot_2016-12-24-16-57-48.png

Screenshot_2016-12-24-17-09-08.png
 

pvvx

Активный участник сообщества
@sasasa Вы точно не путаете мс и мкс? У ping мс прыгают в диапазоне десятков мс!!! Как тут может быть точность в микро? Забудьте про wifi. Лучше nrf мучайте, если на 100 м добьют.
Пинг для ESP8266 не более 1ms, если это не Arduino. В Arduino циклический "опрос" в свободное время в цикле Loop() и прием у вас бьет с его исполнением. Приходящий пакет на WiFi обрабатывается по прерыванию и сразу обслуживается в LwIP, но у вас это не используется.
Во вторых никто не синхронизирует время без программного аналога ФАПЧ с обратной связью. Точность у таких устройств зависит от времени затраченного на процесс синхронизации - не один пакет туда-сюда, а много, с коррекциями и постоянно - температура не мешает. :) Предел синхронизации = точности источника тактирования. Если это кварц, то значит где-то 10^6. Если постараетесь, то выловите и джиттер PLL и джиттер прерываний у ESP8266 связанный с разными частотами тактирования шин и CPU... Но это уже за пределами температурных отклонений кварца :)
У вас "стационар", а не динамика, как у GPS. Ей иногда сложнее...
 
Последнее редактирование:

sasasa

Member
если это не Arduino
Это именно Ардуино и картинки выше наглядно показывает время ответа, но записано в loop() всего чтение UDP пакета и больше ничего. Пока до 1мс как до луны, Хотя и 1мс мне многовато. Хотя бы стабильные 0.2мс получить с разбросом не более 0.05мс.
Проверил несколько чипов. Но если лооп тормозит ответ пинга, то может быть UDP быстрее приходит?
Мне не нужно точное время а только синхронизацию/сброс 2-х таймеров на разных ЕСПках.
 

Сергей_Ф

Moderator
Команда форума
@sasasa предположим Вы получили 5 мкс, дальше что? Как Вы на 100 м "стрелять" будете? Через роутер? Там Ваши 5 мкс превратятся в "тыкву".
 

sasasa

Member
Как Вы на 100 м "стрелять" будете? Через роутер?
Сам не пробовал, но по отзывам в интернете что с наружной антенной ЕСПка 100м без проблем потянет
Приходящий пакет на WiFi обрабатывается по прерыванию и сразу обслуживается в LwIP, но у вас это не используется.
Что такое LwIP, и как его использовать?
не один пакет туда-сюда, а много, с коррекциями и постоянно
На данный момент планируется сигнал синхронизации с частотой 1Гц.
--
Можете что то посоветовать по этому поводу? Где, что, посмотреть, почитать.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Код:
>ping atesp8266 -n 20

Обмен пакетами с atesp8266 [192.168.3.1] с 32 байтами данных:
Ответ от 192.168.3.1: число байт=32 время<1мс TTL=255
Ответ от 192.168.3.1: число байт=32 время<1мс TTL=255
Ответ от 192.168.3.1: число байт=32 время<1мс TTL=255
Ответ от 192.168.3.1: число байт=32 время<1мс TTL=255
Ответ от 192.168.3.1: число байт=32 время<1мс TTL=255
Ответ от 192.168.3.1: число байт=32 время<1мс TTL=255
Ответ от 192.168.3.1: число байт=32 время<1мс TTL=255
Ответ от 192.168.3.1: число байт=32 время<1мс TTL=255
Ответ от 192.168.3.1: число байт=32 время<1мс TTL=255
Ответ от 192.168.3.1: число байт=32 время<1мс TTL=255
Ответ от 192.168.3.1: число байт=32 время<1мс TTL=255
Ответ от 192.168.3.1: число байт=32 время<1мс TTL=255
Ответ от 192.168.3.1: число байт=32 время<1мс TTL=255
Ответ от 192.168.3.1: число байт=32 время<1мс TTL=255
Ответ от 192.168.3.1: число байт=32 время<1мс TTL=255
Ответ от 192.168.3.1: число байт=32 время<1мс TTL=255
Ответ от 192.168.3.1: число байт=32 время<1мс TTL=255
Ответ от 192.168.3.1: число байт=32 время<1мс TTL=255
Ответ от 192.168.3.1: число байт=32 время<1мс TTL=255
Ответ от 192.168.3.1: число байт=32 время<1мс TTL=255

Статистика Ping для 192.168.3.1:
    Пакетов: отправлено = 20, получено = 20, потеряно = 0
    (0% потерь)
Приблизительное время приема-передачи в мс:
    Минимальное = 0мсек, Максимальное = 0 мсек, Среднее = 0 мсек
Не Arduino. Но так никто синхронизацию (только по приему) не делает...
Wireshark говорит 0.000515..0.000656 сек между передачей и приемом пакета ping (ICMP). Это через самый дешевый USB-свисток "Wi-Pi" :)
 
Последнее редактирование:

pvvx

Активный участник сообщества
@sasasa предположим Вы получили 5 мкс, дальше что? Как Вы на 100 м "стрелять" будете? Через роутер? Там Ваши 5 мкс превратятся в "тыкву".
Посылки данных обычно сопровождаются штампом таймера и неважно когда они придут... У вас видео по инет работает или плавают кадры?
-----------
@sasasa
Всё проходил совместно с появлением и литературы не читал. Посоветовать нечего.
Поиск по инет дает ерунду: http://wircom.ua/content/20/network_time_pro.pdf
Сетевые решения построения пакетной сети распределения сигналов единого точного времени ...

Вот это вам пойдет Протокол точного времени — Википедия
Снимок7.gif
http://www.belden.com/pdfs/Techpprs/Precision_Clock_Synchronization_WP.pdf
Полу-Авто-перевод: Установка дрейфа осцилляторов ограничивает точность синхронизации в существующих прототипах. Кварцевый - частота 50 МГц (± 50 частей на миллион) дает разрешение 20 нс. Таким образом, система может установить только диапазон дрейфа ± 20 нс в секунду. Если вы теперь посмотрите на относительный дрейф между локальными часами и мастера в течение двух следующих друг за другом телеграмм синхронизации, вскоре становится ясно, что краткосрочная стабильность осцилляторов оказывает решающее влияние на точность синхронизации в переходном состоянии.

Т.е. всё примерно как и прописывал - ограничение в стабильности кварца на ESP :) Счетчик тактов CPU в ESP8266 есть и работает на 160 MHz.

IEEE 1588 Precision Time Protocol (PTP) : Результат показан на графике. Смещение часов в пределах -50нс до 50нс.
 
Последнее редактирование:

sasasa

Member
ОК. Сначала попробую почистить loop() и потом посмотреть какой пинг будет. Ясно что синхронизация не будет по одному сигналу, но пока у меня так сильно Ping плавает и нечего дальше думать. Спасибо!
 

pvvx

Активный участник сообщества
А почему бы не использовать SNTP и механизм синхронизации времени как в винде ?
А потому, что он для точности в +-1 сек (SNTP).
NTP точнее.
А если прочитаете начало темы и основной вопрос, то поймете что поддержка каких-то стандартных протоколов в данной задаче не требуется, а требуется реализация примерно аналогичного алгоритма от PTP, но упрощенного для достижения точности в миллисекунды, а не нано. 6-ть десятичных знаков, а не 9-ть :) Тем более устройства могут быть соединены прямым каналом без неизвестных посредников.

Лично для Гуру Nikolz: Как раз такое применение и показывает, что требуются исходники WiFi драйвера для реализации более точных синхронизаций, чего от китай-Espressif не дождетесь и аналогичные задачи будут реализовывать на чипах другой фирмы, благо они дешевле...
 
Последнее редактирование:

Сергей_Ф

Moderator
Команда форума
@pvvx 5 мкс ТС хотел. Не милли, а микро. И Вы не объяснили ему, что на Arduino IDE он этого не получит, пока не перейдёт на чистый С.
 

pvvx

Активный участник сообщества
@pvvx 5 мкс ТС хотел. Не милли, а микро. И Вы не объяснили ему, что на Arduino IDE он этого не получит, пока не перейдёт на чистый С.
Arduino поддерживает и чистый СИ и C++. Проблема в используемых библиотеках писаных кое-как, для галочки "портировщиками"...
Вписываете #include ... и получаете доступ ко всему, чему только возможно в SDK.

Надо глянуть - может вообще драйвер WiFi вставляет сам таймштамп в us (он аппаратный в блоке PHY ESP8266) и тогда делать вообще почти нечего, кроме пары формул хоть на бэйсике. Если нет, то вписать вставку счетчика тактов CPU - он в 6.3 наносекунд.
 
Последнее редактирование:

pvvx

Активный участник сообщества
В качестве примера синхронизации времени компьютера с помощью SNTP привожу результаты синхронизации своего компа для исследования запаздывания данных с биржи:

По оси Х -время в секундах от момента включения компа,
по Y - ошибка в секундах локальных часов компа относительно атомных часов.
Наглядно видно что ошибка составляет примерно 40 мс и является систематической (это время пинга до сервер точного времени).
Если ее учесть , то погрешность в пределах 5 mc, которую можно снижать.
-------------------------------
Т е SNTP позволяет получить синхронизацию в предела ms для секунд минут часов дней и лет.
Нет. Для SNTP прямая зависимость от удаленности сервера и всей сети. Это +-20 секунд :) :p
Возьмите стандартный канал пользователя - NAT + WiFi + GSM + спутник + вокруг шарика + кривой сервер в ШША + ... Итого и в 60 сек нет гарантий. Норма 120 сек в ожидании заплутавшего пакета только в TCP на сегодня :)
 

pvvx

Активный участник сообщества
Я не теорию рассказываю, а результат работы привел.
---------------------------
Можете экспериментально доказать ? Нет!
---------------------------
Ну и не надо трындеть.
Без проблем - давайте ваш личный эксп :) Найду вам сервер для SNTP за тридевятъ земель :) :)
И не надо путать SNTP и NTP. Дуплекс и просто прием метки от источника в локальной сети :)
У меня точнее уже просто пинг c ESP8266 и показан - расхождение +-50 us :p По причине беакона в 100 ms ...
Интересно - какое отношение имеет SNTP к задаче в топике? :)

Вы получили точность синхронизации на Arduino в ESP8266 в заданные 5 мкс?
 
Последнее редактирование:

sasasa

Member
Надо глянуть - может вообще драйвер WiFi вставляет сам таймштамп в us (он аппаратный в блоке PHY ESP8266) и тогда делать вообще почти нечего, кроме пары формул хоть на бэйсике. Если нет, то вписать вставку счетчика тактов CPU - он в 6.3 наносекунд.
И как это всё написать? Есть идеи?
--
! :rolleyes: Сейчас появилась идея сделать всё наоборот - не посылать синхроимпульсы с "базы" на сенсор, а с сенсорного блока на базу и там делать все вычисления. Т.е. делать синхронизацию базы по сенсора. В результате ЕСПке на сенсоре не надо ничего вычислять а только посылать импульсы, скажем 1Гц. Обратная связь не нужна. Импульс срабатывания сенсора посылается в промежутке между синхроимпульсом. Кажется идеальный вариант - никто никому не мешает, процессор не нагружен и вся работа только по 2-м прерываниям. Кажется я ничего не упустил.

На каком интервале Вам нужна синхронизация и с какой погрешностью?
Надо чтобы в течении всего дня любая пара импульсов полученных с обоих сенсоров была с погрешностью не более 5мкс.
Максимальный интервал между импульсами обоих сенсоров 2секунды.
Каждая следующая пара импульсов приходит не раньше чем через 10секунд после предыдущего.
 
Последнее редактирование:

pvvx

Активный участник сообщества
И как это всё написать? Есть идеи?
Как считать счетчик тактов CPU или 64-х битный mactime?
Код:
/* MAC_TIMER64BIT_COUNT: 0x3ff21048
* Step: 1us * wDev_MacTim1Arm() */
#define MAC_TIMER64BIT_COUNT_ADDR 0x3ff21048
uint64 ICACHE_FLASH_ATTR get_mac_time(void)
{
    union {
        volatile uint32 dw[2];
        uint64 dd;
    }ux;
    volatile uint32 * ptr = (volatile uint32 *)MAC_TIMER64BIT_COUNT_ADDR;
    ux.dw[0] = ptr[0];
    ux.dw[1] = ptr[1];
    if(ux.dw[1] != ptr[1]) {
        ux.dw[0] = ptr[0];
        ux.dw[1] = ptr[1];
    }
    return ux.dd;
}
Step: 1us phy_get_mactime(), system_get_time()
uint32 system_relative_time(void) {
return *((uint32*)0x3FF20C00);
}
#define system_get_time() (*((volatile unsigned int *)(0x3FF20C00)))
extern "C" unsigned xthal_get_ccount(void)
#define system_get_cpu_clk_count() xthal_get_ccount()
! :rolleyes: Сейчас появилась идея сделать всё наоборот - не посылать синхроимпульсы с "базы" на сенсор, а с сенсорного блока на базу и там делать все вычисления. Т.е. делать синхронизацию базы по сенсора. В результате ЕСПке на сенсоре не надо ничего вычислять а только посылать импульсы, скажем 1Гц. Обратная связь не нужна. Импульс срабатывания сенсора посылается в промежутке между синхроимпульсом. Кажется идеальный вариант - никто никому не мешает, процессор не нагружен и вся работа только по 2-м прерываниям. Кажется я ничего не упустил.
Но надо знать отклонения (на сколько спешат или отстают часы устройств).
Без обратной связи быстро точность не получить...
Выходит как-бы кольцо в котором два генератора передают отклонения друг другу и в итоге синхронизируются на одну частоту с метками. Это задача отличается от синхронизации к внешнему источнику - всяким NTP или PTP. Она проще. В/к этом/у же кольце/у и привязаны данные с датчиков и съем из него для совмещения с другими происходит асинхронно с фильтрацией и аппроксимацией данных...

Да, обязательно отключите все sleep режимы у WiFi, иначе пинг будет несколько десятков ms.
 
Последнее редактирование:

sasasa

Member
Но надо знать отклонения (на сколько спешат или отстают часы устройств).
Без обратной связи быстро точность не получить...
Я думаю что не надо. По полученным сигналам база сможет вычислить работу генераторов импульса сенсорных блоков. Сигналы с экстремальным отклонением будет удалены. Уже после несколько минут нестабильность задержки пакетов на столько снизится путём усреднения, что не повлияет на результат. А сигнал срабатывания самого сенсора будет вычисляться по отношении к генератору синхросигналов сенсорного блока. Я не вижу необходимости в обратной связи. Это при условии что время передачи/приёма пакетов не плавает в таких экстремальных пределах как сейчас у меня. Хотя бы в 200мкс уложится, не время отклика а разница задержек.
 

pvvx

Активный участник сообщества
Та я привык делать всё до нормального уровня, если это рабочий вариант, а не игрушка... Если вам хватит точности простыми путями - то пробуйте...
 
Сверху Снизу