В этой статье я бы хотел подробнее остановиться на точности хода часов, и как это реализовано.
В своих часах я использую 32 битный контроллер STM32F051. Так как в периферии этого контролера имеются часы реального времени (RTC), то отпала необходимость использовать отдельные микросхемы RTC такие как DS1307 , которые используют в большинстве случаев. Так же в этой микросхеме (DS1307) меня абсолютно не устраивала точность хода, которая может достигать колоссальной погрешности. А микросхемы RTC с калиброванным и температурно-скомпенсированным кварцем стоят приличных денег.
Что же касается модуля RTC в STM-ке, помимо того что он просто работает не хуже DS1307, его можно еще откалибровать аппаратными средствами в идеале до 0,956/2 ppm. Уход времени при этом составит всего до 15 с в год или 1-2 с в месяц, против 1 с в сутки на DS1307 и то, если кварц будет хорошего качества.
Но не все так просто как кажется. Частота часовых кварцев очень сильно зависит от температуры. Ниже представлен график зависимости частоты от температуры.
В связи с этим нельзя просто откалибровать RTC при константной температуре, так как уход времени все равно будет большим при изменении температуры.
Для правильной температурной компенсации необходимо измерять температуру и по функции (или зашитой таблице) находить значение поправочных коэффициентов.
А теперь опишу, как это сделать.
Из внешних устройств нам потребуется очень точный генератор секундных импульсов, я использую GPS модуль QUECTEL L70, точность его секундных импульсов (PPS) составляет +/- 15нс, этого вполне хватает.
Так же нам потребуется термокамера, для нахождения зависимости частоты от температуры, я собрал на элементах пельтье, она вполне позволяет работать от 0 до 60-80 градусов.
Все остальное есть в периферии STM-ке, а точнее встроенный датчик температуры и 32-битный таймер, который отсчитывает с частотой процессора (48 МГц).
А теперь о процедуре.
Инициализируем встроенный датчик температуры. Его точности нам вполне хватит.
Так как частота процессорного кварца (8 МГц) тоже зависит от температуры нам необходимо и с этого кварца снять ТЧХ. Для этого настраиваем 32 битный таймер (я настраивал TIM2) так что бы он работал с частотой процессора, настраиваем один вход на захват по внешнему прерыванию и включаем прерывания. К этому входу (по которому осуществляется захват) подключаем секундные импульсы с GPS. И снимаем ТЧХ на всем температурном диапазоне. Эти данные нам понадобятся в дальнейших расчетах. График ТЧХ 8 МГц кварца представлен ниже.
Теперь тоже самое нам необходимо провести и с часовым кварцем. В этом случае настраиваем RTC таким образом, что бы он на выход PC13 выдавал секундные импульсы, но здесь они будут не точны на столько, на сколько врет наш часовой кварц. Снимаем ТЧХ на частоте 48 МГц.
Затем путем не хитрых математических вычислений делаем вычитание температурной погрешности 8МГц кварца и строим уже реальную ТЧХ часового кварца.
Далее, опять же, путем не хитрых математических вычислений приводим полученную ТЧХ в формат поправочных коэффициентов для RTC.
Теперь имеем все данные, чтобы найти реальную функцию ТЧХ часового кварца. Я это дела при помощи метода наименьших квадратов. Получилась следующая функция:
f(x)=-0.050529x2+2.147875x+48.298457
Ну вот и все 🙂 Мы получили функцию от температуры, которую может вычислить контроллер. Или если ему тяжко это делать, то всегда можно забить табличку.
В итоге проделанной работы получили точные часы реального времени за которые не надо платить лишние деньги, но придется проводить данную процедуру для каждого кварца, так как у каждого кварца индивидуальная ТЧХ.
И напоследок выложу все расчеты с Excel.