• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

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

sasasa

Member
sens12.jpg
соединить два сенсора с ESP(1) проводом.
С проводом они сейчас. Задача сделать соединение сенсоров с базой беспроводными.
Быстродействие сенсора пока не измеряли. Думаю что <5мкс. Это время Пьезо или оптика + срабатывания триггера шмитта и RS триггера
Вариант похожий на ваш "Вариант 2" сейчас тестируется, только с одной ЕСПкой, но хочется использовать только ESP8266 в сенсорном блоке вместо Ардуино+nRF24
 
Последнее редактирование:

sasasa

Member
nikolz, И в каких пределах будет ошибка без синхронизации ЕСПки на сенсоре? 0.5секунды?
 

sasasa

Member
Зачем синхронизация на сенсорах?
Она вообще не нужна на сенсорах.
Не понял!!
Сигнал с одного сенсора приходит за 0.5-1мс, сигнал с другого также. В сумме ошибка 1-2мс. Как её уменьшить до требуемых 5мкс без синхронизации таймеров?
Это я написал идеальный варианат. Пока у меня Пинг 4-94мс (!)
 

pvvx

Активный участник сообщества
Не всё понял из прочитанного. Типа все модули работающие по WiFi уже на железном уровне делают себе синхронизацию или это надо как то задействовать/активировать программно?
Типа да. Данный 64-х битный счетчик - это наверно и есть MAC_TIMER64BIT_COUNT: 0x3ff21048 Step: 1us
 

pvvx

Активный участник сообщества
Увы,Вы ничего не поняли.
Зачем синхронизация на сенсорах?
Она вообще не нужна на сенсорах.
Подумайте внимательно.
Думаю..... Стоит 4 микрофона по углам бункера 100x100 метров. Где-то в потемках там бродит Nikolz. Как по его воплям определить его местоположение?

Ущё для детей: Стоит 3 датчика освещенности разнесенные на 100 метров. Задача определить скорость движения облаков... (над Nikolz)

nikolz, И в каких пределах будет ошибка без синхронизации ЕСПки на сенсоре? 0.5секунды?
Nikolz не знает как работает WiFi. Вообще. В сети стоит координатор в виде AP кому и когда орать в эфир...

Полу-авто-перевод:
Стандарт 802.11 определяет функцию временной синхронизации (TSF) для поддержания общей развертки между узлами в сети. TSF требует, чтобы каждый узел реализовал 64-разрядный счетчик, который инкрементирует каждую микросекунду. Каждый узел поддерживает свой собственный таймер TSF и выводит микросекунд из своего собственного локального генератора. В инфраструктуре сети, схема синхронизации TSF обозначает таймер микросекунд на AP в качестве авторитетного времени для сети. В рамках своей нормальной работы AP передает кадры маяка на некотором заранее определенном интервале (обычно 102400 мксек). Каждый кадр маяка содержит 64-битное значение таймера TSF точки доступа в тот момент, когда происходит передача. Критически, поле временной метки радиомаяком должен быть установлен в момент передачи, а не во время создания пакета. Это гарантирует значение временной метки точно отражать любые задержки передачи. Каждая Station в сети, которая получает маяк от AP должна обновить свой локальный таймер микросекунд значением метки времени, содержащейся в маяке. С большой долей вероятности эта схема обеспечивает общую развертку по всей сети, с временными сдвигами между узлами, ограниченных максимальным дрейфом генератора в одном сигнальном интервале (между беаконами?).

Не знаю как в ESP8266, в RTL871x нашлось сразу это:

Код:
void CheckTSFIsStable(int ReqState);
int update_TSF(_DWORD, _DWORD, _DWORD);
void update_TSF(mlme_ext_priv *pmlmeext, uint8_t *pframe, unsigned int len);
void correct_TSF(_adapter *padapter, mlme_ext_priv *pmlmeext);
uint64_t TSFValue; // в struct mlme_ext_priv
Поищу, если что найду, то и попробую встроить в rtlDuino синхронизацию для таких проектов...

Получается что постоянно работающий счетчик с шагом 1 us на AP у вас есть, а на station надо его найти.
В esp есть такие функции:
Код:
uint32 system_get_time(void)
{
    return WdevTimOffSet + *((uint32*)0x3FF20C00);
}

uint32 system_relative_time(void)
{
    return *((uint32*)0x3FF20C00);
}
Но почему они 32-х битные - не понятно. Они тоже считают в 1 us от того-же счетчика, что давал ранее, а system_get_time имеет какую-то добавку-поправку...
 
Последнее редактирование:

pvvx

Активный участник сообщества
Посмотрел и... ничего не понял. КАК это всё использовать и КАК написать/переписать код для быстрого приёма/передачи пакета. Как и где увидеть/прочитать timecode у принятого пакета?
Для ESP8266 - не знаю. Там код драйвера WiFi за семью печатями (скрыт многими китай слоями в бинарной либе).
Вам не требуется никакого быстрого приема-передачи. Когда считываете показания с датчика, то тут-же считываете значение счетчика TSF и неспешно передаете их на AP. На AP есть аналогичный счетчик TSF и вы знаете когда был считан датчик с точностью до десятка us.
Все недовольства, что не можете получить значения из WiFi на ESP направляйте в Espressif и Nikolz (он их очень любит :)).
 
Последнее редактирование:

pvvx

Активный участник сообщества
Почему то мне Ардуино ИДЕ ругается про WdevTimOffSet
error: 'WdevTimOffSet' was not declared in this scope
Там надо добавить какую то библиотеку?
Это "Reverse engineering" китайских кодов в закрытой либе WiFi EPS8266. Функция uint32 system_get_time(void) описана в user_interface.h, а это её "сикретные" потроха.
uint32 WdevTimOffSet сидит в закрытой либе libmain.a или libpp.a.
Просто эти функции обращаются к тому-же аппаратному таймеру-счетчику, который считает 64-х битный TSF, но где его прибавка-offset для station я не знаю.
Спрашивайте или пишите на Espressif сайте или просите у Nikolz - он любит у них попрошайничать... у него с ними наверно личная связь :)
Другим они отвечают только это: Thanks for your interest in ESP8266 ! и приговаривают, что они подумают... годами....
Вот стандарт у них на данный вопрос: Hardware timestamping - ESP8266 Developer Zone - Так и обновляют уже годы. :)
 
Последнее редактирование:

pvvx

Активный участник сообщества
Вот это надо sasasa:
Счетчики TSF на модуле от Station и от AP:
TSF_ESP8266_AP.gif TSF_ESP8266_ST.gif
Ткнуть кнопку одновременно с запросом и ответом через websocket от web-сервера и выдачей beacon-a модулями я не могу :)
У китай-Espressif счетчик TSF для station не доделан и на SDK 2.x... По этой причине модуль ведет себя ужасно в группе - создает коллизии другим кое-как отсчитанным интервалом от беаконов AP...
TSF в ESP на station вставляется только путем бинарного патча китай-WiFi либы - помочь тут ничем не могу...
При приеме beacon на ESP8266 от внешней AP он сохраняется в структуре cnx_???. Она объявлена локально в исходниках wl_cnx.o и внешнего имени не имеет. Структура инициализируется в функции cnx_attach() в сегменте bss и внешних ссылок с именами на неё нет - привет китайцам из Espressif :)
 
Последнее редактирование:

Сергей_Ф

Moderator
Команда форума
@pvvx а если все ЕСПишки загнать в режим WIFI_AP_STA, это не даст возможность получать TSF и передать его на хост, для вычисления синхронизационной дельты уже на хосте?
 

pvvx

Активный участник сообщества
@pvvx а если все ЕСПишки загнать в режим WIFI_AP_STA, это не даст возможность получать TSF и передать его на хост, для вычисления синхронизационной дельты уже на хосте?
На картинке ESP8266 работает в режиме AP+ST с моей web-свалкой и патченной китай-либой. Т.е. у меня все TSF счетчики доступны и частично сделана коррекция для station. Исходников нет - патчено вручную :)
Распространять не буду - пусть китайцы думают :)
Чтение аппаратного 64-х битного счетчика TSF в 1 us от AP ESP изначально доступно в web-свалке всем ~sys_mactime~ .
С помощью этих TSF можно синхронизировать разнесенные по wifi звуковые колонки...
Но увы - я думаю, что это не будет возможно и на ESP-32S.

Передавать ничего не надо. Всё само. Для более сложной синхронизации (в наносекунды) уже надо что-то тусовать... TSF счетчик на Station модуля идет синхронно с счетчиком AP, куда соединен модуль. Без него связь по WiFi невозможна. Чем он точнее, тем меньше коллизий в сети, что не сказать о ESP8266 c китай-либой...
 
Последнее редактирование:

sasasa

Member
Поэтому имеет значение лишь постоянство этого запаздывания.
Вот именно - ПОСТОЯНСТВО! А я же написал 0.5-1мс. А это значит что "ПОСТОЯНСТВО" плавает с 0.5мс у каждого сенсора, что в итоге на 2 сенсора даёт 1мс. Ну и как же эту 1мс уменьшить до 5мкс?
Уточним задачу .
Два сенсора срабатывают независимо друг от друга. Надо измерить интервал времени между этими событиями.
Верно?
Поясните что именно Вы измеряете.
Всё правильно.
Некий объект ударяется об одно препятствие (1-й сенсор) и потом через ~100м об другое препятствие(2-й сенсор). Требуется узнать интервал времени и сколько разница в разных циклах с итоговой точностью 20мкс. Указанные 5мкс при измерении это с запасом на возможные ошибки сенсоров, таймеров, передатчиков итд.
 

sasasa

Member
Передавать ничего не надо. Всё само.
Что то я совсем не понимаю. Получается, что если две ЕСПки запустить как AP-STA, одной из них сделать connect to AP, то они сами будут себя синхронизировать и мне только остаётся посылать сигнал сенсора и не надо ничего думать о синхронизации? И только по таймкодам пакетов вычислить разность? Что то не верится что так просто.. Может быть я что то не до конца понял от вами написанного? Но если всё так, то как из пакета прочитать таймкод?
Или всё же мне надо самому вставить sys_mactime в пакет сигнала?
Может быть есть какие то альтернативы ЕСПке, которые полностью поддерживает всю TSF структуру без кривых кодов?
 
Последнее редактирование:

sasasa

Member
Т е на точность измерения влияет лишь нестабильность работы сенсоров и измерителя.
И как же флуктуация времени передача/приём? Вы видели мою картинку с Ping?
!! Как вы обеспечите стабильность времени передачи/приёма в пределах 5мкс???
UDP или ICMP будет меньше но не в 2000 раз.
Что такое ESP-NOW пока не изучил. Как она работает и какие временные интервалы?
И что делать если пакет потеряется? Теряем результат и в итоге ERROR o_O
 

Вложения

Последнее редактирование:

sasasa

Member
Эта картинка пинга с компа?
Да, это с планшета, Андроид. Согласен с "результат работы многозадачной ОС"
сигнал от второго сенсора пришел - посчитали разность.
Сколько (в мкс) по вашим замерам флуктуация интервала передача-приём?
И будет ли она постоянно не зависимо от расстояния и посторонних помех?
И остаётся под вопросом что делаем если один из пакетов потерян/не принят???
 
Сверху Снизу