第五章——定时器 Timer

定时器

定时器也是一种中断,属于软件中断。它就像一个时钟,可以测量事件的时间间隔。每个单片机都有一个时钟(振荡器),比如在 Arduino Uno 中它是 16Mhz 的晶振。时钟频率越高,处理速度就越快。

计时器使用计数器,该计数器根据时钟频率以特定速度计数。在 Arduino Uno 中,单次计数需要 1/16000000 秒或 62 纳秒。这意味着 Arduino 每 62 纳秒从一条指令移动到另一条指令。

在 Arduino Uno 中有三个定时器,他们分别被使用到以下官方函数和库中:

  • Timer0(8 位定时器)
    • delay()
    • delayMicroseconds()
    • millis()
    • micros()
  • Timer1(16 位定时器)
    • 伺服电机库<Servo.h>
  • Timer2(8 位定时器)
    • tone()函数

有很多支持的官方库可以帮助大家使用计时器,arduino-timer可以让你使用三个定时器,MsTimer2是仅使用了 Timer2 的一个第三方库,使用起来更加简单明了,我个人比较推荐大家使用。

下面是一个使用了 MsTimer2 的 Blink 程序。

#include <MsTimer2.h>

uint8_t led = 13;
boolean LEDStatus;

void ledTask() {
  LEDStatus = !LEDStatus;
  if (LEDStatus)digitalWrite(led, HIGH);
  else digitalWrite(led, LOW);
}

void setup() {
  pinMode(led, OUTPUT);
  MsTimer2::set(1000, ledTask);
  MsTimer2::start();
}

void loop() {
}

有关手动配置 Arduino Uno 定时器的内容这里不做详细介绍,有兴趣的可以参考以下文章:Arduino Timer Tutorial