Как получить точное время?

Я сделал часы, используя Arduino, но время, похоже, дрейфует. Я знаю опрокидывание . вопрос; часы, кажется, дрейфуют примерно на 15 минут в течение недели.

Я использую пользовательскую печатную плату с этим резонатор от Digi-key. Код считывает функцию millis () в начале каждого цикла и работает с этим значением.

Мой вопрос: как я могу измерить время с помощью Arduino, достаточно точно, чтобы сделать сносные настольные часы?

14 голосов | спросил John Walthour 12 FebruaryEurope/MoscowbWed, 12 Feb 2014 05:34:28 +0400000000amWed, 12 Feb 2014 05:34:28 +040014 2014, 05:34:28

5 ответов


15

Примечание: хотя мой ответ был принят и имеет более высокий балл голосов, убедитесь, что вы читаете отличный ответ Эдгара Бонета о том, как заставить Arduino поддерживать время без RTC.

Мне удалось успешно использовать часы реального времени DS1307. Вот ссылка на техническое описание .

Ниже приведены некоторые из его возможностей:

  • Он использует интерфейс IC для связи с Arduino, что упрощает программирование с использованием правильных библиотек (доступно в сети).

  • Он подключен к Arduino через контакты SCL и SDA (аналоговые A4 и A5 соответственно), поэтому используется только 2 контакта.

  • Для этого требуется очень мало внешних компонентов.

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

  • Он очень мало дрейфует (в моем случае он дрейфует всего несколько секунд в неделю).

  • Это не очень дорого.

Если вы не собираетесь использовать RTC, вы можете заменить кристалл, который обычно используется для предоставления часов arduino для модуля кварцевого генератора , например этот из Farnel или этот другой . Они поставляются в 4-х контактных пакетах, как на рисунках ниже. Они создадут гораздо более точные часы для вашего ардуино.

Кристаллический осциллятор изображения Изображение кристалла осциллятора  Кристаллический осциллятор изображения

Оба упомянутых модуля имеют допуски 50 ppm и работают при напряжении 5 В.

Опять же, чтобы быть ясными, эти модули кварцевого генератора не следует путать с обычным 2-контактным кристаллом , как это показано ниже. Например, это часть схемы внешних часов для MCU.

Кристальный осциллятор

ответил Ricardo 12 FebruaryEurope/MoscowbWed, 12 Feb 2014 06:07:08 +0400000000amWed, 12 Feb 2014 06:07:08 +040014 2014, 06:07:08
11

Вам не нужен RTC для создания часов: чип ATmega имеет все аппаратное обеспечение, необходимое для выполнения обязанностей самого РТК. Вот как:

  1. Получите кристалл часов с частотой 32768 Гц: либо купите его, либо разобщите старые часы. Эти кристаллы, специально предназначенные для сохранения времени, имеют чрезвычайно небольшой температурный дрейф. Вам также понадобится один из тех, если вы хотите использовать чип RTC.

  2. Сконфигурируйте предохранители вашего ATmega для работы от 8 МГц осциллятор. Это сделает вашу функцию millis() ужасно неточно, а также освобождать контакты XTAL1 и XTAL2.

  3. Подключите кристалл часов к контактам TOSC1 и TOSC2. Эти такие же контакты, как XTAL1 и XTAL2 (9 и 10 на 328P). Различные имена используются для обозначения различных функций.

  4. Настройте таймер /счетчик 2 для асинхронной работы, нормальный режим подсчета, предварительный делитель установлен на 128 и включает переполнение таймера прерывания.

Теперь вы получите прерывание TIMER2_OVF с очень постоянной скоростью один раз в секунду. Вам нужно только настроить отображение часов на одну секунду в ISR. Между прерываниями вы можете поместить MCU в очень глубокие sleep (энергосберегающий спящий режим: ничего не запускается, кроме таймера /счетчика 2) и запускается в течение многих лет на пару клеток АА. Если дисплей не голоден, очевидно.

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

Калибровка кварца

Если вы не откалибруете свой кварц, вы можете ожидать значительного дрейфа, обычно несколько секунд в неделю . Скорость дрейфа зависит от паразитной емкостью следов, соединяющих кристалл с MCU. В принцип, его можно было бы удалить, добавив некоторые дополнительные, тонко настроенные емкость. Стоит отметить, что у вас будет одинаковый дрейф проблема с RTC.

Если вы удовлетворены такой точностью, тогда живите с ней и будь счастлив. Однако, если вы хотите измерить дрейф, вы заметите что он очень стабилен. Затем вы можете легко компенсировать это программного обеспечения и добиться точности нескольких секунд в год .

Алгоритм коррекции дрейфа очень прост. Из измеренных дрейфа, вы определяете точную задержку между прерываниями, которые должно быть очень близко к 10 9 Â наносекундам, тогда:

 #define ONE_SECOND    1000000000  // in nanoseconds
#define ONE_INTERRUPT  999993482  // for example

ISR(TIMER2_OVF_vect)
{
    static uint32_t unaccounted_time;

    unaccounted_time += ONE_INTERRUPT;
    while (unaccounted_time >= ONE_SECOND) {
        advance_display_by_one_second();
        unaccounted_time -= ONE_SECOND;
    }
}

В приведенном выше примере кварц немного слишком быстр, а программное обеспечение каждые несколько дней компенсирует «размывание». Если бы кварц тоже медленный, один и тот же код будет дважды тикать каждые несколько дней.

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

ответил Edgar Bonet 5 MarpmThu, 05 Mar 2015 14:25:15 +03002015-03-05T14:25:15+03:0002 2015, 14:25:15
6

Указанный резонатор имеет стабильность на 0,3%, где кристалл или кварцевый генератор (как упоминается Рикардо) составляет 50 ppm. Во много раз более стабильный. Не говоря уже о том, что температурный дрейф резонатора ужасен. Нагрев солнечным светом изменит его. Следовательно, резонатор не должен использоваться для поддержания времени в течение длительных периодов времени.

Следовательно, использование либо кристаллического, либо кварцевого генератора получит то, что вы хотите. Либо используйте его на ATmega, либо установите соответствующие предохранители, или мы подключены к RTC.

ответил mpflaga 12 FebruaryEurope/MoscowbWed, 12 Feb 2014 06:37:28 +0400000000amWed, 12 Feb 2014 06:37:28 +040014 2014, 06:37:28
4

Если вы не хотите использовать дополнительное оборудование, например, часы реального времени (например, DSDS1307), вы можете значительно улучшить точность синхронизации, отключив все неиспользуемые прерывания. По умолчанию эскизы Arduino включают различные подпрограммы прерываний и часто они не используются для вашего эскиза. Самый быстрый способ узнать, можете ли вы обойтись без него, чтобы попытаться отключить их, выпустив noInterrupts();

ответил jippie 12 FebruaryEurope/MoscowbWed, 12 Feb 2014 10:22:09 +0400000000amWed, 12 Feb 2014 10:22:09 +040014 2014, 10:22:09
2

Я понимаю, что дух духа с Ардуином бережливый и изредка тащится через проблему. Я использую Arduino (и теперь chipKIT, так как он имеет 10x RAM и 10x clock clock) для моего рабочего места, и мне нужно, чтобы «периферийные функции» работали как можно быстрее.

Я использую часы реального времени в одном из моих проектов и очень доволен этим. Они также имеют вариант «Dead on» .

ответил Chris K 12 FebruaryEurope/MoscowbWed, 12 Feb 2014 08:48:40 +0400000000amWed, 12 Feb 2014 08:48:40 +040014 2014, 08:48:40

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132