2886|0

439

帖子

1

TA的资源

一粒金砂(高级)

楼主
 

【翻译】Micropy 官方教程 09 定时器 [复制链接]

9.  定时器
pyboard 板拥有 14 个可以运行用户自行定义频率的独立计时值的定时器。可用于特定时间间隔运行不同的函数。14 个定时器编号从 1 到 14,当在其中 3 号定时器保留内部使用,5 号 6 号定时器分别用于伺服系统和 ADC/DAC 控制,故尽可能避免使用这三个定时器。
我们可以创建一个定时器对象:
  1. >>> tim = pyb.Timer(4)
复制代码

现在看看创建的对象里边是什么:
  1. >>> tim
  2. Timer(4)
复制代码

程序里边 tim 对象与定时器4连接,但还没被初始化。现在初始化为 10 Hz 触发(每秒钟十次)。
  1. >>> tim.init(freq=10)
复制代码

随着初始化完成,定时器相关内容可见:
  1. >>> tim
  2. Timer(4, prescaler=624, period=13439, mode=UP, div=1)
复制代码

上述信息表明该定时器的运行时钟来源于外部时钟的 624+1 分频,且其计数值从0 到 13439,当其到达时将触发中断,而后计数值将由 0 重新开始。这些设置的数值使得定时器频率为 10Hz,定时器的源频率为 84MHz,(可在运行 tim.source_freq( )函数发现),计算公式为:84MHz/625/13440 =10Hz。

9.1 定时器计数值
该如何操作我们的定时器?最基础的方式乃是获得定时器的当前值:
  1. >>> tim.counter()
  2. 21504
复制代码

该数值将持续改变,持续增加。

9.2 定时器回调
接下来我们可以构造一个定时器被触发时便会执行的回调函数(可以参照前边按键教程里的回调函数内容):
  1. >>> tim.callback(lambda t:pyb.LED(1).toggle( ))
复制代码

上述语句将开启LED 灯的持续闪烁,且其频率为 5MHz(一次闪烁包含两个翻转,所以10Hz的翻转频率得到5Hz的闪烁现象)。通过重新初始化定时器可以改变频率值:
  1. >>> tim.init(freq=20)
复制代码

传递参数 None 可以关闭回调函数:
  1. >>> tim.callback(None)
复制代码

若以函数作为回调函数的参数,这要求其必须有一个自变数,使得定时器对象能被触发。这将允许你在回调函数里边控制定时器。
我们可以创建两个定时器并分别运行之:
  1. >>> tim4 = pyb.Timer(4, freq=10)
  2. >>> tim7 = pyb.Timer(7, freq=20)
  3. >>> tim4.callback(lambda t: pyb.LED(1).toggle())
  4. >>> tim7.callback(lambda t: pyb.LED(2).toggle())
复制代码

因为这种回调属于硬件中断自身的内容,所以即使定时器在工作我们依然能够继续使用 pyboard 板做其他事情。

9.3 微秒级别的定时器
可以将定时器作为微秒计数器来使用,这在执行需要非常精确定时的任务里边非常有用。因此我们使用定时器2,因为定时器2 拥有32 位的计数量(定时器5 也同样适用,不过一旦使用定时器5 则无法使用伺服驱动)。
如下代码设置定时器2:
  1. >>> micros = pyb.Timer(2, prescaler=83, period=0x3fffffff)
复制代码

预订值设置为83,这将使得该定时器频率为 1MHz。这是由于 运行频率达到168MHz的CPU 时钟被二分频,再被预订值 +1分频,所以定时器2 的频率为:168 MHz/2/(83+1)=1MHz。周期值设置较大以便于定时器可以在计数值加到一定程度便回归到0 。上述例子里计数值大约在17 分钟后回归到 0 。
使用该定时器,首先最好重置为0 。
  1. >>> micros.counter(0)
复制代码

然后按照你的设置开始计时:
  1. >>> start_micros = micros.counter()
  2. ... do some stuff ...
  3. >>> end_micros = micros.counter()
复制代码




此帖出自stm32/stm8论坛

赞赏

1

查看全部赞赏

点赞 关注
个人签名君应有语,渺万里层云,千山暮雪,知向谁边?
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表