Як отримати точний час?


16

Я зробив годинник за допомогою Arduino, але час, здається, проходить. Мені відомо про питання перекидання ; Здається, годинник переміщується приблизно за 15 хвилин протягом тижня.

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

Моє запитання: Як я можу виміряти час з Arduino, досить точно, щоб зробити прохідний настільний годинник?


3
Мілісекундна функція постачається з даними про переривання, яке займає пару тактових циклів. Це додає мізерної кількості часу до кожного кліща.
TheDoctor

3
@TheDoctor: Це неправильно. Переривання не сповільнює апаратний таймер, який працює millis().
Едгар Бонет

Відповіді:


15

Примітка: хоча моя відповідь була прийнята і має більший бал голосів, переконайтеся, що ви прочитали чудову відповідь Едгара Бонета про те, як змусити ардуїно тримати час без RTC.

Я досить успішно користувався годинником в режимі реального часу DS1307. Ось посилання на його таблицю .

Нижче наведено деякі його особливості:

  • Він використовує ІС-інтерфейс для спілкування з Arduino, що спрощує програмування за допомогою потрібних бібліотек (доступних в Мережі).

  • Він підключений до Arduino через штифти SCL та SDA (аналоги A4 і A5 відповідно), таким чином, використовуючи лише 2 штирі.

  • Для роботи потрібно дуже мало зовнішніх компонентів.

  • ІТ можна підключити до батареї монети, так що вона буде тримати час навіть під час вимкнення Arduino. У режимі малої енергії акумуляторна батарея працює на роки.

  • Він дрейфує дуже мало (в моєму випадку він дрейфує лише кілька секунд на тиждень).

  • Це не дуже дорого.

Якщо ви не збираєтеся використовувати RTC, ви можете замінити кристал, який зазвичай використовується для забезпечення годин на ардуїно для модуля кристалічного осцилятора, як цей від Farnel або цей інший . Вони поставляються в 4-контактних упаковках, як на зображеннях нижче. Вони генерують набагато більш точний годинник для вашого ардуїно.

Зображення кристалічного осцилятора Зображення кристалічного осцилятора Зображення кристалічного осцилятора

Обидва згадані модулі мають допуски 50 ppm і працюють при 5V.

Знову ж таки, щоб було зрозуміло, ці кристалічні генератори не слід плутати з звичайними 2-контактними кристалами, як описано нижче. Наприклад, вони є частиною схеми зовнішніх годин для MCU.

Кристалічний осцилятор


Є DS1302 досить хорошим або мені слід перейти до DS1307?
Келлі С. Французька

14

Для побудови годинника вам не потрібен RTC: в мікросхемі ATmega є все обладнання, необхідне для виконання обов'язків самого RTC. Ось як:

  1. Отримайте кристал годинника 32768 Гц: або придбайте його, або розберіть старий годинник. Ці кристали, спеціально розроблені для зберігання часу, мають надзвичайно малий температурний дрейф. Також вам знадобиться одна з таких, якщо ви хочете використовувати чіп RTC.

  2. Налаштуйте запобіжники ATmega для виходу 8-МГц RC-генератора. Це зробить вашу millis()функцію жахливо недостовірною, а також звільнить шпильки XTAL1 і XTAL2.

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

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

Тепер ви отримаєте TIMER2_OVF переривання з дуже стійкою швидкістю один раз в секунду. Потрібно лише заздалегідь просунути дисплей годинника на ISR на одну секунду. У перервах між перервами ви можете перевести MCU у дуже глибокий сон (режим сну, що економить енергію: нічого не працює, окрім таймера / лічильника 2), і роками працювати на пару комірок AA. Окрім випадків, коли дисплей не має високої потужності.

Я зробив саме це, щоб побудувати свій 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 повідомляє про час у розбитому вигляді, який, природно, не піддається арифметичним операціям.


Нічого собі, це дійсно гладкий дизайн! Мені дуже подобається, як ти виставив достатньо фотографій, щоб зробити дизайн зрозумілим, навіть для нас нерозумних моноглобілів американців :) Мені дуже подобається бачити чітку проектну документацію, як це!
John Walthour

2
@JohnWalthour: Дякую! Тепер ти заохочуєш мене написати переклад. :-)
Едгар Бонет

2
@JohnWalthour: Готово! Тепер посилання вказує на англійський переклад.
Едгар Бонет

Просто для того, щоб було зрозуміло, коли ви кажете, що "чіп ATmega має все необхідне обладнання", це не зовсім вірно, коли вам доведеться отримати новий кристал. Я думаю, що ваше рішення гладке, і я не вище заміни кристала, але я трохи розгубився, коли ти кажеш, що мені не потрібне обладнання, а потім розвернутися і сказати, що мені потрібно замінити частину обладнання.
Келлі С. Французька

@ KellyS.French: У моєму реченні було "чіп ATmega має все обладнання, необхідне для виконання обов'язків самого RTC " (наголос додано). Але тоді важливо помітити, що для більшості RTC, включаючи всюдисущий DS1307, для роботи потрібен зовнішній кристал. ATmega нічим не відрізняється: у неї є все необхідне для заміни самого RTC , але не для заміни кристала, який вам все одно доведеться підключити до RTC. Зверніть увагу, що модуль RTC - це більше, ніж просто RTC, оскільки він включає кристал.
Едгар Бонет

6

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

Отже, використовуючи кристал або кристалічний генератор, ви отримаєте те, що хочете. Або використовуючи його на ATmega і встановивши запобіжники відповідно, або нас, підключених до RTC.


Де 50ppm стабільність 0,005%?
Метью Г.

Я узагальнюю цей параметр, щоб коротко відповісти. Зверніть увагу на стабільність окрім Res. мають набагато більшу толерантність і можуть бути досить відхилені. Як переживає Джон W. "правильна частина для правильної роботи"
mpflaga

О, мені було просто цікаво термінологія @mpflaga ... нова для мене.
Метью Г.

4

Якщо ви не хочете використовувати додаткове обладнання, наприклад годинник у режимі реального часу (наприклад, DSDS1307), ви можете значно підвищити точність синхронізації, відключивши всі невикористані переривання. За замовчуванням ескізи Ардуїно мають різні режими переривання, і часто вони не використовуються для вашого ескізу. Найшвидший спосіб з’ясувати, чи можна без цього спробувати вимкнути їх, видавшиnoInterrupts();


3
−1 (хоча це заслуговує на −4), оскільки: 1. Якщо вони вам справді не потрібні, всі переривання вимикаються за замовчуванням, за винятком лише TIMER0_OVF, який потрібен для збереження часу. 2. Точність синхронізації Arduinos обмежена в основному якістю резонатора. 3. Переривання не впливають на точність, millis()якщо тільки вам не вдасться витратити більше однієї мілісекунди за один раз, обслуговуючи їх, і в цьому випадку у вас виникають інші проблеми ... 4. Відключення перерв noInterrupts()заважатиме millis()утримувати час взагалі!
Едгар Бонет

2

Я розумію, що багато духу з Ардуїно є бережливим і періодично тягнеться через проблеми. Я використовую Arduino (а тепер chipKIT, оскільки він має 10-кратну оперативну пам’ять і 10-кратну тактову частоту) для свого робочого місця, і мені потрібні "периферійні функції", щоб бути швидкісними і працювати якомога швидше.

Я використовую годинник в режимі реального часу в режимі реального часу в одному зі своїх проектів і дуже задоволений ним. Вони також мають варіант "Dead on" .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.