Arduino 中的定时器中断


正如另一篇文章中所讨论的,定时器基本上是计数器。当它们达到计数结束时,它们会溢出。我们可以利用此事件来生成中断。现在,在 Arduino 中生成中断的传统方法涉及更改大量寄存器。幸运的是,我们有库可以简化我们的工作。

我们将使用 **TimerOne** 库在 **Timer1** 上生成中断。类似地,还有一个 **TimerThree** 库用于在 **Timer3** 上生成中断(不适用于 **Arduino Uno**)。

转到 **工具 -> 管理库**,搜索 **TimerOne** 和 **TimerThree**(可选),然后单击 **安装**。

接下来,通过 **草图 -> 包含库** 在代码中导入库。

这将在代码顶部添加以下行:

#include <TimerOne.h>

现在,这里有两个重要的函数:Timer1.initialize() 和 Timer1.attachInterrupt()。initialize 函数接收定时器运行的时间(以微秒为单位)。换句话说,它确定中断触发后的时间。

attachInterrupt() 函数接收每次中断触发时要调用的函数的名称作为参数。

下面的示例代码提供了一个示例:

示例

#include <TimerOne.h>
volatile bool timerTriggered = false;
void setup() {
   // put your setup code here, to run once:
   Serial.begin(9600);
   Timer1.initialize(1000000); //Initialize timer with 1 second period
   Timer1.attachInterrupt(printFunc);
}
void loop() {
   // put your main code here, to run repeatedly:
   if(timerTriggered){
      Serial.println("Timer was triggered");
      delay(1);
      timerTriggered = false;
   }
}
void printFunc(void){
   timerTriggered = true;
}

如您所见,定时器初始化为 1 秒(1,000,000 微秒)的周期。每次定时器触发时,都会调用 **printFunc** 函数并设置 **timerTriggered** 标志。请注意,**timerTriggered** 布尔值已声明为 volatile,因为它在中断函数中被更改。一旦设置了标志,循环中就会执行打印语句,并且标志会被重置。

与任何其他中断函数一样,**printFunc** 不能有任何参数,也不能返回任何内容。

请注意,Timer1 可以接受最小周期 1 微秒和最大周期 8388480 微秒(约 8.3 秒)。

如果您使用的是 **TimerThree** 库,请在上述代码中将 Timer1 替换为 Timer3。当然,**TimerThree** 不适用于 Arduino Uno,因为它只有 Timer0、Timer1 和 Timer2。它可以与其他也有 Timer3 的开发板一起使用(Teensy 就是一个很好的例子)。

您可以从以下资源中了解更多关于这些库的信息:

更新于: 2021年3月24日

4K+ 阅读量

开启你的职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.