Несколько вопросов по DS3231

AntonM
Offline
Зарегистрирован: 22.10.2015

Всем Привет!

Собираю систему хронометража, планировал делать секундомер с помощью внешного прерывания (attachInterrupt), но к сожалению синхронизовать несколько Ардуино-плат оказалось невозможным - за 2,5 часа разбег у трех модулей был около 4 секунд.

В качестве альтернативы был приобретен модуль RTC DS3231. Секунды хочу считать им, а миллисекунды - делать засчёт прерывания. 

В связи с этим вопрос - функция Clock.getSecond() даст мне значение секунд от 0 до 59, или общее количество секунд с начала синхронизации?

 

Заранее спасибо за ответы!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

0-59, но откуда такой вопрос? Что Вам мешало просто попробовать? Намного быстрее получилось бы.

AntonM
Offline
Зарегистрирован: 22.10.2015

ЕвгенийП пишет:

0-59, но откуда такой вопрос? Что Вам мешало просто попробовать? Намного быстрее получилось бы.

Приобретен в интернет-магазине, пока идёт - пишу скетч, времени очень мало до гонок.
Спасибо за инфу!

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

AntonM пишет:

планировал делать секундомер с помощью внешного прерывания (attachInterrupt), но к сожалению синхронизовать несколько Ардуино-плат оказалось невозможным - за 2,5 часа разбег у трех модулей был около 4 секунд.

А вам не приходило в голову, что вы неправильно сделали счёт времени в этом варианте?

AntonM
Offline
Зарегистрирован: 22.10.2015

Могу предоставить код. Но вроде сделал всё верно...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

AntonM пишет:

Могу предоставить код. Но вроде сделал всё верно...

Можете представить, а можете не представлять - дело Ваше, проблема-то у Вас. Только, если сделано верно, то всё должно работать точно - чему там расходиться, если одна ардуина тактирует все остальные своим сигналом вызывая у них прерывания?

AntonM
Offline
Зарегистрирован: 22.10.2015

ЕвгенийП пишет:

AntonM пишет:

Могу предоставить код. Но вроде сделал всё верно...

Можете представить, а можете не представлять - дело Ваше, проблема-то у Вас. Только, если сделано верно, то всё должно работать точно - чему там расходиться, если одна ардуина тактирует все остальные своим сигналом вызывая у них прерывания?


Возможно Вы меня не поняли. Имеется 3 модуля Arduino Nano, на каждом из которых прописаны прерывания по ИК-датчику.
При совершенно одинаковом программном коде идёт расхождение по времени. Я понимаю, это из-за неодинаковости частоты у установленных на модулях кварцев.

ВН
Offline
Зарегистрирован: 25.02.2016

И как часто происходила синхронизация по ИК каналу?

Зы. 

AntonM пишет:
 Возможно Вы меня не поняли.
https://www.youtube.com/watch?v=wxlEQsIYL8Q

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

AntonM][quote=ЕвгенийП пишет:

Возможно Вы меня не поняли. Имеется 3 модуля Arduino Nano, на каждом из которых прописаны прерывания по ИК-датчику. При совершенно одинаковом программном коде идёт расхождение по времени. Я понимаю, это из-за неодинаковости частоты у установленных на модулях кварцев.

Я действительно Вас не понял. Т.е. никакой синхронизации Вы не производите, просто надеетесь, что они сами автономно будут работать с одинаковой скоростью? Таки нет. И RTC тоже не поможет.

А если Вы реально будете проводиь синхронизацию через какое-то время, то ошибка нарастать не может, т.к. каждый раз всё будет синхронизироваться.

ВН
Offline
Зарегистрирован: 25.02.2016

Там видно ошибка набегала за счет относительно частой синхронизации и болтания при этом фронтов у ИК импульсов.

AntonM
Offline
Зарегистрирован: 22.10.2015

Объясняю подробно =)

ИК-датчик у меня фиксирует пересечение луча датчика. К синхронизации он не относится.

Синхронизация у меня проводится через широковещательный запрос по UDP по Wi-Fi, через шильды ESP-201, тоесть практически одновременно синхронизируются.

Прерывание у меня настроено на каждые 1000 микросекунд:

Timer1.initialize(1000);                                // 1000000ms=1s 
Timer1.attachInterrupt(timer);                          // объявляем таймерное прерывание 
attachInterrupt(0, detect, RISING);                     // объявляем прерывание по 0 ножке

void timer() {
time0++;                                                 // общее время 
}

В итоге что у нас происходит - синхронизация проходит успешно

При этом, запускается программа-отладчик на компьютере, которая по UPD запрашивает таймеры с датчиков.

Итоги вот:

~ 1 минута:
R[192.168.0.101:10010]: SN0000f2d2-0 —> 62162 —> 00:01:02,162
R[192.168.0.102:10010]: SN0000f2c3-0 —> 62147 —> 00:01:02,147
R[192.168.0.110:10010]: SN0000f2a9-0 —> 62121 —> 00:01:02,121

~ 2 минута:
R[192.168.0.101:10010]: SN0001d4e3-0 —> 120035 —> 00:02:00,035
R[192.168.0.102:10010]: SN0001d4c1-0 —> 120001 —> 00:02:00,001
R[192.168.0.110:10010]: SN0001d491-0 —> 119953 —> 00:01:59,953

~ 5 минута:
R[192.168.0.101:10010]: SN0004aa4e-0 —> 305742 —> 00:05:05,742
R[192.168.0.102:10010]: SN0004aa03-0 —> 305667 —> 00:05:05,667
R[192.168.0.110:10010]: SN0004a980-0 —> 305536 —> 00:05:05,536

~ 10 минута:
R[192.168.0.101:10010]: SN0009270b-0 —> 599819 —> 00:09:59,819
R[192.168.0.102:10010]: SN00092683-0 —> 599683 —> 00:09:59,683
R[192.168.0.110:10010]: SN0009257c-0 —> 599420 —> 00:09:59,420

~ 15 минута:
R[192.168.0.101:10010]: SN000dc1cb-0 —> 901579 —> 00:15:01,579
R[192.168.0.102:10010]: SN000dc100-0 —> 901376 —> 00:15:01,376
R[192.168.0.110:10010]: SN000dbf6b-0 —> 900971 —> 00:15:00,971

~ 25 минута:
R[192.168.0.101:10010]: SN0016e5af-0 —> 1500951 —> 00:25:00,951
R[192.168.0.102:10010]: SN0016e453-0 —> 1500243 —> 00:25:00,243
R[192.168.0.110:10010]: SN0016e1b6-0 —> 1499574 —> 00:24:59,574

~ 40 минута:
R[192.168.0.101:10010]: SN0024a385-0 —> 2401157 —> 00:40:01,157
R[192.168.0.102:10010]: SN0024a155-0 —> 2400597 —> 00:40:00,597
R[192.168.0.110:10010]: SN00249d1e-0 —> 2399518 —> 00:39:59,518

~ 1 час 45 минута:
R[192.168.0.101:10010]: SN00602cd5-0 —> 6302933 —> 01:45:02,933
R[192.168.0.102:10010]: SN006026c9-0 —> 6301385 —> 01:45:01,385
R[192.168.0.110:10010]: SN00601bdc-0 —> 6298588 —> 01:44:58,588

~ 2 час:
R[192.168.0.101:10010]: SN006e084a-0 —> 7211082 —> 02:00:11,082
R[192.168.0.102:10010]: SN006e0154-0 —> 7209300 —> 02:00:09,300
R[192.168.0.110:10010]: SN006df4e4-0 —> 7206116 —> 02:00:06,116

~ 2 час 15 минута:
R[192.168.0.101:10010]: SN007ba6eb-0 —> 8103659 —> 02:15:03,659
R[192.168.0.102:10010]: SN007b9f1d-0 —> 8101661 —> 02:15:01,661
R[192.168.0.110:10010]: SN007b9112-0 —> 8098066 —> 02:14:58,066

 

Теперь надеюсь понятно для вас объяснил?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

AntonM пишет:

Синхронизация у меня проводится через широковещательный запрос по UDP по Wi-Fi, через шильды ESP-201, 

А-а-а, ну тогда, оно. конечно ... :)

AntonM пишет:

В итоге что у нас происходит - синхронизация проходит успешно

Я так и понял :)

AntonM пишет:

Теперь надеюсь понятно для вас объяснил?

Да, вполне.

 

AntonM
Offline
Зарегистрирован: 22.10.2015

Поэтому увы идею с attachinterrupt пришлось откинуть в мусор и перейти на RTC...

Joiner
Offline
Зарегистрирован: 04.09.2014

У DS3231 есть выход с импульсами от 1гц до 32768.....тоже можно как-то использовать.