Точность часов времени Arduino
В настоящее время я пытаюсь создать часы времени Arduino, используя библиотеку времени PJRC (http://www.pjrc .com/teensy/td_libs_Time.html). Я знаю, что, поскольку большинство плат Arduino работают с тактовой частотой 16 МГц и одним резонатором, время может рассинхронизироваться через определенный период времени.
Однако мне было интересно, есть ли у кого-нибудь представление о точности библиотеки времени при использовании на Arduino DUE с тактовой частотой 84 МГц. Я тестировал это, и на данный момент часы синхронизируются в течение нескольких часов. Спасибо!
@KK6FSL, 👍12
Обсуждение4 ответа
Лучший ответ:
Ограничения точности библиотеки зависят от точности кристалла. Когда они изготавливают или готовят кристалл, они могут сделать его точным только до определенной степени, а также окружающая среда кристалла (температура, влажность и т. д.) играют роль в его точности. Допустим, у вас есть кристалл, который отклоняется на 0,5 секунды каждый час, что отлично подходит для краткосрочной перспективе, но если вы растянете его на год, к этому времени он будет отставать более чем на 1 час. Если вы хотите, чтобы что-то сохраняло точное время в течение длительного периода, я предлагаю использовать часы реального времени (они все еще имеют неточности), модуль GPS или подключение к Интернету для синхронизации.
Для получения дополнительной информации см. статью в Википедии о кристаллах кварца
Использование кристалла с частотой 84 МГц вместо кристалла с частотой 16 МГц не обязательно улучшит точность часов Arduino, поскольку частота кристалла является скорее показателем скорости процессора, чем точности. Точность часов Arduino в первую очередь зависит от точности кварцевого генератора.
РЕДАКТИРОВАТЬ: я не эксперт по кварцевым генераторам, поэтому, если вы заметите здесь что-то не так, дайте мне знать
Средний кристалл вашей системы будет отклоняться на несколько десятков частей на миллион (частей на миллион). Они отлично подходят для стабильной и точной синхронизации сигналов, но очень важны для поддержания точного времени. Без специальных мер системный кристалл может отклоняться на несколько секунд. в день.
Решение состоит в том, чтобы использовать подходящие часы реального времени, приводимые в движение так называемым часовым кристаллом с частотой 32768 Гц. Точность этих кристаллов в 10 раз выше. Вы можете либо настроить свой собственный генератор, который прерывает работу основного процессора и вести подсчет в скетче Arduino, либо найти коммутационную плату RTC.
Два случайных примера, которые появляются в Google по запросу «прорыв RTC»:
- http://www.cutedigi.com/breakout-board/ds1302-rtc-breakout .html
- https://www.sparkfun.com/products/10160
Лучший способ узнать точность резонатора вашей платы — измерить его самостоятельно.
Для этого вы можете использовать функцию Arduino millis()
вашей платы и написать небольшой скетч, который:
- позволяют установить время начала измерения отклонения во времени (например, с помощью простой кнопки); вы активируете кнопку на основе точного времени.
- затем повторно вызывайте millis(), пока не пройдет как минимум 120 часов («ардуино-часы», это будет около 5 дней).
- показывать сигнал по истечении этих 120 часов (вероятно, ваш скетч должен «предупреждать» вас до того, как будет достигнуто точное время, чтобы вы были готовы к измерению)
- По истечении 120 часов проверьте исходное время (использованное на шаге 1) и проверьте, сколько времени прошло (должно быть 120 часов +/- эпсилон)
- как только вы узнаете ход ваших часов и при условии, что ваша плата будет работать в тех же условиях окружающей среды (в основном, температуре), что и ваши измерения, вы сможете использовать ее в своих скетчах для настройки
millis()
ценность каждого часа или около того.
Конечно, этот подход далек от совершенства, поскольку требует вмешательства человека и, таким образом, создаст дополнительные временные сдвиги во время измерений, поэтому вам необходимо измерить время своих часов. дрейфует в течение длительного периода.
Улучшенный подход — подключить к плате высокоточные часы RTC (точность должна быть выбрана в зависимости от точности, необходимой для вашего приложения) и адаптировать скетч так, чтобы он автоматически рассчитывал дрейф. Как только вы получите сдвиг времени, вы можете сделать то же самое, что и шаг 5 выше в своих скетчах, и отсоединить часы RTC от вашей платы.
Важные моменты:
- измерьте временной сдвиг на плате, для которого позже потребуется корректировка часов (если у вас несколько плат, вы должны измерить один сдвиг на каждой плате)
- обеспечьте стабильность среды, в которой будет использоваться ваша плата.
Наконец, если вам действительно нужна высокая точность, обязательно подключите внешний источник синхронизации (например, часы RTC, GPS, NTP) к вашей плате и используйте его в качестве SyncProvider для библиотеки PJRC.
Возвращаюсь к старому вопросу... поскольку я нашел очень информативную запись в блоге это проливает на это новый свет. Но позвольте мне сначала представить некоторый контекст прежде чем давать ссылку.
При оценке качества временной основы, будь то кристалл, керамика резонатор или лабораторный стандарт частоты, есть два понятия, которые следует различать:
- точность: насколько близка частота временной развертки к ее номинальная стоимость
- стабильность: насколько эта частота меняется со временем.
Точность важна, если вы хотите, чтобы ваши часы показывали правильное время из коробки». Однако, если вы готовы потратить некоторое время на калибровку ваши часы, то вам все равно, потому что вы собираетесь откалибровать любую неточность измерения. Ответ jfpoilpret дает пример протокола «ручной» калибровки, который по необходимости довольно длинный. Если вы можете одолжить модуль GPS с выходом 1PPS, калибровку можно выполнить за несколько секунд.
Стабильность — более серьезная проблема. Если частота временной развертки дрейфует случайным образом, это сведет на нет ваши усилия по калибровке. По сути, калибровка покажет вам, насколько быстро или медленно идут ваши часы прямо сейчас, но это не позволит вам предсказать, насколько быстро или медленно это произойдет. будет запущен в будущем.
Вот обещанная ссылка: Тактовая частота Arduino точность, Йорис ван Рантвейк.
Джорис измерил точность и стабильность Arduino Pro. Мини (с керамическим резонатором) и старый Duemilianove (кварцевый). кристалл). С моей точки зрения, основные выводы таковы:
- оба часа крайне точны, поэтому для обоих потребуется пользователь калибровка для использования в качестве часов.
- Кристалл кварца Duemilianove имеет достойную стабильность, лучше чем 1,5e-8 при времени усреднения 6 часов.
- Стабильность керамического резонатора Pro Mini вызывает сожаление, подробнее чем на два порядка хуже кристалла, что делает его практически бесполезен как часы.
Вот его график отклонения Аллана, который измеряет нестабильность часов. как функция времени наблюдения:
(источник: jorisvr.nl)
Хотя это исследование имеет некоторые ограничения (было протестировано только две платы, и время наблюдения слишком мало), это хорошо продумано и очень информативный. Я советую вам прочитать его целиком.
Частота кристаллов кварца незначительно меняется в зависимости от температуры. Если вы можете контролировать температуру, это помогает поддерживать стабильную частоту., @Duncan C
- Что является более быстрой альтернативой parseInt()?
- Как справиться с rollover millis()?
- Как получить текущее время и дату в Arduino без внешнего источника?
- Преобразование в Unix Timestamp и обратно
- Как запустить цикл на определенное время?
- Arduino Due vs Mega 2560
- Почему мои часы реального времени показывают неверное время с моего ПК?
- Разница между «time_t» и «DateTime»
Ограничения точности библиотеки зависят от точности кристалла. Допустим, у вас есть кристалл, который отклоняется на 0,5 секунды каждый час, что отлично подходит для краткосрочной перспективе, но если вы растянете его на год, к этому времени он будет отставать более чем на 1 час. Если вы хотите, чтобы что-то сохраняло точное время в течение длительного периода, я предлагаю часы реального времени (они все еще имеют неточности), модуль GPS или подключение к Интернету для синхронизации., @Jesse Laning
@jamolnng Спасибо за ответ. Знаете ли вы точность кристалла Arduino DUE или где его можно найти?, @KK6FSL
Наилучшая точность, которую вы можете получить, — это 84 МГц. Когда они изготавливают или готовят кристалл, они могут сделать его точным только до определенной степени, а также окружающая среда кристалла (температура, влажность и т. д.) играет роль в точность этого., @Jesse Laning
@jamolnng Так могу ли я ожидать более высокой точности от кристалла 84 МГц, а не от кристалла 16 МГц на большинстве других Arduino?, @KK6FSL
Не обязательно, потому что, если 84 МГц и 16 МГц имеют одинаковую погрешность за такт, то часы 16 МГц будут иметь меньшую погрешность в конце, потому что они делают меньше циклов. Частота кристалла больше зависит от скорости процессора, @Jesse Laning
«Наилучшая точность, которую вы можете получить, — 84 МГц» — для меня это не имеет особого смысла!, @Cybergibbons
Он искал точную частоту часового кристалла, включая его дефекты. Видимо уже поздно редактировать..., @Jesse Laning
У Due есть [RTC](http://forum.arduino.cc/index.php?topic=141233.msg1061157#msg1061157 «RTC»), но нет контактов для добавления внешней батареи для поддержания работы., @scruss