9. 计时器

pyboard 有 14 个计时器,每个计时器都包含一个以用户定义的频率运行的独立计数器。它们可以设置为以特定时间间隔运行功能。14 个定时器编号为 1 到 14,但 3 保留供内部使用,5 和 6 用于伺服和 ADC/DAC 控制。如果可能,请避免使用这些计时器。

让我们创建一个计时器对象:

>>> tim = pyb.Timer(4)

现在让我们看看我们刚刚创建了什么:

>>> tim
Timer(4)

pyboard 告诉我们它 tim 已附加到计时器编号 4,但尚未初始化。因此,让我们将其初始化为以 10 Hz 触发(即每秒 10 次):

>>> tim.init(freq=10)

现在它已初始化,我们可以看到有关计时器的一些信息:

>>> tim
Timer(4, prescaler=624, period=13439, mode=UP, div=1)

该信息表示该定时器设置为以外围时钟速度除以 624+1 运行,它将从 0 计数到 13439,此时触发中断,然后再次从 0 开始计数。这些数字是设置使定时器以 10 Hz 触发:定时器的源频率为 84MHz(通过运行找到tim.source_freq())所以我们得到 84MHz / 625 / 13440 = 10Hz。

9.1. 定时器计数器

那么我们可以用我们的计时器做什么呢?最基本的是获取其计数器的当前值:

>>> tim.counter()
21504

这个计数器会不断变化,并向上计数。

9.2. 定时器回调

我们可以做的下一件事是为定时器注册一个回调函数以在它触发时执行(有关 回调函数的介绍,请参阅switch 教程 ):

>>> tim.callback(lambda t:pyb.LED(1).toggle())

这应该立即启动红色 LED 闪烁。它将以 5 Hz 的频率闪烁(1 次闪烁需要 2 次切换,因此以 10 Hz 的频率切换会使其以 5 Hz 的频率闪烁)。您可以通过重新初始化计时器来更改频率:

>>> tim.init(freq=20)

您可以通过传递值来禁用回调None:

>>> tim.callback(None)

您传递给回调的函数必须采用 1 个参数,即触发的计时器对象。这允许您从回调函数中控制计时器。

我们可以创建 2 个计时器并独立运行它们:

>>> tim4 = pyb.Timer(4, freq=10)
>>> tim7 = pyb.Timer(7, freq=20)
>>> tim4.callback(lambda t: pyb.LED(1).toggle())
>>> tim7.callback(lambda t: pyb.LED(2).toggle())

因为回调是适当的硬件中断,所以我们可以在这些计时器运行时继续将 pyboard 用于其他事情。

9.3. 制作微秒计数器

您可以使用计时器来创建微秒计数器,这在您执行需要准确计时的操作时可能会很有用。为此,我们将使用计时器 2,因为计时器 2 有一个 32 位计数器(计时器 5 也是如此,但如果您使用计时器 5,则您不能同时使用伺服驱动程序)。

我们设置定时器 2 如下:

>>> micros = pyb.Timer(2, prescaler=83, period=0x3fffffff)

预分频器设置为 83,这使得该定时器计数为 1 MHz。这是因为运行在 168 MHz 的 CPU 时钟被 2 分频,然后被预分频器 +1 分频,定时器 2 的频率为 168 MHz/2/(83+1)=1 MHz。周期设置为大数,以便计时器可以在回绕到零之前计数到一个大数。在这种情况下,它需要大约 17 分钟才能循环回零。

要使用此计时器,最好先将其重置为 0:

>>> micros.counter(0)

然后执行您的计时:

>>> start_micros = micros.counter()

... do some stuff ...

>>> end_micros = micros.counter()