Точное саратовское время

Те самые механические часы, домик с кукушкой, длинная цепь, маятник и гирьки. Они немного отставали, а в свои десять лет я не догадывался, что гайка маятника регулирует период. Да оно было и не важно, самое главное — выпрыгивающая фигурка. Затем появились настенные кварцевые, в виде чайника. Эти немного шли вперед. Вперед шло время, а технологии бежали. Около года назад приобрел микроволновку. Вы не поверите, часы торопятся на несколько минут в месяц. А в автомобиле идут очень точно, ни разу не приходилось подстраивать, хотя условия в салоне далеки от идеальных.

Одним людям нравится, когда часы показывают точное время, другие специально ставят небольшое опережение, чтобы не опаздывать. Но вряд ли найдутся те, кому нужны часы, идущие с другой скоростью.

В современном мире гаджетов и девайсов часы можно встретить на каждом шагу: холодильники и духовки, нагреватели воды, терморегуляторы, кондиционеры, зеркала и даже настольные лампы. Но далеко не все из перечисленных устройств имеют выход в интернет, а потому приходится рассчитывать на точность собственного тактового генератора. Микропотребляющим радиоканальным устройствам тоже иногда приходится синхронизировать работу, предотвращая коллизии в сети. Другим нужно выходить в эфир с заданным периодом. А когда генератор идет с опережением, период сокращается. Отсюда дополнительный расход батареи, сколько лишних обменов набежит за пару лет? Вот уж действительно, не думай о секундах свысока.

Существуют ли трудности создания устройств с точными часами или я впустую навожу тень на плетень? С одной стороны вопрос сводится к точному отсчету тактовых импульсов часового кварца, обеспечению его температурной стабильности. С другой — устройств с плывущим временем так много, что создается впечатление небрежного отношения к разработке. Компания Maxim Integrated предлагает микросхему DS3231, Extremely Accurate I2C-Integrated RTC, имеющую температурную компенсацию внутреннего тактового генератора (Accuracy ±3.5ppm from -40°C to +85°C). Производители микроконтроллеров добавляют регистр программной коррекции RTC. Для STM32, например, имеется возможность подстройки в диапазоне от -487.1 ppm до +488.5 ppm с шагом около 0.954 ppm. Биты CALM регистра RTC_CALR позволяют вычитать 1, 2…256 тактовых импульсов из 32-х секундного цикла. Бит CALP позволяют добавлять тактовые импульсы. Если частота уходит «в минус», то необходимо добавить импульсы при помощи CALP, а затем плавно убавлять через CALM. Не отстают и производители измерительного оборудования, высокоточные частотомеры с рубидиевым опорным генератором имеются в продаже. Так в чем же дело, почему микроволновку приходится использовать только по назначению?

Я вижу такие проблемы:

1.       В массовом производстве ставить отдельную микросхему или стабилизированный генератор слишком дорого. Это наши предки, не имея ни средств, ни технологий, могли позволить себе заниматься украшательством. Резьба по дереву и лепнина тому примеры. В наш век холодного рассудка копейка рубль бережет. К тому же калибровка часов — это отдельная технологическая операция, которая должна оплачиваться.

2.       Измерять частоту кварцевого генератора отдельно от устройства зачастую бесполезно. Необходимо учитывать нагрузочную ёмкость и топологию печатной платы. Многие микроконтроллеры имеют калибровочный выход RTC с частотой 1 Гц. Вот на нем и нужно проверять сигнал.

3.       Переводить ppm-ы в секунды и годы как-то проблематично. Подстройка в диапазоне от -487.1 ppm до +488.5 ppm с шагом около 0.954 ppm это сколько? Не в миллионных частях, а секундах.

4.       Хорошее измерительное оборудование стоит денег. Компании бывают разные, где-то частотомер купят сразу, а где-то придется ждать три месяца, пока сформируют бюджет под какую-нибудь тему. Разные бывают и коллективы, управленцы, отведенные на разработку сроки.

Поэтому продолжаются неустанные набеги изобретателей на сей незамысловатый вопрос. Точность измерений можно обеспечить оборудованием или терпением. В первом случае необходима опорная частота. Во втором, время, за которое накапливается достаточная для проверки ошибка. Автор публикации «Точное измерение частоты кварца без измерительных приборов» использует для калибровки синхронизированное время компьютера. И вообще, идея синхронизации от атомных часов, кажется здоровой. Ведь время на компьютере тоже берется не с Луны.

Последнее вводное — необходимая точность. Допустим, мы согласны иметь максимальный уход часов на 1 минуту в год. В одном году 31 536 000 секунд или 31 622 400 секунд, если год високосный. Т.е. дельта должна быть такой, чтобы за 31 536 000 отсчетов набежало 60 секунд.

31 536 000*∆ =60 ⟹ ∆ =\frac{60}{31 536 000}≈1,903 \;мкс

Значит, необходимо отследить сигнал, с периодом T ± Δ. Если часы опаздывают, то частота составит:

\frac{1}{1,000001903}≈0,999998 \; Гц

А если опережают, то:

\frac{1}{0,999998097}≈1,000002  \;Гц

Соответственно, обеспечив измерение частоты до 7-ми знаков после запятой, и убедившись, что значения попадают в обозначенные границы, можно рассчитывать на минутный дрейф RTC за год.

Идея частотомера и вариант реализации прекрасно изложены в публикации «Частотомер на основе микроконтроллера STM32. Конвейерный принцип измерения частоты». В статье дается исчерпывающая теоретическая часть и материалы для повторения решения на отладочной плате STM32F100RB. У меня же под рукой оказалась другая отладка, STM32F407 Discovery и дисплей с контроллером ILI9225. Кроме того, к представленному решению необходимо добавить источник опорный частоты. Навигационный модуль на базе микросхемы AT6558D прекрасно подойдет для этой цели. Используя протокол NMEA0183, модуль выдает через UART информацию во внешний мир. Но самое приятное, что есть дополнительный сигнал PPS (Time Standard Pulse Output). Заявленная точность времени составляет 30 нс. Хотя в документации на микросхему про выход PPS практически нет информации, думаю указанному значению точности можно верить, дав ссылку на данную публикацию.

Электроника

Объединяем все вместе, получаем простую схему.

Рисунок 1 - Схема частотомера на STM32F407 Discovery

Рисунок 1 — Схема частотомера на STM32F407 Discovery

Устройство питается от mini-USB, через него и программируется, как известно на отладочной плате распаян программатор ST-Link. Разъем HYR-0124 (BNC-7031) выбран для унификации. Хотя высокочастотных сигналов проверять не планируется, такой соединитель обеспечивает защиту от переполюсовки и его удобно крепить на корпус.

Корпус

У нас есть корпус? Конечно, мы же не какие-нибудь там оборванцы, которые не могут позволить себе покупку готового измерительного оборудования. Жажда исследования, спортивный интерес и живая фантазия движут инженерами. За основу взят корпус Калугина Михаила. С небольшим изменением толщины стенок и добавлением верхней крышки получаем вполне приличный прибор.

Рисунок 2 - Корпус частотомера

Рисунок 2 — Корпус частотомера

При монтаже лучше временно снять с отладочной платы разъем mini-USB, т.к. существует риск оторвать его за счет механического усилия. Монтаж упростится, если штыри дисплея выгнуть на 90 градусов. Такой же совет относится к кнопкам. На отладочной плате STM32 верхние штыри имеют меньшую длину, в случае применения покупных проводов лучше снять пластиковый наконечник, а коннектор защитить термоусадкой.

Прелесть выбранного корпуса в том, что устройство сохраняет функционал отладочной платы, т.к. с нижней стороны разъемы остаются открытыми. Да и вообще, зачем нужен частотомер? Контроллер, кнопки, экран и ЦАП есть, можно делать mp3 плеер. На дисплее ещё распаян разъем для MicroSD карты, взлетная полоса для фантазии готова. Но мы остановимся на изначальной идеи и перейдем к программному обеспечению.

Программа

STM32F407VGT6 — это Cortex-M4 + FPU, 168 МГц, 1МБ Flash и 192 Кб ОЗУ. С такими ресурсами можно решать несопоставимо более сложные задачи. Не составит труда организовать небольшое пользовательское меню, буфер накопления данных, калибровку, схему опроса навигационного модуля. CMSIS-RTOS v2 и всего три потока составляют необходимую логику программы. Данные накапливаются в два массива: измеренных значений и средних. Пользователю выдаются «мгновенные» измеренные значения и усредненные по завершению цикла опроса.

Рисунок 3 - Экраны меню

Рисунок 3 — Экраны меню

По идеи, можно непрерывно измерять частоту и выводить на экран. Однако выбор сделан в пользу накопления и усреднения отсчетов, сохраненных в накопительный буфера. В указанной ранее публикации (с контроллером STM32F100RB) для минимизации ошибки отсчетов используется коммутация нескольких таймеров. На частоте 168 МГц мне показалась такая схема излишней, ведь время одного отсчета таймера составляет всего 5,95 нс. Установив приоритет прерывания выше системного таймера, выполняем инкремент счетчика по каждому восходящему фронту. Не забываем настроить и группы приоритетов. На переход в обработчик прерывания и чтение счетчика уходит некоторое число команд, однако вносимая ошибка минимальна (время между чтением счетчиком и его обнулением). За счет цикличности запуска и остановки таймера данное время не должно влиять на показания счетчика.

Рисунок 4 – Принцип организации измерений

Рисунок 4 — Принцип организации измерений

Данные навигационного модуля в приборе не нужны, ведь используются только временные метки PPS. Однако указанный выход работает при стабильном приеме сигналов спутников, что случается не всегда. Если в поисках связи GPS вы случайно потеряетесь, могут пригодиться координаты со страницы «НАВИГАЦИЯ».

Откалибровать прибор получится любым сигналом с частотой 1 Гц. Подойдет хороший генератор, все зависит от желаемой точности. Источник калибровки автоматически выбирается на странице «НАСТРОЙКИ». При стабильной связи GPS, калибровка производится по временным меткам. В противном случае меандр необходимо подать на вход частотомера.

Испытания

Проделанная работа — не более чем подготовка к вопросу калибровки RTC. Двухнедельный отпуск был потрачен на углубленное изучение замысловатых схем коммутаций таймеров, выбор и проверку алгоритмов измерений, изучение точности чисел с плавающей точкой и поиск стабильного сигнала GPS. Подопытным стал прибор (с микроконтроллером STM32L010) для логирования напряжения, результаты подстройки часового кварца представлены в таблице.

Регистр CALR

Частота, Гц

0

0.9999453

CALP = 1, CALM = 0

1.0004333

CALM = 1

1.0004321

CALM = 2

1.0004320

CALM = 3

1.0004304

CALM = 4

1.0004307

CALM = 5

1.0004289

CALM = 6

1.0004273

CALM = 38

1.0003051

CALM = 390

1.0000624

CALM = 454

0.9999984

CALM = 448

1.0000060

CALM = 452

1.0000011

1.0000029

1.0000013

1.0000013

Вот она, неуловимая PPM! Первые шесть значений сняты для наглядности. Последующие пять шагов позволили вывести генератор на необходимую частоту.

В Reference Manual находим следующее: «The digital calibration circuit removes 0 to 127 cycles every 220 clock cycles». Чтобы привести один удаляемый такт к миллионной части составим пропорцию:

\frac{2^{20}}{1}=\frac{1000000}{x}⇒x=\frac{1000000}{1048576}≈0,954

Если взять первые шесть значений таблицы, попарно вычесть (шаг инкремента) и найти среднее, то получится Δ1 = 1∙ 10–6. С другой стороны по первой и последней точкам таблицы можно построить уравнение прямой вида :

f=9*10^{-7}*CALM+0.0004

Откуда шаг изменения частоты Δ2 = 0,9∙10–6. А истина где-то посередине, что соответствует значениям из документации. А можно было просто взять и воспользоваться стандартной методикой калибровки, в которой приводится таблица корректировки регистра CALM RTC в зависимости от текущей частоты. При этом калибровочный выход настраивается на частоту 512 Гц с требуемой проверкой до 3-х знаков после запятой. И тогда не потребовалось бы делать частотомер на отладке? Все зависит от возможностей  вашего измерительного оборудования.

И уж если речь зашла про возможности, то самое время проверить рабочий диапазон частотомера. Будем подавать меандр с генератора Siglent SDG1020.

Генератор SDG1020

Частотомер

1.000000 Hz

1.0000193

1.000000 kHz

1000.0911

10.000000 kHz

10007.2851

100.000000 kHz

100726.8125

При частоте 100 кГц прибор фактически перестает выполнять свои функции. Источник ошибки, вероятно, кроется в принципе организации измерений и калибровки (см. рисунок 4). Время перехода в прерывание и сохранения счетчика в буфер учитывается в значении калибровочного коэффициента для частоты 1 Гц. Данное время постоянно, в отличие от времени счетчика, которое падает с ростом частоты. Т.е. коэффициент «отклонения» частоты от эталона следовало искать из соотношения f = k∙t1 + t2, где t1 — время счетчика, t2 — время перехода в прерывание и сохранения данных в буфер. Но самая большая неприятность заключается в том, что прибор имеет наивысший приоритет по прерыванию и благополучно зависает при входном сигнале с частотой боле 500 кГц.

Работа над ошибками

Сложившееся положение дел неприемлемо. Ещё раз вернемся к конвейерному способу измерения частоты с коммутацией нескольких таймеров и попробуем обойтись бес прерываний. В указанной ранее публикации для измерений на низких частотах используется два канала, у STM32F100RB только 16-и битные таймеры и есть риск пропуска импульса. Для STM32F407 такой проблемы не существует, чтобы переполнить 32-х разрядный счетчик на частоте 168 МГц необходимо ждать 25 секунд. Кроме того выбран способ накопления и усреднения данных, а значит можно не гнаться за мгновенными значениями. Разрешим прибору делать свою работу без участия процессора.

Рисунок 5 - Схема измерения частоты

Рисунок 5 — Схема измерения частоты

Таймер 1 является ведущим с сигналом TRGO, по которому данные из счетного регистра таймера 2 отправляются в регистр сравнения. При обновлении регистра CCR1 срабатывает триггер канала DMA и данные благополучно складываются в накопительный буфер. Счетчик CNT не останавливается, поэтому значения в буфере растут по мере накопления. Но это и не важно, ведь любой контроллер умеет выполнять операцию вычитания. Не играет роль и величина накопленного счета, до момента первой загрузки в регистр CCR1, т.к. она одинакова для всех значений. Величина счетного регистра, приходящаяся на один период измеряемого сигнала определяется из соотношения:

CNT_T=\frac{array[n+1]-array[n]}{2}

Остальная часть программы осталась без изменений, собираем данные, усредняем, выводим на дисплей. Результаты повторной проверки сведены в таблицу:

Генератор SDG1020

Частотомер

1.000000 Hz

1.0000014

1.000000 kHz

1000.0154

10.000000 kHz

10000.6298

100.000000 kHz

100006.3046

1.000000 MHz

1000063.062

В этот раз лучше, но проблема решена не полностью. Маловероятно, что ошибка при частоте в 100 кГц вызвана нестабильностью генератора.

Дело вот в чем. Буфер накопления данных DMA при секундном входном сигнале заполнятся на 20 значений (T = 20 сек.). При частоте в 100 Гц буфер заполняется всего за 1 секунду, при частоте 1 кГц за 0.1 секунду и т.д.  И пока процессор выполняет вычисления и очищает буфер для повторного сбора информации, полезный сигнал благополучно теряется.

Иногда создается впечатление, что в серии микроконтроллеров STM32 найдутся средства для решения любой задачи. Углубленно пересмотрев Reference Manual, находим делитель входного сигнала ETR, делитель за счет регистра ARR, режим double buffer для DMA. Кстати, из документации не очевидно, что регистр ARR делит входной сигнал, причем считчик инкрементируется как по высокому, так и по низкому уровню.  Дорабатываем схему измерения частоты:

Рисунок 6 - Доработанная схема измерения частоты

Рисунок 6 — Доработанная схема измерения частоты

Поскольку делитель входного сигнала необходимо подбирать в зависимости от частоты, перестройка частотомера в начале измерений становится частью программного обеспечения. Для этого реализован небольшой конечный автомат, программа «грубо оценивает» входной сигнал по первым значениям накопительного буфера, а затем начинает измерения. Коэффициент деления меняется от 1 до 200 000 (максимально возможный 262144), что позволяет охватить сигнал от 1 Гц до 20 МГц без корректировки алгоритма сбора и анализа данных.

Финальная проверка диапазона частот:

Генератор SDG1020

Частотомер

1.000000 Hz

1.0000531

1.000000 kHz

1000.0186

10.000000 kHz

10000.1777

100.000000 kHz

100001.7734

1.000000 MHz

1000017.875

10.000000 MHz

10000180.00

Проверка практикой

Настенные часы VST 805S-4, отстают на пару минут в месяц. На фото показаны нагрузочные конденсаторы кварцевого генератор 32768 Гц. Есть и секундные импульсы, точки часов.

Рисунок 7 - Подстройка настенных часов

Рисунок 7 — Подстройка настенных часов

Как всегда не без сюрпризов, секундные импульсы «зашумлены» ШИМ, скорее всего регулировка тока. К счастью на плате нашелся сигнал опроса кнопок с частотой 16 Гц, при помощи которого и будем регулировать частоту. Подбираем для кварца необходимую нагрузочную емкость.

Нагрузочная ёмкость

Частота (16 Гц)

20 pF (изначально установленные)

15.9996967

0 pF

16.0037498

6.8 pF

16.0007820

15 pF

15.9999790

16.0000267

16.0001277

15.9998188

Замена нагрузочных конденсаторов на 15 pF позволила получить частоту, более или менее попадающую в необходимый диапазон. Временами частотомер выдавал заведомо ложные значения, возможно из-за пропуска импульсов, длительность которых составляет 500 мкс. Да и кто знает, как работает часовой ASIC.

Выводы

1.       Частотомер подойдет для измерения низких частот и проверки часового кварца. Но не стоит уповать на небеса, стабильность собственного генератора отладочной платы зависит от температуры. Необходимо помнить, с открытым или закрытым окном калибровался прибор.

2.       Необходимо проверить корректность показаний прибора после калибровки. Для этого соединяем выход PPS GPS модуля с входном частотомера. При корректной калибровке измерения покажут значение 1.000000x.

3.       Прибор сделан на доступной отладочной плате, что является неоспоримым преимуществом.

4.       Не забывайте прогреть кварц перед применением. Шестой знак после запятой демонстрирует интересные явления: генератор отладочной платы выходит на «стабильную» частоту через 5…10 минут (опорную частоту берем с GPS модуля). Т.е. калибровка с «холодным» и «горячим» кварцем даёт разные коэффициенты.

5.       Можно обойтись без частотомера и калибровать RTC при помощи внешнего генератора сигналов, организовав прошивку на проверяемом контроллере.

6.       Рабочий диапазон частотомера от 0.8 Гц до 20 МГц. На высоких частотах начинают сказываться математические возможность STM32, используются вычисления с плавающей точкой. Кроме того меандр плавно превращается в синусоиду, начинаются сказываться емкостные эффекты.

7.       Очевидный шаг по улучшению железа — применение термостабилизированного источника опорной частоты. Рабочий диапазон можно расширить при помощи внешнего аппаратного делителя.

8.       Эксперименты с акриловой грунтовкой и нулевой шкуркой дали посредственный результат. Трудозатраты и стоимость изготовления корпусов при прототипировании хочется снизить не в ущерб качеству. Доведение пластика до приличного вида — отдельный и большой вопрос.

Какой путь прошло человечество за прошедшее столетие! Десятки тысяч учёных и инженеров работали над созданием полупроводниковой электроники и микропроцессорной техники, тысячи инженеров работали над разработкой ракет, сотни физиков и математиков работали над созданием атомных часов, тысячи умов трудились над запуском спутников в космическое пространство и развертыванием систем GPS, GLONASS, BDS. Сотни инженеров пыхтели над разработкой всевозможного программного обеспечения, средств отладки… и так далее.

Цена точного времени высока, а выбранный за одну секунду отрезок неосязаем.

Ресурсы

Частотомер на отладочной плате STM32F100RB;

Библиотека для работы с навигационным модулем;

Библиотека для работы с экраном ILI9225.

Исследователи с живой фантазией и спортивным интересом могут скачать необходимые для изготовления частотомера файлы по ссылке. В архиве находится прошивка в формате hex и модель корпуса в формате stl.

© Habrahabr.ru