Я сделал часы, используя Arduino, но время кажется дрейфующим. Я знаю о проблеме пролонгации ; часы, кажется, дрейфуют примерно на 15 минут в течение недели.
Я использую собственную плату с этим резонатором от Digi-key. Код читает функцию millis () в начале каждого цикла и работает с этим значением.
Мой вопрос: как я могу измерить время с Arduino, достаточно точно, чтобы сделать сносные настольные часы?
millis()
.Ответы:
Примечание: хотя мой ответ был принят и получил более высокий балл, обязательно прочитайте отличный ответ Эдгара Бонета о том, как заставить Arduino проводить время без RTC.
Я довольно успешно использовал часы реального времени DS1307. Вот ссылка на его таблицу данных .
Ниже приведены некоторые из его особенностей:
Он использует интерфейс IC для связи с Arduino, что облегчает программирование с использованием нужных библиотек (доступных в сети).
Он подключен к Arduino через контакты SCL и SDA (аналог A4 и A5 соответственно), используя только 2 контакта.
Для работы требуется очень мало внешних компонентов.
Он может быть подключен к батарейке типа «таблетка», поэтому он будет работать даже при выключенном Arduino. В режиме низкого энергопотребления батарея типа «таблетка» работает в течение многих лет.
Это дрейфует очень мало (в моем случае это дрейфует только несколько секунд в неделю).
Это не очень дорого.
Если вы не намерены использовать RTC, вы можете заменить кристалл, который обычно используется для предоставления тактовых импульсов для Arduino, для модуля кварцевого генератора, такого как этот от Farnel или этот другой . Они входят в 4-контактные пакеты, как на рисунках ниже. Они будут генерировать гораздо более точные часы для вашего Arduino.
Оба упомянутых модуля имеют допуски 50 ppm и работают при 5 В.
Опять же, для ясности, эти модули кварцевого генератора не следует путать с обычным 2-контактным кристаллом, как показано ниже. Это, например, часть схемы внешних часов для микроконтроллеров.
источник
Для создания часов вам не нужен RTC: чип ATmega имеет все оборудование, необходимое для выполнения функций самого RTC. Вот как:
Получите часовой кристалл на 32768 Гц: либо купите его, либо разберите старые часы. Эти кристаллы, специально предназначенные для выдерживания времени, имеют очень маленький температурный дрейф. Вам также понадобится один из них, если вы хотите использовать чип RTC.
Сконфигурируйте предохранители вашего ATmega для запуска 8-МГц RC генератора. Это сделает вашу
millis()
функцию ужасно неточной, а также освободит контакты XTAL1 и XTAL2.Подключите часовой кристалл к контактам TOSC1 и TOSC2. Это те же контакты, что и XTAL1 и XTAL2 (9 и 10 на 328P). Разные имена используются для обозначения разных функций.
Сконфигурируйте Таймер / Счетчик 2 для асинхронной работы, нормального режима подсчета, предварительного масштабирования, установленного на 128, и включите прерывание переполнения таймера.
Теперь вы получите прерывание TIMER2_OVF с очень постоянной частотой один раз в секунду. Вам нужно только продвинуть показ часов на одну секунду в ISR. В промежутках между прерываниями вы можете поместить MCU в очень глубокий режим сна (режим ожидания с энергосбережением: ничего не работает, кроме таймера / счетчика 2) и годами работать на паре ячеек АА. Если, конечно, дисплей потребляет много энергии.
Я сделал именно это, чтобы построить свои 24-часовые настенные часы с одной рукой . Эта ссылка указывает теперь на английский перевод оригинальной документации на французском языке.
Кварцевая калибровка
Если вы не откалибруете свой кварц, вы можете ожидать значительного дрейфа, обычно несколько секунд в неделю . Скорость дрейфа зависит от паразитной емкости следов, которые соединяют кристалл с MCU. В принципе, это может быть удалено добавлением некоторой дополнительной, точно настроенной емкости. Стоит отметить, что у вас будет та же проблема с дрейфом с RTC.
Если вы удовлетворены такой точностью, то живите ею и будьте счастливы. Однако, если вы захотите измерить дрейф, вы заметите, что он очень стабилен. Затем вы можете легко компенсировать это с помощью программного обеспечения и достичь точности в несколько секунд в год .
Алгоритм коррекции дрейфа очень прост. Из измеренного дрейфа вы вычисляете точную задержку между прерываниями, которая должна быть очень близка к 10 9 наносекундам, затем:
В приведенном выше примере кварц немного слишком быстрый, и программное обеспечение компенсирует это отсутствием галочки каждые несколько дней. Если бы кварц был слишком медленным, один и тот же код вместо двух раз отмечался бы каждые несколько дней.
Этот тип калибровки также может быть выполнен для RTC, но он будет значительно более сложным, потому что RTC сообщает время в разбивке, что, естественно, не подходит для арифметических операций.
источник
Резонатор, который вы указали, имеет стабильность 0,3%, где кристалл или кварцевый генератор (как упомянуто Рикардо) составляет 50 частей на миллион. Во много раз стабильнее. Не говоря уже о температурном дрейфе резонатора, это ужасно. Нагрев солнечным светом изменит это. Следовательно, резонатор не должен использоваться для хранения времени в течение длительных периодов.
Следовательно, используя кристалл или кварцевый генератор, вы получите то, что вам нужно. Либо используйте его на ATmega и установите предохранители соответственно, либо используйте подключенный к RTC.
источник
Если вы не хотите использовать дополнительное оборудование, такое как часы реального времени (например, DSDS1307), вы можете значительно повысить точность синхронизации, отключив все неиспользуемые прерывания. По умолчанию в набросках Arduino включены различные подпрограммы прерывания, и зачастую они не используются в действительности для вашего эскиза. Самый быстрый способ узнать, если вы можете обойтись без него, чтобы попытаться отключить их, выполнив
noInterrupts();
источник
millis()
если не удается провести более одной миллисекунды в то время их обслуживания, в этом случае у вас есть другие проблемы ... 4. Отключение прерываний сnoInterrupts()
помешаютmillis()
от отсчитывает время на всех!Я понимаю, что дух Arduino во многом скромен и иногда перебирает проблему. Я использую Arduino (а теперь и chipKIT, так как он имеет 10-кратную оперативную память и 10-кратную тактовую частоту) для своего рабочего места, и мне нужны «периферийные функции», чтобы быть в курсе и работать как можно быстрее.
Я использую часы реального времени sparkfun в одном из своих проектов и очень им доволен. У них также есть вариант «Dead on» .
источник