Modernization of electromechanical table clocks
Technology

Modernization of electromechanical table clocks

39 min read

1. The appearance of the watch

They still work properly, but their accuracy is low. The error accumulates so quickly that I stopped letting them down, and they show plus or minus half an hour. I decided to fix this problem so that they would please not only with related memories, but also with the reliable performance of their function.

In this article, I will not only provide the assembled electrical circuit and sketch code for the microcontroller, but also tell you in detail about the modification, the problems that arose and their solutions, so that owners of other watch models can adapt the approach to their case.

Note: I do not repair watches. Everything written about them is the result of understanding materials on the Internet and my own experiments. If you point out mistakes, I will gladly make corrections. In addition, I will not dwell on standard questions like “how to flash a microcontroller”, the answers to which are easy to find on the Internet.

Why do electromechanical watches run inaccurately and what can be done about it?

Electromechanical watches work as follows. The time standard in them is a balance that performs rotational oscillations under the action of the returning force of twisting and untwisting the spiral spring. A special electronic circuit, using a battery, compensates for energy losses in the mechanism, swinging the balance. The balance oscillations are converted into rotation of the mechanism gears through the anchor fork and anchor wheel.

2. The mechanism without the back cover and protective casing, I have already soldered two additional wires for experiments

The accuracy of an electromechanical watch depends on the stability of the balance oscillation period. The electrical circuit only transmits energy to it, but does not stabilize the oscillation frequency. The balance oscillations are not harmonic, their frequency depends on the amplitude. The amplitude, in turn, depends at least on the battery charge. Temperature also affects the parameters of the system, for example, the length and internal stresses of the balance spring. Due to these factors, even according to the passport, the accuracy of the watch should be a miserable ±20 seconds per day. In my opinion, their real accuracy was several times worse, and attempts to adjust it did not give anything.

Before adjusting the accuracy of a watch, you need to learn how to estimate its error. You can, of course, measure the deviation from the exact rate over several days. But this is too long and not very accurate, since the watch does not have a second hand. Another way is to measure the average interval between the “ticks” of the watch. It turns out that these intervals have only a few standard values. For a particular mechanism, the interval is determined by the gear ratio of the gears from the minute hand to the balance. In my case, as for most simple watches, the ticking speed is 18,000 bph, that is, 18,000 beats (half periods) occur per hour. The deviation of this parameter determines how fast or slow the watch is.

To measure the ticking speed, I used the Watch Accuracy Meter program . It visualizes the ticking of a watch and measures its parameters. In these graphs, the measurements lasted one minute. Each red dot on them corresponds to one tick. The dots appear on the graph from the bottom up as the measurements are made. They line up along the lines, and the slope of the line shows the deviation of the bph parameter, expressed in units of “seconds per day”. Two measurements in a row showed a lag of 13 and 14 seconds per day.

3. Screenshots from Watch Accuracy Meter

I tried to adjust the accuracy of the movement using this application many times, but after a few days the watch again showed anything but the exact time. I assumed that the reason was the uneven movement during the day due to the weight of the hands. When the watch shows 8:45, the mechanism has to do the work of lifting them, and when the watch shows 3:15, the hands, on the contrary, “help” the mechanism. However, this hypothesis was not confirmed. If you measure bph first in one position of the hands, and then move it to another and measure it again, the difference is 1-2 seconds per day, which does not pull up to the main reason for the inaccuracy. Either the effect of temperature fluctuations, or loosening of the movement adjustment screw due to vibration, or a decrease in amplitude due to a decrease in battery voltage remains.

The graphs above also show instability of balance fluctuations. The dots are sometimes aligned along straight lines, sometimes along wavy lines, sometimes they are smeared over some areas. This means that the balance fluctuation period is not strictly fixed, but changes slightly according to some chaotic patterns. In theory, these deviations should average out and disappear over fairly long periods of time, such as several days. But they may not disappear over a measurement period of one minute.

All of the above led me to the idea that such a watch design has fundamentally unavoidable shortcomings in terms of ensuring accuracy. To improve accuracy, they need to be improved. How can this be done? Very simple. I am a physicist, I know everything about this Universe! It is necessary to replace the balance’s self-oscillations with forced oscillations from a generator with quartz stabilization. After all, the frequency of forced oscillations of the mechanical system coincides with the frequency of the driving force. Then the accuracy of the watch will be ensured by the accuracy of the quartz generator.

Technical specifications for revision

To improve the accuracy of the clock, I decided to assemble a new control circuit. When designing, I proceeded from the requirements that can be formulated as follows:

How do electromechanical watches work?

To understand how to modify an electromechanical watch, let’s first understand how it works. When we insert a battery, the watch usually does not start on its own. To get it going, you need to push the balance with a special locking plate that immobilizes the balance during transportation. Let’s analyze the watch diagram from the passport, what processes take place in it.

4. Original diagram from the passport

First, let’s consider the situation when the balance is at rest. The current in the circuit from the battery passes through the L2 coil, the base-emitter junction of the transistor and the resistor. Since the resistor resistance is high, 270 kOhm, this current is only a few microamps. But it is enough to slightly open the transistor. In this state, the circuit consumes about 0.21 mA. Also remember that in this state, the lower capacitor is charged through the L1 coil to the voltage at the base-emitter junction (approximately 0.2 V for a germanium transistor).

Now let’s assume that we have started the balance oscillations by an external influence. There are magnets on the balance that pass the coils during oscillations. When the balance magnets move near the coils, an EMF (“voltage”) of first one polarity and then the other is induced in them. Why does the polarity change? When the magnets approach the coil, the magnetic field in it increases from zero to a maximum, and when the magnets move away, the magnetic field decreases again to zero. The EMF is equal to the derivative (rate of change) of the magnetic flux, and therefore, when passing through the maximum, the sign of the EMF changes.

The coils are arranged and connected so that the EMF surge in the L1 coil when the magnets approach is added to the voltage on the lower capacitor and transmitted to the base of the transistor, opening it completely. The current through the open transistor and the L2 coil forms a magnetic field that attracts the approaching magnets and additionally accelerates them, thereby transferring energy to the balance. When the magnets begin to move away from the coils, an EMF surge of opposite polarity occurs in L1, which closes the transistor. The magnetic field created by the L2 coil disappears and does not prevent the magnets from moving away from the coils.

The process described above occurs every time the magnets pass the coils. The energy transferred from the battery partially compensates for the friction losses in the balance and is partially transferred further to the mechanism.

The processes in the coils are clearly visible on the oscillogram. Here, the voltage measurements on the coils are taken relative to their common point (which is also the transistor emitter). The yellow beam shows the voltage on the L1 coil. First, a negative pulse in it opens the transistor, and the blue beam shows a voltage jump on the L2 coil of about 1.5 volts. Then the positive pulse closes the transistor, and the blue beam shows a negative surge in EMF, which is also induced in L2.

5. Voltages at the coil terminals in the original circuit

It should be noted that although this circuit contains only a few parts, it is made with due engineering ingenuity and contains a clever trick that I did not immediately see. If you want to find it yourself, try answering the following questions:

In fact, in the steady-state oscillation mode, the transistor is closed almost all the time, opening only for short pulses, and the average circuit consumption drops from 0.21 mA to 0.13 mA! This happens because when the magnet approaches the EMF coil in L1, not only does the transistor open, but also the lower capacitor is quickly discharged and even recharged through the open base-emitter junction. When the magnet moves away from the coils, the EMF of the opposite polarity first closes the transistor, and then the recharged capacitor prevents it from opening. The voltage on the capacitor can return to the original value only due to charging by current through the resistor, but this is a slow process due to the high resistance of the resistor and the high capacitance of the capacitor. The next surge occurs much faster, the transistor opens and the capacitor is again recharged by the surge of EMF of the opposite polarity. This is confirmed by the oscillogram of the voltage on the capacitor. It shows that the polarity in the diagram is shown correctly, and most of the time the potential of the upper plate of the capacitor is higher than the potential of the lower one, but this difference is small and amounts to a maximum of about 0.05 V:

6. Voltage on the capacitor in the original circuit

For the sake of completeness, I will provide an oscillogram of the voltages on the coils when the battery is not connected and the balance oscillates by inertia. Here it is clearly visible that the EMF surges in the coils have the opposite sign relative to the midpoint (the transistor emitter). This means that the coils are connected so that the direction of the turns in them coincides. However, the same is noted in the diagram: the end of the first coil (K1) is connected to the beginning of the second coil (H2).

7. EMF surges during free movement of the balance

How to switch the clock to work from an external circuit

The original circuit supplied current pulses to the L2 coil, and these pulses maintained the balance oscillations. The new circuit must also supply pulses to this coil. Fortunately, one terminal of the L2 coil is connected exclusively to the battery, and when there is no battery, the rest of the circuit is connected only to the other terminal of L2 and thus does not interfere with us in any way.

Let’s put aside all the requirements for a new electrical circuit for now. In this chapter, for simplicity, we will assume that we can assemble any circuit with any characteristics. Let’s focus on the following question: what should the circuit output so that our clock starts and runs reliably from it?

One possible answer is obvious: to keep the clock running, the new circuit must supply the same waveform to coil L2 as the original circuit. However, the original circuit used feedback, and the waveform of the signal generated depended on the amplitude of the balance wheel’s oscillations. The feedback enabled the pulses to be turned on at precisely the right moments, when the magnets were close enough to the coils, and turned off when the magnets began to move away. In addition, at high oscillation amplitudes, the magnets move past the coils quickly, so the feedback also shortened the pulse duration, saving battery power.

To simplify the new circuit and save battery power, I initially rejected the idea of ​​having feedback. I experimented for a long time with the pulse width and their location within the period. In the end, I settled on the option where the output voltage shape changes several times after startup. The thing is that the optimal signal shape in the steady-state mode does not swing the balance well from the resting position and does not bring it to the steady-state mode. And the signal that successfully swings the balance does not support its steady-state operation.

In the following text and in the sketch, I will describe the voltage waveform with a set of parameters {width1, width2, shift1, shift2} — the pulse widths and the distance between them:

8. Parameters of generated current pulses

These parameters are dimensionless, they show the ratio of the corresponding intervals to the oscillation period  T . Immediately after startup, these parameters are initialized with the values ​​{0.04, 0.01, 0.48, 0.5187}, and in the steady state they become equal to {0.01, 0.01, 0.5, 0.5}. For my clock, the period T  = 400 ms (determined by the clock parameter 18,000 bph: 2 * 3600 / 18000 = 0.4), and, for example, width1 = 0.04 means the duration of the first pulse is 0.04 * 400 = 16 ms.

There are two peculiarities in the listed parameter values. The first peculiarity: immediately after the start shift1 + shift2 = 0.9987 < 1. In essence, this means an increased oscillation frequency at the very beginning. Without such frequency adjustment, I was unable to achieve effective balance swinging and stable start of the watch. With a small amplitude of balance oscillations, the natural frequency increases, so it is necessary to increase the frequency of the driving force. Then the parameters with shift1 + shift2 = 1 are set, which effectively support oscillations with an amplitude close to the operating one.

The second feature is the asymmetry of the two pulses that make up the signal. I made the width of the second pulse smaller than the first, since the balance then stably moves out of the equilibrium position. If the width is made the same, the balance simply trembles slightly near the resting position, and it needs to be forcibly pushed to start, as in the original design. In addition, the second pulse comes a little earlier (shift1 < shift2), so that the pulses arrive at the optimal moments for swinging. The fact is that the balance on my watch is installed a little asymmetrically. Perhaps the reason is the consequences of the previous “repair”. I tried to release the spiral and correct the asymmetry of the equilibrium position. It was reduced, but not completely.

After the balance is accelerated to the operating amplitude on the first set of parameters, two other intermediate sets of parameters are switched on for 20 seconds each. In these steps, the total width of the pulses is gradually reduced and their position is symmetrized. The width is reduced to save energy: the shorter the time the current flows through the coil, the lower the average battery charge consumption. The final pulse width is about 4 ms, which is approximately 2 times less than the pulse width in the original circuit (Fig. 5). It would be possible not to symmetrize the pulse positions, since in this case the pulses are shifted in different directions relative to the optimal positions. But with random phase changes (if the balance runs a little ahead relative to the driving force or lags behind), one of the pulses will be closer to the optimal position and will continue to effectively transmit energy. The oscillogram of the symmetrical signal with parameters {0.016, 0.016, 0.5, 0.5} shows that the middle pulse is optimally located (just like in the oscillogram from the original circuit in Fig. 5), and the extreme pulses are shifted to the right, i.e., they are a little late. The delay in switching off the pulses leads to the fact that the attraction of the magnets to the coils at the moment of their removal partially slows down the balance.

9. Voltages on the coils in the new circuit with parameters {0.016, 0.016, 0.5, 0.5}. The arrows indicate the delayed pulses.

To configure the firmware for a specific watch, you need to select the listed parameters that describe the shape of the pulses. Their values ​​can be affected by the state of the mechanism, its wear level, the location of the coils, their characteristics. You also need to correctly adjust the adjustment screw. In the original scheme, it determined the frequency of oscillations. Now the frequency is determined by an external force and the role of the screw changes.

When operating from an external generator with a stable signal frequency, the adjusting screw allows you to adjust the natural oscillation frequency to resonance. If this is not done, the oscillation amplitude will not be maximum. When the natural frequency of the balance is higher than the frequency of the driving force, the balance will be ahead of the current pulses, they will turn off too late and will begin to slow down the balance, approximately as in the oscillogram above (Fig. 9). When detuning in the other direction, when the natural frequency of the balance is lower, the pulses will turn on and off too early, when the magnets have not yet had time to fully approach the optimal position. Apparently, the force of attraction, despite the increase in distance, remains sufficient and transfers energy to the balance both to overcome friction losses and to “push” the balance so that it does not lag behind the rhythm of the driving force. The situation of the balance lagging on the oscillogram looks like this:

10. The same parameters as in Fig. 9, only the natural oscillation frequency is reduced by the adjusting screw.

Where does this complexity with forced balance fluctuations come from?

How to improve running accuracy

We have figured out what form of pulses should be supplied to the clock coil to start it and keep it running. Now let’s look at how to maintain precise time intervals between pulses to ensure the required accuracy. In practice, frequency stabilization in electronic devices is performed using a quartz resonator. For example, a quartz watch uses a resonator with a frequency of 32,768 Hz. This value is not chosen by chance: it is convenient to obtain a signal with a frequency of 1 Hz from it by dividing by  ![2^15]. And this is the minimum frequency of modern common quartz resonators.

It is not so easy to use a 32,768 Hz frequency divider in an electromechanical clock, since the balance oscillation period is 400 ms, which corresponds to a non-integer number of quartz oscillations (32768 * 0.4 = 13107.2). In principle, it is possible to divide the clock quartz frequency by one counter microcircuitand get a stable two-second interval. And then generate 10 pulses within this interval, 2 pulses for every 400 ms. The pulse generation can be done by some other circuit that will work from a less accurate time standard. The overall accuracy of the clock will not be affected by pulse shifts within a two-second interval. Such a hardware part is clearly more complex than a conventional microcontroller with quartz frequency stabilization, so I did not see any reasonable alternative to the microcontroller.

11. Obtaining pulses with a period of 400 ms by dividing the frequency of 32,768 Hz

For this DIY project, I ordered a Chinese clone of Arduino Nano. The first experiments showed that it does not have normal frequency stabilization. The accuracy of the movement changed by tens of seconds per day when the supply voltage changed in the working range of the lithium-ion battery from 3 to 4.2 V. The fact is that these boards have a ceramic resonator, not a quartz one. It will not be possible to stabilize the voltage in an energy-efficient circuit; a different approach is needed.

I had a bare Atmega 328 PU microcontroller in stock. After working it out, I settled on the following version of the circuit. I connected a 32,768 Hz quartz to the microcontroller. I took the watch quartz from an old Chinese electronic wristwatch that was sold everywhere in the first half of the 90s for one dollar. The board from them lay with me for more than 30 years and finally went into action! I set the microcontroller clocking to 8 MHz from the internal RC chain, and timer 2 - from an external quartz.

12. Preliminary circuit of the pulse generator on the microcontroller

At first I wanted to repeat in software the idea described above with quartz stabilization of two-second intervals by timer 2 and generation of 10 pulses within these two-second intervals from another timer (Fig. 11). But it turned out that other timers do not work in sufficiently deep sleep modes and will waste battery power. Therefore, I decided to calculate the start and end moments of each of the 10 pulses in Excel, round them up to an integer number of intervals counted by timer 2 and sew them as constants in the sketch.

To test the idea, I thought about making the timer 2 interrupt occur 32,768 times per second, and the interrupt handler would check whether the output pin level needed to be changed. But for some reason, the interrupts only triggered twice as rarely. During the study, I realized that from the point of view of energy efficiency, it is better if interrupts do not occur so often, but are triggered only when the output level needs to be changed next time. For this, the CTC mode is used. In it, the interrupt occurs at the moment when the value of the TCNT2 counter register becomes equal to the value in the OCR2A register. When an interrupt occurs, the TCNT2 counter is automatically reset, and the next interrupt will occur at the moment when TCNT2 counts up to OCR2A again. Thus, by writing different values ​​from the interrupt handler to OCR2A, we can control the moment of the next interrupt. However, the peculiarity of timer 2 is that the TCNT2 counter is eight-bit. To count the required time intervals, I had to set the timer prescaler to 2 in 32. With such a prescaler, the TCNT2 counter increments 1024 times per second and can thus count intervals up to 250 ms with a step of 1/1024 seconds. This duration is just right for a typical 20 ms pulse and a 180 ms interval between them. The disadvantage of this approach is a noticeable quantum of “sampling” of 1/1024 seconds and the associated jitter - a deviation of the start and end moments of the pulses from their exact values. For example, a 20 ms pulse and a 180 ms pause turn into alternating pulses of duration 19.53125 ms and 20.5078125 ms, as well as pauses of duration 179.6875 ms and 180.6640625 ms.

Practical measurements have shown that jitter associated with a time quantum of 1/1024 seconds does not interfere with the normal operation of the clock. However, the quartz frequency turned out to be lower than the nominal, and the clock would lag by 3-4 seconds per day. The real time quantum turned out to be slightly more than 1/1024 seconds. To correct this deviation, it would be possible to introduce a software quantum counter and reduce the interval between pulses by 1 quantum about once every 24 seconds. I decided to switch from working with integer intervals to float and adjust the length of each pulse and pause. In the interrupt handler, the sketch calculates after how many time quanta the next interrupt should occur, rounds them to an integer, and saves the rounding error for the future and takes it into account in the next interrupt:

float remainder = 0; 
float getNextInterval() {
  // ...
}

uint8_t getNextStop() {
  remainder += getNextInterval(); 
  uint8_t stepNum = round(remainder); 
  remainder -= stepNum; 

  return stepNum - 1;
}

ISR(TIMER2_COMPA_vect) {
  OCR2A = getNextStop();
  // ...
}

It is clear that due to working with fractional numbers not only loss of accuracy is possible, but also accumulation of this error over time. But even if this accumulation does occur, it will lead to advance or lag of the clock, and can be compensated in the same way as deviation of the quartz frequency from the nominal. Also, the float data type in Atmega328 has another drawback: they are not supported by hardware and are emulated by software. The speed of working with them is 10 times slower than the speed of working with integers. For my purposes, there are no problems due to the speed, since the microcontroller is still forced to wait for the end of writing to the OCR2A register before going to sleep again, and it makes no difference whether it will do calculations before that or wait in an empty cycle.

I selected a correction factor that compensates for the deviation of the quartz frequency from the nominal one using the Watch Accuracy Meter. The maximum measurement duration in it is 4 minutes, which allows you to measure and correct the error up to ±¼ second per day, or ±7 seconds per month. To debug the circuit, I connected a small speaker to its output, which will “tick” instead of the real mechanism. This technique allows you to observe the characteristics of the generated pulses. The result is shown in the first picture. It clearly shows the jitter due to the noticeable sampling quantum. The second picture shows the ticking of the watch connected to the generator. There is no jitter in it, and the resulting deviations in the rate quickly disappear.

13. Visualization of the quartz stabilization of the generator. On the left are the pulses fed directly to the speaker (there is noticeable jitter), on the right is the movement of the real clock (the jitter is smoothed out). On the right graph there is not a large scatter of points, as on the other graphs, since the system parameters were such that the amplitude of the balance oscillations was lower than usual.

In conclusion, let’s discuss what kind of accuracy can be expected from quartz stabilization. As written in Wikipedia , manufacturers of conventional watch quartz guarantee long-term frequency stability of about 6\cdot 10^-6, which corresponds to ±15 seconds per month. In addition, the frequency drift with a temperature deviation from the calculated one (25…28 °C) by ±10 degrees will give an error of about 3\cdot 10^-6. It turns out that the accuracy of adjustment using the Watch Accuracy Meter is more than sufficient, since it is comparable in order of magnitude with both long-term frequency drift and deviations due to temperature changes.

How to achieve minimum battery consumption

As I wrote in the technical specifications above, we need to not only come up with some kind of circuit on a microcontroller that would make the clock more accurate, but also get a finished product that is no worse than the original in other parameters. A critically important parameter is the average current consumption of the circuit, on which the battery life without recharging directly depends.

Let’s say the circuit consumes an average of 10 milliamps. This may seem like a small current: that’s the consumption of a regular LED. But for a typical 2000 mAh battery, the circuit will last 200 hours, or a little over a week. I’m definitely not ready to bring a desk clock to the charger every week and charge it for several hours.

You can start diving into the topic of energy efficiency of microcontrollers with  an article on Alex Guyver’s website . Following the advice there, I assembled the circuit not on an Arduino debug board, but on a separate bare Atmega 328 microcontroller without unnecessary components that waste current. Since a 32.7 kHz quartz crystal is connected to the microcontroller pins, from which timer 2 works, I set the clocking to a frequency of 8 MHz from the internal RC chain. In addition, I used the deepest sleep mode (SLEEP_MODE_PWR_SAVE), in which timer 2 still works.

I measured the average current consumed by the circuit above (Fig. 12) with a relative pulse width of {0.05, 0.01}. The value was approximately 0.23 mA, or 230 μA. If you disconnect the load in the form of a clock coil, the microcontroller itself consumes about 25 μA. Of these, 23 μA is spent on the microcontroller in sleep mode, and another 2-3 μA of average consumption is added by waking up at the time of interrupt processing. In principle, we could stop here, because the average consumption of 0.23 mA gives an autonomous operation time of about a year from a fully charged 2000 mAh battery. But I continued the research further and began to think about how to further reduce energy consumption.

From the numbers above, it is clear that almost 90% of the total consumption is due to the load. However, the load itself only consumes about a third of this energy because it has a resistance of 354 ohms and is connected through a 680 ohm resistor. This resistor dampens excess voltage. The old circuit supplied 1.5 V voltage pulses to the coil, while the new circuit supplies a supply voltage of 3.7 ± 0.5 V. To save energy, the voltage must be converted in a different way.

To reduce the voltage from the lithium-ion battery to the estimated 1.5 volts, it would be possible to use ready-made DC-DC converters, but their own current consumption is high enough for our application and, therefore, low efficiency at low currents. Attempts to assemble the converter myself did not give anything. I did not load the microcontroller with generating a PWM signal and smoothing it with passive components. As a result, I decided to order the LM2665 microcircuit and make a “halver” of voltage on the “flying” capacitor based on it.

Flying capacitor converters operate at a high frequency (160 kHz in the case of the LM2665). This is the frequency at which the flying capacitor is switched: first it is connected to the current source, and then to the consumer. Depending on the other components in the circuit and their switching, you can get a converter from V to 2V, V/2 or -V. There is a good video on this topic on the Major Tom Workshop channel explaining the theory and assembling a working circuit on discrete components.

I ordered LM2665 since I didn’t have any field effect transistors to build a discrete analog anyway. When they arrived from Aliexpress, I built a voltage “halver” using the schematic from the datasheet and measured the efficiency when operating in steady state from 3.7 volts into a 384 ohm load at a constant current consumption. With ceramic capacitors rated at 2.2 μF, the efficiency was about 95%. I thought I could reduce the flying capacitor rating so that it would carry less charge per cycle and the voltage at the converter output would be lower. The converter with a 38 nF capacitor dropped the voltage from 3.68 V to 1.50 V with a not very high efficiency of 79%. I left 0.1 μF in the circuit, which converted from 3.67 V to 1.71 V and gave an efficiency of 90.6%. Since the voltage turned out to be slightly higher than the calculated value when replacing the resistor with the LM2665 converter, it was possible to reduce the duration of the pulses supplied to the clock coil to {0.035, 0.005 } without much effort, while maintaining the same level of reliability. In this version, the average current consumption of the circuit was 130 μA.

LM2665 has a control input SD (shutdown). Voltage conversion occurs at zero potential on SD and stops at high. I checked that the consumption of LM2665 in the off mode does not exceed 1 μA. Therefore, the SD input is well suited for controlling the formation of pulses, you just need to remember that its logic is inverse. The final circuit of the quartz generator on the microcontroller for the clock turned out to be like this:

14. The final circuit of the pulse generator on the microcontroller. LM2665 is connected correctly according to the halving scheme from the datasheet. I omitted the capacitors on the power supply, but in the finished device you need to solder the electrolytic and ceramic as close to the microcontroller as possible.

Pay attention to the connection of the LM2665 chip. It seems that its input and output (V+ and OUT) are mixed up, but this is a typical connection from the datasheet for dividing the voltage in half.

During the final adjustment of the watch, I tried to correct the asymmetrical balance position and programmed a dynamic change in the pulse parameters after the start. Thanks to this, in the operating mode, it was possible to reduce the duration of two pulses in a period to 0.01. The average current consumption is 75 μA, and another 3 μA is consumed by the protection on the battery charging module. Arithmetic calculation gives an autonomy of several years. But I would not trust such a calculation, since in terms of the order of consumption, we are already approaching the self-discharge of lithium-ion batteries, and the autonomy will largely depend on their quality.

For completeness, it is worth noting that I had another idea for reducing the current through the coil. Instead of limiting the current with a 680 ohm resistor, you can connect the series-connected coils L1 and L2 as a load through a 200-300 ohm resistor. Since the number of turns in the common coil increases, the current must be reduced to ensure the same magnetic attraction force. And reducing the current saves battery energy. As follows from the oscillograms and the diagram, the coils L1 and L2 are wound and connected in such a way that they form one common coil with the same direction of turns, and their magnetic field will add up. However, in practice, connecting both coils at the same current did not lead to an increase in the driving force, but to its decrease. Most likely, the rest of the old circuit, connected to the coil L1, which I did not disconnect, is to blame for this. You can try this method instead of the LM2665 converter at your own risk, because connecting the coils in such an abnormal mode may be incorrect, since the wire thickness in L1 may be less than in L2.

Results

I assembled the circuit on a breadboard. I soldered the LM2665 to an additional piece of PCB due to its tiny size. I attached the board, the TP4056 charge controller, and the batteries to a piece of plexiglass, which I glued to the watch case.

15. Assembled circuit

I had lithium-ion batteries of the 14500 format (AA battery size) with a capacity of 900 mAh, I put two batteries in parallel. But with the final consumption of the circuit (80 μA), you can safely leave one battery, it will last for a long time.

I have fully complied with the requirements listed at the beginning. However, there is a peculiarity with the reversibility of the modification: in order for the clock to work as before from the battery, you need to disconnect the new circuit. If you do not disconnect, the L2 coil will be connected in parallel with the C4 capacitor, and this can cause additional energy consumption of the battery due to the changed processes in the circuit. However, I did not measure the possible negative effect, it may be insignificant, or even positive.

The final version of the sketch for Arduino:

#include <avr/sleep.h>

#define OUTPUT_PIN 3
#define VALUE_ON LOW
#define VALUE_OFF HIGH

const uint16_t phaseNum = 4;

const float parameters[][4] = {
    {0.04, 0.01, 0.48, 0.5187},
    {0.03, 0.01, 0.48, 0.52},
    {0.02, 0.01, 0.49, 0.51},
    {0.01, 0.01, 0.50, 0.50}
};

const float timerTicksInPeriod = 32768 
  * (1 - 0.0000415) 
  * 0.4
  * 1/32 ;

float durations[phaseNum];

void initDurations(size_t step) {
  const float avgPulseWidth = 0.5 * (parameters[step][0] + parameters[step][1]);

  durations[0] = timerTicksInPeriod * parameters[step][0];
  durations[1] = timerTicksInPeriod * (parameters[step][2] - avgPulseWidth);
  durations[2] = timerTicksInPeriod * parameters[step][1];
  durations[3] = timerTicksInPeriod * (parameters[step][3] - avgPulseWidth);
}

uint16_t intCount = 0; 

void correctParameters() {
  if (intCount > 601) {
    return;
  }

  if (intCount == 201) {
    initDurations(1);
  } else if (intCount == 401) {
    initDurations(2);
  } else if (intCount == 601) {
    initDurations(3);
  }
  intCount++;
}

float remainder = 0;

uint8_t nextStopAfter; 
uint16_t phaseIdx = 0; 

uint8_t getNextStop() {
  remainder += durations[phaseIdx];
  uint8_t step = round(remainder);
  remainder -= step;

  phaseIdx++;
  if (phaseIdx >= phaseNum) {
    phaseIdx = 0;
  }

  return step - 1; 
}

void setup() {
  pinMode(OUTPUT_PIN, OUTPUT);
  digitalWrite(OUTPUT_PIN, VALUE_OFF);
  initDurations(0);
  delay(1000);
  cli();

  ASSR = (1 << AS2); 
  TCCR2A = (1 << WGM21); 
  TCCR2B = (0 << CS22) | (1 << CS21) | (1 << CS20); 

  TCNT2 = 0; 

  ADCSRA &= ~(1 << ADEN); 
  TIMSK2 = (1 << OCIE2A);

  sei(); 

  set_sleep_mode(SLEEP_MODE_PWR_SAVE); 
  nextStopAfter = getNextStop();
}

ISR(TIMER2_COMPA_vect) {
  OCR2A = nextStopAfter; 
  digitalWrite(OUTPUT_PIN, phaseIdx % 2 == 0 ? VALUE_OFF : VALUE_ON);
  correctParameters();
  nextStopAfter = getNextStop();
  while (ASSR & (1 << OCR2AUB)) {
  }
}

void loop() {
  sleep_enable(); 
  sleep_cpu();   

  sleep_disable();
}

Now after the final revision and firmware, the watch has been running for about two weeks without stopping. It is difficult to determine any lag or advance, since the watch does not have a second hand. I have set it up precisely and will be monitoring the progress for six months. During this time, part of winter, spring and part of summer will pass, so the effect of temperature fluctuations during the year will somehow average out. If the error accumulates noticeably, I will recalculate the adjustment coefficient and update the firmware.

To anticipate some comments, I will immediately note that you can go further and propose a system in which the correction factor will change not by reflashing, but dynamically. For example, a watch with a Wi-Fi module connects to an NTP server once every few days, calculates the incoming error and adjusts the factor to minimize it. The disadvantage of receiving time via Wi-Fi is the need to monitor its performance. In case of failures in receiving accurate time, the watch will be able to roll back to the factor from the firmware and work as (in)accurately as now, but you may not find out about this soon. An alternative option for increasing accuracy without receiving signals from the outside world is to add a thermistor to the circuit, which is in thermal contact with the quartz, and measure its temperature every 10 minutes. Based on the temperature, the microcontroller determines the value of the correction factor according to pre-compiled tables for specific examples of the quartz resonator and thermistor. The well-known DS3231 real-time clock chip operates on this principle. Theoretically, it could be used to check the time, but I did not find any mention in the datasheet of the existence of a low-power mode in the region of tens of microamps.

When I was thinking about the possibility of upgrading the watch and was searching for materials on the topic on the Internet, I found maximum messages on forums about the reasons for the low accuracy of the watch. If I had found at least a tenth of what was stated in this article, I would have decided to improve it earlier. I hope that I managed to inspire those who want to, who feel they have enough skills, and dissuade those who do not have enough skills yet. And surely the commentators will suggest how to improve the approach, the scheme and the element base.