使用MicroPython和pyboard开发板(10):定时器

pyboard的定时器Timer

Timer

pyboard一共有14个定时器,每个定时器都由一个独立的计数器组成,按照用户定义的频率运行,可以把它们设置为在特定时间间隔内运行某个功能。14个定时器的编号为1至14,其中3为内部专用,5和6用于伺服和ADC/DAC控制,所以应尽量避免使用3、5、6这几个定时器。

下面使用REPL交互创建一个计时器对象:

>>> tim = pyb.Timer(4)

现在看下刚创建的对象:

>>> tim
Timer(4)

可以看到,tim连接到了定时器4,但尚未初始化。因此,下面其初始化为10Hz(即每秒10次)频率触发:

>>> tim.init(freq=10)

现在它已经初始化,可以看到一些关于定时器的信息:

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

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

定时器计数器

那么能用定时器做些什么呢?最基本的是获取计数器的当前值:

>>> tim.counter()
21504

这个计数器会不断变化,并且递增计数。

定时器回调

接下来注册一个回调函数,让定时器在触发时执行:

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

此时红色LED就会立即开始闪烁。它将以5 Hz的频率闪烁(1次闪烁需要2次开关,因此开关10Hz会让它以5Hz的频率闪烁)。可以通过重新初始化定时器来改变频率:

>>> tim.init(freq=20)

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

>>> tim.callback(None)

传递给callback 的函数必须包含一个参数,即触发的定时器对象。这样就可以在回调函数中控制定时器。

下面创建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做其他事情。

制作微秒计数器

可以使用定时器创建一个微秒计数器,这在需要进行精确计时的情况下会很有用。这里使用定时器2,因为定时器2有一个32位计数器(定时器5也有32位计数器,但定时器5,内部用于伺服驱动器,如果使用5就不能同时使用伺服驱动器了)。
定时器2的设置如下:

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

预分频器设置为83,因此该定时器的计数频率为1MHz。这是因为运行频率为168 MHz的CPU时钟除以2再除以预分频器+1,定时器2的频率为168MHz/2/(83+1)=1 MHz。周期被设置为一个比较大的数值,以便定时器在返回零点前能持续较长的时间。在这种情况下,大约需要17分钟才能循环归零。

在使用计数器前,先将其重置为0:

>>> micros.counter(0)

然后开始计时:

>>> start_micros = micros.counter()

... do some stuff ...

>>> end_micros = micros.counter()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原子星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值