每个微控制器都有一个或多个定时器,可帮助用户以精确的时间间隔执行任务。例如,Arduino Uno 有 3 个定时器:Timer0、Timer1和Timer2。其他板可能具有相同或不同数量的定时器,您可以从该板/微控制器的数据表中找到。
什么是定时器?
定时器本质上是计数器。让我给你举个简单的例子。假设您想每 5 秒触发一次任务。现在,如果您有一个可以从 0 计数到 255 的计数器,那么如果您以某种方式调整计数速率,使其在 5 秒内完成计数,那么您可以获得 5 秒的准确间隔。现在,您可以通过两种方式做到这一点 -
您可以调整它的计数速度(每 19 毫秒计数 1 次,或者 51.2 Hz 的计数频率将为您提供 5 秒的间隔)。
或者,您可以调整停止点。因此,不是从 0 到 255 计数,您可以让计时器从 0 到 100 或从 155 到 255 计数,然后所需的频率将是 20 Hz(这是一个比 51.2好得多的数字)。
但是,所有这些设置都需要对 Arduino 的内部寄存器进行一些更改。幸运的是,已经构建的库可以自行处理所有这些设置。我们需要做的就是定义我们希望计时器运行的时间段。一个流行的例子是TimerOne库:https : //github.com/PaulStoffregen/TimerOne
我们在另一篇关于 Arduino 中的定时器中断的文章中介绍了TimerOne库的使用。
有延时功能为什么要使用定时器?
这是您现在可能会遇到的问题。如果您希望每 1 秒执行一次任务,那么只需添加 1 秒的延迟并循环运行该任务。问题是这没有考虑到任务执行所花费的时间。
假设您正在执行的任务需要 100 毫秒的执行时间。因此,任务的两个连续实例之间将存在(100 毫秒执行时间 + 1 秒延迟 = 1.1 秒)的差距。这会弄乱频率。计时器一直在后台运行。从 0 数到 255 后,当您的任务正在运行时,它将再次从 0 开始计数。这样,无论任务的执行时间如何,您都可以确保任务的两个实例之间具有正确的间隔。
您唯一需要确保的是触发中断时调用的函数的执行时间不高于间隔时间。一般来说,中断函数应该尽快返回。