Часы дороги как память детства, когда почти в каждом доме было принято иметь часы с боем. Орловский часовой завод выпускал разные модели. Еще живы люди, которые работали на этом часовом заводе, а некоторые из них даже не добрались до пенсионного возраста.
Захотелось спасти один из экземпляров часов, произвести их ремонт, смазать, настроить точность хода.
Был изготовлен оптический датчик с быстрым операционным усилителем — компаратором для наилучшей фиксации момента пересечения маятником инфракрасного луча. Казалось бы, дело за малым — подключить измеритель периода колебаний, и «дело в шляпе». Но не тут-то было.
Измеренные периоды колебаний никак не хотели быть стабильными по значению. Разница доходила до нескольких единиц 10-4, что намекало на какую-то неисправность в механизме. Но на слух ход часов был ровным, скорее всего, природа быстрых отклонений кроется в чем-то еще.
Родилась гипотеза, что отклонения связаны прежде всего с неоднородной геометрией зубьев анкерного колеса, поэтому передаваемые ходовые импульсы получаются разной величины. Подумалось, что решить эту проблему не так уж и сложно, достаточно применить счетчик импульсов и считать не период маятника, а период оборота ходового колеса.
Ходовое колесо имеет 30 зубьев, значит и делить нужно на 30. Под рукой оказалась Arduino Mega (2560), на ней и решено сделать счетчик на 30. Использовался Timer5 с 47-м входом.
Код программы:
unsigned long Time1 = 0 ;
unsigned long Time2 = 0;
void setup() {
pinMode(LED_BUILTIN, OUTPUT); // инициализация Timer1
cli(); // отключить глобальные прерывания
TCCR5A = 0; // Init Timer5A
TCCR5B = 0; // Init Timer5B
TCCR5B |= B00000111; // External Clock on T5 Pin (RISING) 47-й вход платы, предделителей нет
TCCR5B |= (1 << WGM52); //Включение режима по совпадению CTC
OCR5A = 29; //таймер будет считать до этой величины от нуля - 30 импульсов.
TIMSK5 |= (1 << OCIE5B); //не помню для чего)
sei(); // включить глобальные прерывания
Serial.begin(9600);
}
void loop() {
Serial.print("Period = ");
Serial.println(Time2 - Time1); // вывод в портмонитора значения периода
delay(15000);
}
ISR(TIMER5_COMPB_vect)
{
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
Time1 = Time2;
Time2=micros();
}
Надо сказать, что код программы не оптимизирован под скоростное выполнение, поэтому для желающих есть возможности для ее улучшения.
Но даже в этом варианте она позволяет сравнить результаты периодов ходового колеса и опорного генератора. Оказалось, что период ходового колеса также «гуляет», хоть и в меньшей степени, чем период маятника. Похоже, при таком поведении механизма невозможно произвести его точную настройку. Зародилось сомнение, что эта задача в принципе выполнима. Вероятно, природа таких часов с учетом качества изготовления механизма, его износа не позволяет получить кратковременную, а следовательно и долговременную относительную точность хода лучше, чем (5-6)*10-4. А это примерно +-30-40 секунд в сутки, что, в принципе, сходится с заводскими характеристиками.
Осталось вживую посмотреть, как же отклоняется ход маятника от тактов опорного сигнала генератора.
И эта возможность не была упущена:
Спасибо за внимание!