有什么理由不在 AVR 上使用 Timer0?

电器工程 Arduino avr 大气压 中断
2022-01-28 19:18:48

只是一个基本问题...对于 arduino/avr/ATMega328,我发现很多使用 Timer1 的示例(甚至还有一个完整的库),但很少有使用 Timer0(或 Timer2)的示例。

现在,我知道使用这些定时器中的任何一个来控制 ISR 方法都会禁用在其相关引脚上使用 PWM,但是人们似乎远离 Timer0 是否有特定的原因?它是否用于内部其他不应该乱用的东西?

我当前的应用程序使用 Timer1 很好,我只是好奇我是否遗漏了一些关于这些其他经常被忽视的计时器的东西。

2个回答

如果问题是关于裸 AVR 微控制器,那么不,使用任何计时器都没有限制

  • 对于 Arduino,最好避免使用Timer0millis() ,因为 Arduino 库中delay()的所有内部计时都使用此计时器。改变它的时间常数会影响这些操作。
  • 正如问题所述, Timer1是任何计时器/计数器任务的流行首选,通过TimerOne 库等库以及直接操作。它是一个 16 位定时器,因此比 8 位定时器具有更精细的分辨率。
  • Timer2由tone() 库使用,但由于它的使用并不普遍,因此还有许多人认为非常有用的msTimer2 库,就像 TimerOne 一样。直接操作 Timer2 也很好。
  • 如果您使用Arduino Mega板,那么 Mega、 Timer3Timer4Timer5上的附加定时器(每个都是 16 位定时器)也可以使用。

除了禁用相关的 PWM 之外,我能想到的其他原因是:

  • TIMER0 是一个 8 位定时器,而 TIMER1 是一个 16 位定时器。

  • 在 Arduino 世界中,TIMER0 用于延迟()和毫秒()等定时器功能。我见过的许多其他代码都以相同的方式使用它,因为 8 位分辨率通常足够了。

  • TIMER2 也是 8 位的,如果只需要 8 位,我想不出有什么理由专门避免这种情况。然而,它被 Arduinotone() 函数使用。

所以我想这使得 TIMER1 成为一个相当通用的选择,并且当需要 16 位定时器时,它是较小 AVR 的唯一选择。AVR Mega 设备还包含 TIMER3 - TIMER5,它们都是 16 位的。