微控制器中的定时器/预分频器

Met*_*lov 2 embedded microcontroller

也许这是一个愚蠢的问题:

我有内部 20 MHz 振荡器、16 位定时器和预分频器(1、2、4、8、16、32、64、128),我想产生 1 毫秒的延迟。我知道怎么做 - (20 000 000 / 1) / 1000 = 20 000 -> 将此值放入 16 位寄存器,它就可以工作了。

使用预分频器 2 和 4,我得到相同的结果 1ms - (20 000 000 / 2) / 1000 = 10 000 和 (20 000 000 / 4) / 1000 = 5 000

我的问题是如何确定使用哪个预分频器?也许,我必须选择预分频器 4,因为这个值 (5000) 更接近 0,我的计时器从 0 开始计数到 ​​5000。如果我选​​择 10 000,计时器将计数 2 x 5000。

先感谢您 !

Cli*_*ord 6

当计数器在所需时间段内不够大时,您可以使用更高的预分频器。例如,如果您想要 10 毫秒的周期,则必须使用至少为4的预分频器才能获得 50000 的重新加载值。

导致重新加载小于 2 16的最小预分频器是您通常的目标。这为您提供了尽可能高的计数器分辨率,这对您将其用于 PWM 或输入捕获很有用。另一方面,如果您只是使用重新加载中断,这并不重要。

如果您需要的周期不是完全可以实现的,因为 in 不是时钟周期的精确倍数,那么使用较低的预分频器将最大限度地减少误差。

最后,如果你走得太低,你可能无法达到精确的时期。例如,对于您的 1ms 周期,64 的预分频器将导致重新加载 312.5,选择 312 会导致 ~1001.603ms 的周期或 313 的 ~998.403ms。

因此,通常重新加载值尽可能接近 65535 而不是您建议的零,这是您通常的目标。

  • 请记住,预分频器之一可能会影响其他外设。一般来说,编写一个临时程序只需几分钟,该程序会遍历这些组合并搜索出最准确的一个或多个(与某些 MCU 的波特率除数组合相同),您可以可能会找到并打印出具有相同总体精度的多个组合(数字上不计算时钟的模拟质量)并从中进行选择。如果除数之一影响所有外围设备,您肯定需要考虑到这一点。 (3认同)
  • @TomServo 是的,但问题一般是关于微控制器的,而不是专门针对 Arduino 的。除此之外,无论如何都应该应用最佳实践,以便在关键时刻成为一种习惯。例如,我从事需要 2ppm TCXO 的应用,同步到 GNSS 1PPS 的精度为 60ns。你可以笑,但有时这很重要。而且这不仅仅是一个“微秒”的问题,而是一个漂移的问题。即使在 2ppm 下,TDMA 无线电应用在没有 GNSS 同步的情况下不到一分钟后也将无法满足其时隙同步要求 (2认同)
  • @MetodiAngelov 是的。就是这么简单。TomServo 是对的,它可能没什么区别,但这不是重点。所有人的一条规则/指南。不要错过要点,尽管在这种情况下预分频器的主要目的是进行缩放以允许重新加载以适合寄存器。 (2认同)