arduino 2560 и таймер

leshak
Offline
Зарегистрирован: 29.09.2011

 Кстати, если платы "лежат рядом" (при радио-канале это не прокатит), то можно попробовать тики одной, вывести на ногу и подать их как external clock для другой. Тогда если они и будут "плавать" от внешних условий, то только "полностью синхронно". В этом случае "внешние михросхемы" не потребуются. Ну, конечно, если само "плавание" не критично, а важна именно "синхрононость".

rndvip
Offline
Зарегистрирован: 04.03.2012

Я правилбно понял, в описании RTC DS3231, указано:

Точность ±2 ppm в диапазоне температур от 0°C до +40°C
Точность ±3.5 ppm в диапазоне температур от-40°C до +85°C

 

2ppm если я правильно понял, то это аналог 0,0002%... те на каждые 1млн мс, она может давать погрешность в +-2мс...те приблизительно каждые 8 минут она может давать погрешность в 1 мс.  Правильно?

 

leshak
Offline
Зарегистрирован: 29.09.2011

 Похоже на то. Но не уверен от чего эти проценты считаются. Возможно от микросекунд. Из даташита это не совсем ясно.

Но не забывайте что это "плюс/минус". То есть погрешности могут взаимно компенсироватся. Так же неизветсно методика по которой считали. Возможно 2ppm это "граничный случай", когда температура действительно менялась от 0 до 40-а. А вдомашних условиях все будет "чуть-чуть точнее".

Вот тут www.radioradar.net/news/electronics_news/2005-06-21_08-36-05.html говорится что 2ppm это примерно ±2 минуты в год. Там же говорится, что обычный кварц дает ±100 минут в год и хуже.

 

rndvip
Offline
Зарегистрирован: 04.03.2012

За 3 часа работы время на платах все еще идет синхронно, но уже отстало от времени пк на ~300мс

leshak
Offline
Зарегистрирован: 29.09.2011

 Точность ПК тоже не известна. Даже если он сихронайзится с атомными часами, вряд ли он это делает очень часто.

К тому же когда мы на нем замеряем, у нас есть еще куча процессов в памяти. Которые могут внести свою поправку. Получается нужно еще и второй ПК и смотреть расходятся-ли они :) 

loginex
Offline
Зарегистрирован: 19.02.2012

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

Надо вернуться еще на первую страницу обсуждения, но сначала у меня есть пара вопросов и замечаний.

1. rndvip: Какая у вас модель arduino ? Есть ли на ней кварцевый резонатор

вот такой вот

А то у вас счетчики millis еще хоть лучше идут, чем у меня, мне же приходиться их корректировать по формуле:

реальное_время_а = присланное_время_модуля_а - присланное_время_модуля_а*0.0010833

Тогда еще более менее точно все идет.

2. leshak. Откуда у вас информация, что в атмеле(в частности мега 2560) встроен свой собственный исцелятор, по которому ведется счетчик mills ??? У меня на плате, к примеру, он точно внешний, хоть и керамический. Планирую перепаять на кварц в ближайшее время.

3. leshak. Для внешнего таймера нужна будет шина i2c, а так же большая рарзешающая способность (2^32 бита) счетчика для милисекунд(т.к. они будут являться квантами времени). И я все равно не вижу ни единого намека на то, что эта система будет точнее таймера в ардуино, если тактировать импульсы кварцевым резонатором, а не керамическим, как у меня сейчас.

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

leshak
Offline
Зарегистрирован: 29.09.2011

loginex пишет:

2. leshak. Откуда у вас информация, что в атмеле(в частности мега 2560) встроен свой собственный исцелятор, по которому ведется счетчик mills ??? У меня на плате, к примеру, он точно внешний, хоть и керамический. Планирую перепаять на кварц в ближайшее время.

Из даташита конечно. В данном случае он выступает библией "в которой все есть". Ардуино или нет, а в конечном итоге его читать приходится. www.atmel.com/Images/doc2549.pdf на первой же странице. Перечисление "фичей" которые есть в камне содержат ""Internal Calibrated Oscillator". Только использовать его "очень не рекомендуется". Только в случае если "точность ну совсем не важна". На странице  405 можно найти графики зависимости его частоты от температуры и питания. Но достаточно знать что он "очень плохой стабильности". К тому же более 8MHz он не даст.  По умолчанию, голый камень, использует именно его.

Использовать "внешний", это уже включили на заводе когда заливали ардуино-бутлоадер.

Поэтому если нужны 16MHz (что предполагают тайминги многих ардуино-библиотек) - пожалуйте внешний.

 

loginex пишет:

3. leshak. Для внешнего таймера нужна будет шина i2c,

Не нужна. i2c вообще тут не причем. По ней вы точнее, по крайней мере с dsXXX десятых секунды ничего не получите.

Речь шла совсем про другой механизм. DS3231 позволяет выводить на одну из своих ног сигнал программируемой частоты. То есть выводим на нее 16Mhz, и подаем ее на atmeg2560 в качестве external clock source (страница 41 даташита), вместо кварцевого резонатора. 

Вообщем получается все таймеры и проч. работают точно также. Логика не меняется. Только для тактирование используется более стабильный источник. Можете себе представить что DS3231 это такой "ОЧЕНЬ стабильный кварц".

loginex пишет:

И я все равно не вижу ни единого намека на то, что эта система будет точнее таймера в ардуино.

Конечно не будет. Потому что и в том и другом случае используется  "таймер в ардуино". Вопрос только в том что использует сам этот таймер в качестве опорного, тактирующего сигнала. Грубо говоря "кто барабанщик в этом оркестре". DS3231 может барабанить с погрешностью 2pps,  внешний резонатор с погрешностью >=100pps. То есть итоговая разница точности будет в 50-т раз и больше.

Кстати, на этом принципе основывается и реанимация кристалов. Если по ошибке случайно выставили FUSE биты на использование external clock. А самого external clock - нет. Кристал выглядит как "дохлый", не может выполнить ни одного такта. Даже что-бы правильно перепрошить FUSE биты. Тогда его берут банально пальцем за ногу "внешних часов" и выступают в качестве "внешнего источника тактов". В теле есть наведенные из электропроводке 50Hz. И кристал, хотя ОЧЕНЬ МЕДЛЕННО, и печально - начинает работать на частоте 50Hz. И его можно перепрошить без внешних программаторов.

 

loginex
Offline
Зарегистрирован: 19.02.2012

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

leshak
Offline
Зарегистрирован: 29.09.2011

 Если все понятно, то в чем же вопрос?

Но ведь "внешние" тоже разные бывают.

Как я понял, качество текущего внешнего тактового не устраивает. А раз не устраивает значит нужно искать более качетственный внешний. Им может выступить DS3120.

Нет, ну не хотите ее использовать - как хотите. Я не их рекламный агент :) Считаете что резонаторы будут лучше (или их точности достаточно) - используйте.

Просто если бы мне поставили задачу "повысить точность хода часов ардуины" - я бы попробовал сделать именно так. Сам я тоже использовал только кварц, когда собирал свои конечные устройства. Так что все мои размышление только "чтение документации + здравый смысл". Но наверное как только доберусь до радио-рынка попробуй купить DS3120 и проверить свои "теоретические выкладки" :)

Кстати, если не трудно, выложите свой код который занимается "удаленной синхронизацией". Интерестно посмотреть, а может и пригодится в будущем.

 

 

rndvip
Offline
Зарегистрирован: 04.03.2012

leshak пишет:

 Кстати, если не трудно, выложите свой код который занимается "удаленной синхронизацией". Интерестно посмотреть, а может и пригодится в будущем.

// Возьмем время сейчас
                            TimeSpan tsend = DateTime.Now.TimeOfDay;
                            // Вычтем из него, половину средне получившегося времени на пусть пакета туда и оборатно
                            TimeSpan setTime = tsend + new TimeSpan((long)Math.Round(10000 * sendReciveAvDelay / 2, 0));
                            // округлим до целых мс
                            long ul = (long)Math.Round(setTime.TotalMilliseconds);
                            // отправим
                            ArduinoMessageClass sendMessage = SetTimeMessage(ul);
                            SendMessage(sendMessage);
                            // читаем
                            ArduinoMessageClass recivedMessage = ReciveMessage();
                            TimeSpan trecive = DateTime.Now.TimeOfDay;
                            if (syncTimeCount<10)
                            sendReciveAvDelay = sendReciveAvDelay == 0 ? (trecive - tsend).TotalMilliseconds : (sendReciveAvDelay + (trecive - tsend).TotalMilliseconds) / 2;

 Какк то так...а на плате, просто принимаю мессадж, и устанавливаю время.

rndvip
Offline
Зарегистрирован: 04.03.2012

loginex пишет:

1. rndvip: Какая у вас модель arduino ? Есть ли на ней кварцевый резонатор

вот такой вот

А то у вас счетчики millis еще хоть лучше идут, чем у меня, мне же приходиться их корректировать по формуле:

реальное_время_а = присланное_время_модуля_а - присланное_время_модуля_а*0.0010833

Ну вроде такой...на нем сверху 16,ORG9 написано

loginex
Offline
Зарегистрирован: 19.02.2012

rndvip, а модель арудины какая ? 2560 ?? там на плате их должно быть тогда 2. Один для at8u2 и один для атмеги.

rndvip
Offline
Зарегистрирован: 04.03.2012

loginex пишет:

rndvip, а модель арудины какая ? 2560 ?? там на плате их должно быть тогда 2. Один для at8u2 и один для атмеги.

надеюсь в меня камни ща не полетят)) у меня вот это

только один на плате

loginex
Offline
Зарегистрирован: 19.02.2012

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

Ну или не так сильно...

loginex
Offline
Зарегистрирован: 19.02.2012

более менее помогла перепайка на кварцевый резонатор с конденсаторами. Теперь одно от друго отстает на 30 мс раз в 40 минут. Что вполне допустимо, когда как раньше было раз в 5 сек на 5мс.

Почитал я даташит на атмел 2560 и там четко написано, что ЗАПРЕЩЕНО устанавливать керамические осциляторы более чем на 10мгц, а Итальянцы\Китайцы их ставят, тем самым нарушая техническое условие, что в итоге приводит к таким вот последствиям.

Теперь жду беспроводные модули, буду тестировать радиопередачу, выявлять и компенсировать задержки.

grenadeer
Offline
Зарегистрирован: 06.11.2012

Ну и чем всё закончилось? очень интересна эта тема, и еще вопрос, какие датчики использовались на концах? вот что нужно мне http://arduino.ru/forum/proekty/telemetriya-dlya-gonok-402-metra-na-osnove-arduino

loginex
Offline
Зарегистрирован: 19.02.2012

Да сделал телеметрию как у вас,  даже 2 штуки(одну продал). Датчики надо самому делать, даже промышленные не подходят. Кстати без всякого ноутбука, чисто аппаратно сами все делают. Синхронизация времени - это самая сложная часть, кодом делится не буду, скажу, что за основу взял алгоритм протокола NTP

grenadeer
Offline
Зарегистрирован: 06.11.2012

Цена вопроса, если не секрет? какой в итоге предел погрешности по времени получился? и на основе чего датчики?

loginex
Offline
Зарегистрирован: 19.02.2012

Себестоимость где-то тысяч 15 рублей за все про все. Погрешность не мерили, но не должна превышать 0.005с, в идеале 0.001с + какая-то статическая погрешность до +0.004с возможна к результату, но ее надо было проверить на практике и вычислить.

grenadeer
Offline
Зарегистрирован: 06.11.2012

На заказ не делаете? где использовали, функционал можно поподробнее?

loginex
Offline
Зарегистрирован: 19.02.2012

делаем, почему не сделать. цена правда на продажу повыше) надо же как-то оценить инженерный труд. только форум тут врядли одобрит комерческие разговоры, лучше через почту, она такая же, как никнейм, @gmail.com

grenadeer
Offline
Зарегистрирован: 06.11.2012

ок. отписался.

rndvip
Offline
Зарегистрирован: 04.03.2012

Мне интересно, как эту погрешность померять?... в идеале нужен какойто супер точный прибор, по которому можно оценивать... а так, при паралельном замере двух участников, на практике погрешность не превышает 0.001

step962
Offline
Зарегистрирован: 23.05.2011

rndvip пишет:
Мне интересно, как эту погрешность померять?...

Запустить одновременно оба прибора, запрограммировав их на выдачу импульса через определенный промежуток времени. С помощью секундомера измерить разницу во времени прихода импульса от первого и второго прибора. Разницу поделить на этот промежуток времени - вто вам и погрешность.
Цитата:
в идеале нужен какойто супер точный прибор, по которому можно оценивать... а так, при паралельном замере двух участников, на практике погрешность не превышает 0.001

Секундомера на базе любого микроконтроллера (ну, хотя бы третья ардуина) хватит за глаза. Все зависит от того самого запрограммированного промежутка времени. Будете на базе 10 секунд мерять уход часов - потребуется микросекунды ловить (что для таймера, в общем-то, отнюдь не непосильная задача). Наберетесь терпения на 17 минут (миллион миллисекунд) - можете даже с помощью стандартных функций (millis/micros) достаточно точно определить это расхождение.

rndvip
Offline
Зарегистрирован: 04.03.2012

step962 пишет:
rndvip пишет:
Мне интересно, как эту погрешность померять?...
Запустить одновременно оба прибора, запрограммировав их на выдачу импульса через определенный промежуток времени. С помощью секундомера измерить разницу во времени прихода импульса от первого и второго прибора. Разницу поделить на этот промежуток времени - вто вам и погрешность.
Цитата:
в идеале нужен какойто супер точный прибор, по которому можно оценивать... а так, при паралельном замере двух участников, на практике погрешность не превышает 0.001
Секундомера на базе любого микроконтроллера (ну, хотя бы третья ардуина) хватит за глаза. Все зависит от того самого запрограммированного промежутка времени. Будете на базе 10 секунд мерять уход часов - потребуется микросекунды ловить (что для таймера, в общем-то, отнюдь не непосильная задача). Наберетесь терпения на 17 минут (миллион миллисекунд) - можете даже с помощью стандартных функций (millis/micros) достаточно точно определить это расхождение.

Максимальная разность во времени зафиксированная между импульсами двух ардуин составила 0.0008

Опережении часов одной ардуины от другой составляет 0.001 с на каждые ~12.6 с или ~126 с (сейчас нет под рукой записей чтоб проверить). Вычеслино на практике между двумя конкретными ардуинами.

step962
Offline
Зарегистрирован: 23.05.2011

rndvip пишет:

Максимальная разность во времени зафиксированная между импульсами двух ардуин составила 0.0008


мксек/мсек/сек/...?
Цитата:

Опережении часов одной ардуины от другой составляет 0.001 с на каждые ~12.6 с или ~126 с (сейчас нет под рукой записей чтоб проверить). Вычеслино на практике между двумя конкретными ардуинами.


Погрешность то ли 8 (при базе 126 сек - не оч.хор.), то ли 80 (существенно превышает паспортные данные) промилле.

rndvip
Offline
Зарегистрирован: 04.03.2012

step962 пишет:
rndvip пишет:

Максимальная разность во времени зафиксированная между импульсами двух ардуин составила 0.0008

мксек/мсек/сек/...?
Цитата:

Опережении часов одной ардуины от другой составляет 0.001 с на каждые ~12.6 с или ~126 с (сейчас нет под рукой записей чтоб проверить). Вычеслино на практике между двумя конкретными ардуинами.

Погрешность то ли 8 (при базе 126 сек - не оч.хор.), то ли 80 (существенно превышает паспортные данные) промилле.

Разность между импульсами двух плат не превышает 0.0008 сек (0.8 мсек)

Каждые 12.6 сек набегает разность во времени между двумя платами 0.001 сек (1 мсек), те на одной часы идут быстрее

Вроде правильно выразился...

Не понял про погрешность... в часу 3600 сек, в сутках 86400 сек, те если поправка каждые 12.6 сек...то это около 6857 раз за сутки....сумарно около 6.8 сек за сутки, вроде все в норме.

 

 

step962
Offline
Зарегистрирован: 23.05.2011

rndvip пишет:
Разность между импульсами двух плат не превышает 0.0008 сек (0.8 мсек)

На секундной базе, надо полагать?
Цитата:

Каждые 12.6 сек набегает разность во времени между двумя платами 0.001 сек (1 мсек), те на одной часы идут быстрее

"По паспорту" (на вышеприведенные RTC DS3231) должно набегать не более 2*2/1000000*12.6 = 0.00005 сек. Есть резерв для повышения точности
Цитата:

Не понял про погрешность... в часу 3600 сек, в сутках 86400 сек, те если поправка каждые 12.6 сек...то это около 6857 раз за сутки....сумарно около 6.8 сек за сутки, вроде все в норме.
Ну, если полученная точность удовлетворяет - то да, в норме. Но резервы для оптимизации имеются.

rndvip
Offline
Зарегистрирован: 04.03.2012

step962 пишет:
rndvip пишет:
Разность между импульсами двух плат не превышает 0.0008 сек (0.8 мсек)
На секундной базе, надо полагать?
Цитата:
Каждые 12.6 сек набегает разность во времени между двумя платами 0.001 сек (1 мсек), те на одной часы идут быстрее
"По паспорту" (на вышеприведенные RTC DS3231) должно набегать не более 2*2/1000000*12.6 = 0.00005 сек. Есть резерв для повышения точности
Цитата:
Не понял про погрешность... в часу 3600 сек, в сутках 86400 сек, те если поправка каждые 12.6 сек...то это около 6857 раз за сутки....сумарно около 6.8 сек за сутки, вроде все в норме.
Ну, если полученная точность удовлетворяет - то да, в норме. Но резервы для оптимизации имеются.

Я с Вами согласен...надо будет еще раз все проверить. Спасибо.