Можно ли быстро и точно настроить часы ОЧЗ с гравитационным маятником?

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

Захотелось спасти один из экземпляров часов, произвести их ремонт, смазать, настроить точность хода.

Был изготовлен оптический датчик с быстрым операционным усилителем — компаратором для наилучшей фиксации момента пересечения маятником инфракрасного луча. Казалось бы, дело за малым — подключить измеритель периода колебаний, и «дело в шляпе». Но не тут-то было.

Измеренные периоды колебаний никак не хотели быть стабильными по значению. Разница доходила до нескольких единиц 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 секунд в сутки, что, в принципе, сходится с заводскими характеристиками.

Осталось вживую посмотреть, как же отклоняется ход маятника от тактов опорного сигнала генератора.

И эта возможность не была упущена:

Спасибо за внимание!

Оставьте комментарий