Comments 27
А как вы вообще дошли до такой идеи — заняться настройкой хода часов? Это больше из личного интереса или есть какое-то практическое применение, для чего такая точность важна в вашей жизни?
Я делаю всякие поделки на микроконтроллерах и решил сделать часы на STM32. А раз там есть такая фишка, то почему бы её не задействовать? Нет, это не какая-то большая необходимость, а скорее просто интерес и желание немного разобраться с темой, поэкспериментировать. Хотя я до сих пор пользуюсь обычными недорогими настольными часами, которые достаточно сильно бегут вперёд. Возможно, получится их заменить более точными часами своей разработки. В этом плане есть какая-то необходимость, но не прям большая.
Возьмите нормальные часы для МК - DS3231 - получите уход около минуты в год, подстройка тоже есть.
Может и с этой микросхемой что-то сделаю, есть она у меня. Но она крупнее микроконтроллера:)
Оригинал DS3231 еще поискать надо, модуль за 110руб с али убегает на 10-15 минут в месяц, менял его такой же от другого продавца, результат идентичен.
На некоторых DS3231 с Али внутри вообще нет кварца - RC-генератор... Причём от цены это не зависит. Корпуса с точкой возле первого вывода - сразу в диспут, с выемкой на боковой грани - скорее всего нормальные.
DS3231 бывают 3х основных видов:
DS3231S - SO16W с кварцем, корпус с вырезом с торца и фаской, температура считается редко. "Accuracy ±2ppm from 0°C to +40°C", "temperature conversion once every 64 seconds"
DS3231M - SO16W с MEMS, корпус с точкой сверху и фаской, температура считается часто. "Timekeeping Accuracy ±5ppm (±0.432 Second/Day) from -45°C to +85°C", "temperature conversions are executed once per second."
DS3231MZ - SO8 с MEMS.
На Али китайских подделок я не видел, но все что видел перепил из первых 2 видов б.у. в DS3231SN:
Вот какие чипы иногда приезжают с Али:
По меандру моя прошивка сразу понимает, что часы поддельные - с RC-генератором (плавают от нагрева на 1...3 кГц и не калибруются) и контроллер пишет ошибку тестирования. У нормальных чипов длительность единичного уровня - 20...30% от периода:
синхронизация по времени полезна если микроконтроллер обычно спит, и просыпается периодически только чтобы узнать, не хочет ли кто-то его "включить" по радио типа rfm69.
Если часы у такого мк и будящего синхронизированны, то время, которое надо после просыпания "ждать сигнала" можно сделать минимальным. Соответственно, время работы на батарейке - увеличить.
Столкнулся с такой проблемой, когда стал делать управляемую игрушку для котов на лазерных указке. Ее надо подвесить под потолком, и как-то не охота часто лазать менять батарейки. В то время как игрушка включается пару раз в день на несколько минут.
Что за модель экрана вы используете?
На главной картинке экран от Nokia 1203, а на последней - монохромный экран на 128х64 точки с драйвером ST7567 - их много вариантов бывает. Вообще разрешение 128х64 достаточно популярное, поэтому один и тот же интерфейс можно будет сделать с разными дисплеями. Для настольных часов отличный вариант. В своём видео я рассказывал про один из таких дисплеев https://youtu.be/YvdRZc50BPs
функция цифровой настройки хода (ЦНХ) в моих старых часах Камертон 2-52, которые, к сожалению, уже давно не работают.
Комментарий в сторону: а как в советских часах была реализована ЦНХ, рассказано в авторском свидетельстве SU712805
Спасибо, любопытно. Правда я мало что понял из этого описания, достаточно запутанная схема:) Впрочем, наверняка схема подстройки в STM32 тоже непростая.
Коммутатор подает тактовую частоту 32768гц либо на основной делитель (от которого считаются секунды, минуты, часы) либо на счетчик ЦНХ. Счетчик ЦНХ инициализирован константой коррекции.
По переполнению счетчика секунд тактовая переключается с основного делителя на счетчик ЦНХ (часы стоят при этом).
По переполнению счетчика ЦНХ тактовая переключается на основной делитель, счетчик ЦНХ снова инициализируется кодом коррекции.
Ради интереса можете написать на завод - у них есть старые запасы ЖКИ, если найдут для вашей модели, то вышлют. Я так свои ещё школьные часы оживил.
на часовом кварце 38768 Гц
38768 Гц?
Винда конечно не ОСРВ (если программа реализована под неё), но там тоже можно выводить миллисекунды привязки к СОМ-порту.
Ну 38768 это опечатка, подправил.
Насчёт миллисекунд: конечно, в винде они есть, но вот в RTC микроконтроллера их нет, там просто какой-то регистр, выдающий от 0 до 255 в течение секунды. То есть, напрямую записывать их некуда, а заниматься пересчётом не особо охота было. Да и смысл был только в том, чтобы проверить правильность формулы пересчёта, а не добиться идеальной синхронизации.
конечно, в винде они есть
В ней (винде) есть ещё и тики (такты). Один такт представляет собой 100 наносекунд ( одна миллионная секунды).
Если вы про DateTime.Now.Ticks, то с этими тиками не всё так просто оказалось. В прошлой статье я использовал их для измерения времени выполнения функции, но в комментариях мне объяснили, что эти тики не обновляются в реальном времени. Я проверил экспериментально, на самом деле, они обновляются через миллисекунды.
Как раз, наоборот. Не DateTime.Now.Ticks, но DateTime.Ticks.
И да, вы совершенно правы, что с этими тиками не всё так просто оказалось .
В файле DateTime.cs так и сказано (в комментариях кода) : что-то можно переопределить, а что-то строго предупреждается - не трогайте, сломаете время!
В общем, если приложение синхронизации часов привязано к винде. то там само всё делается, магией...
Цифровую настройку точности хода, не плохо было бы развить и дальше, т.е. объединить, синхронизацию с GPS, NTP или DCF77 и им подобные, что бы вычисление погрешности производилось с высокой точностью и в автоматическом режиме, а еще дискретность настройки лучше сделать 1/100 сек., тогда да, точность таких часов не будет хуже 4-х сек. в год. при условии их нахождения в стабильных температурных условиях...
К слову, настройку частоты кварца можно и аппаратно делать. Например, если часы спешат, то надо припаять к кварцу два свитых эмалированных одножильных провода длиной примерно 150мм, тогда они начнут отставать, а укорачивая их, можно добиться точности хода. Плюс в том, что это бесплатно и работает на всех кварцевых часах, а минус в том, что таким образом можно настроить только часы, спешащие от +0,5 до +10с в сутки.
А что дают два свитых провода? Ёмкость и индуктивность, которые снижают частоту? Что-то мне кажется, что такой подход сильно увеличит температурную нестабильность генератора.
Да, они образуют конденсатор, емкость которого у меня получалась примерно 1 пФ на сантиметр. Пробовал такой вариант, и уменьшения температурной стабильности не заметил. Да и не совсем ясно, откуда ей взяться, к тому же, в жилых помещениях температура не сильно меняется. Влияние помех тоже не было обнаружено, видимо, амплитуда меньше, чем у генератора. Конечно, подпаять переменный конденсатор будет лучше, но не у всех он есть в наличии, и без него мне удалось подстроить часы из +0,55 с/сут в +0,04 с/сут.
Аппаратную настройку кварца делают конденсаторами, чуть сдвигая ими точку резонанса. В советских часах сразу впаивали подстроечный конденсатор. Дорожки к кварцу длиннее сантиметра - гарантия нестабильности из-за ловли помех, поэтому во всех аппнотах рекомендуют делать их минимальной длины и заливать земляным полигоном всё вокруг осциллятора.
Цифровая настройка хода в часах на STM32 простым языком