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