Page 1 of 1

ESP32 S3 Improving hardware timer accuracy with external 32.768 kHz crystal

Posted: Tue Jul 09, 2024 9:14 pm
by misterd
I use hardware timers

Code: Select all

  bitTimer = timerBegin(0, 2, true);
  timerAttachInterrupt(bitTimer, &timerESP, true);
  timerAlarmWrite(bitTimer, halfBit, true);
  timerAlarmEnable(bitTimer);
My board uses a 40 MHz 10ppm crystal, I want to improve the accuracy of the timer. From the documentation I understood that the 40 MHz crystal does not affect the timers. But I saw that you can use the ability to connect an external 32 kHz crystal. But I can't find information about what exactly affects the accuracy of the hardware timer. Please tell me. Is it true that using an external 32 kHz crystal with an error of 0.2 ppm will increase the accuracy of the timers?

Re: ESP32 S3 Improving hardware timer accuracy with external 32.768 kHz crystal

Posted: Wed Jul 10, 2024 7:31 am
by ESP_Sprite
The timers by default do rely on the 40MHz crystal as a timing base, potentially via the PLL. You could potentially add a 32KHz crystal as well, and I think the hardware can switch to using that as a source, but I don't think Arduino would support that. Can I ask what you need such precision for?

Re: ESP32 S3 Improving hardware timer accuracy with external 32.768 kHz crystal

Posted: Wed Jul 10, 2024 11:04 am
by misterd
I count cycles to output timecode (SMPTE 12M).
Other manufacturers have crystals of exactly 0.2ppm. This allows for drift of no more than 1 frame per day.

With the current crystal of 10ppm, the drift is too large. Therefore, I need to count as accurately as possible. Since I use timers, I am looking for a way to increase the accuracy. That is why I asked if, for example, replacing the crystal from 40MHz 10ppm to 40MHz 0.2ppm would help me.

Re: ESP32 S3 Improving hardware timer accuracy with external 32.768 kHz crystal

Posted: Thu Jul 11, 2024 3:50 am
by ESP_Sprite
Gotcha, makes sense. You can go both ways - changing the 40MHz crystal to a more precise one should get you to where you need to be and this is probably the easiest way. Using a 32KHz crystal is possible but it requires a bit of a hack - seems the GPTimer does *not* directly support running off it, but you could work around this by e.g. outputting the 32KHz signal on a GPIO, then looping the signal back into the pulse counter peripheral and using that as a timer.