你可以比 Brian Drummond 的建议做得更好。尽管您的振荡器确实是系统中最大的误差源,但如果很容易不添加额外的系统误差,则没有理由添加额外的系统误差。
将定时器间隔设置为 33668 滴答,从 0 开始计数器,在每次定时器中断时,将计数器增加 6754。
如果在递增后,计数器 >= 8105,则减去 8105,并将下一秒的计时器间隔设置为 33669 滴答。
否则,不理会计数器并将下一秒的定时器间隔设置为 33668。
这会给你(假设一个完美的 32.768kHz 晶体)平均间隔
(33668 + 6754 / 8105) / 32768 ~= 1.0274912510006
秒(相对于 1.0274912510 小于万亿分之一的误差),而不是 1.0274963378906 秒(几乎百万分之 5 的误差)。这意味着时钟的长期精度将真正取决于振荡器的精度;数学造成的误差每年的误差将大大少于一个刻度。尽管任何一秒的长度都会产生高达 25ppm 的相对误差,但在越来越长的平均时间间隔内,误差就会消失。
这是Bresenham 算法应用于计时,发现分数 6754/8105 如下:
32768 * 1.027491251 = 33668.833312768
33668.833312768 的精确连分数是 [33668; 1、4、1、1349、1、7]。
去掉最后一项得到近似值 33668 + 6754 / 8105,它的所有部分都整齐地适合 16 位。