9.定时器
pyboard 板拥有 14 个可以运行用户自行定义频率的独立计时值的定时器。可用于特定时间间隔运行不同的函数。14 个定时器编号从 1 到 14,当在其中 3 号定时器保留内部使用,5 号 6 号定时器分别用于伺服系统和 ADC/DAC 控制,故尽可能避免使用这三个定时器。
我们可以创建一个定时器对象:
>>> tim = pyb.Timer(4)
现在看看创建的对象里边是什么:
>>> timTimer(4)
程序里边 tim 对象与定时器4连接,但还没被初始化。现在初始化为 10 Hz 触发(每秒钟十次)。
>>> tim.init(freq=10)
随着初始化完成,定时器相关内容可见:
>>> timTimer(4, prescaler=624, period=13439, mode=UP, p=1)
上述信息表明该定时器的运行时钟来源于外部时钟的 624+1 分频,且其计数值从0 到 13439,当其到达时将触发中断,而后计数值将由 0 重新开始。这些设置的数值使得定时器频率为 10Hz,定时器的源频率为 84MHz,(可在运行 tim.source_freq( )函数发现),计算公式为:84MHz/625/13440 =10Hz。
9.1 定时器计数值
该如何操作我们的定时器?最基础的方式乃是获得定时器的当前值:
>>> tim.counter()21504
该数值将持续改变,持续增加。
9.2 定时器回调
接下来我们可以构造一个定时器被触发时便会执行的回调函数(可以参照前边按键教程里的回调函数内容):
>>> tim.callback(lambda t:pyb.LED(1).toggle( ))
上述语句将开启LED 灯的持续闪烁,且其频率为 5MHz(一次闪烁包含两个翻转,所以10Hz的翻转频率得到5Hz的闪烁现象)。通过重新初始化定时器可以改变频率值:
>>> tim.init(freq=20)
传递参数 None 可以关闭回调函数:
>>> tim.callback(None)
若以函数作为回调函数的参数,这要求其必须有一个自变数,使得定时器对象能被触发。这将允许你在回调函数里边控制定时器。
我们可以创建两个定时器并分别运行之:
>>> 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,这将使得该定时器频率为 1MHz。这是由于 运行频率达到168MHz的CPU 时钟被二分频,再被预订值 +1分频,所以定时器2 的频率为:168 MHz/2/(83+1)=1MHz。周期值设置较大以便于定时器可以在计数值加到一定程度便回归到0 。上述例子里计数值大约在17 分钟后回归到 0 。
使用该定时器,首先最好重置为0 。
>>> micros.counter(0)
然后按照你的设置开始计时:
>>> start_micros = micros.counter()... do some stuff ...>>> end_micros = micros.counter()