计时器是一个常见的硬件特性在所有的微控制器。在单片机定时器和定时器中断的使用应用程序。定时器中断需要精确计时时,经常使用没有错误的一小部分。所有MicroPython港口有一个或多个定时器。这些计时器可能留给特定功能如网络或wi - fi,而其余计时器可以利用用户的应用程序中。本文将探讨在MicroPython定时器和定时器中断的实现。然后,我们将检查计时器ESP8266和ESP32可用。最后,我们将使用上述概念来设计一个ESP8266股票。
MicroPython与时间相关的函数
MicroPython提供了一个时间模块为时间延迟、时间间隔和日期时间维护。这个模块是一个同名的重新CPython的模块。MicroPython时间相关函数符合嵌入式端口,使用2000-01-01就是UTC的时代,而不是时代的POSIX系统的1970-01-01就是UTC。重要的是要注意,设置和维护日历时间取决于操作系统或操作系统安装在支持端口就像树莓皮科。万博app怎么更新一个内置的RTC可能管理这个单片机的端口。MicroPython查询的时间相关函数的OS / RTOS RTC维持或设置日期和时间。时间设置可以通过网络协议或手动完成电池备份。
的时间模块提供了以下时间、日期和delay-related功能。
time . sleep(秒):这个阻塞方法提供了一种延迟秒。一些端口允许指定一个浮点数的延迟时间。一旦调用方法,控制器停止执行用户程序的设置的秒数。
time.sleep_ms(女士):这是另一个阻塞方法,提供了一种延迟毫秒。time . sleep()相比,该方法更精确。一个正数或零可以作为参数传递给这个方法。如果是用于定时器中断、延迟可以扩展到中断服务例程的执行完成。如果0作为参数传递,延迟将执行中断服务例程的时间相等。
time.sleep_us(美国):这是另一个阻塞方法,提供了一种延迟微秒。一个正数或零可以作为参数传递。如果用于定时器中断、延迟可以扩展到中断服务例程的执行完成。如果0作为参数传递,延迟将执行中断服务例程的时间相等。
time.ticks_ms ():这个方法返回的毫秒数起任意引用的方式传递。这是有点类似于Arduino米尔斯()函数。不过,Arduino的米尔斯()函数返回一个启动的时间间隔以毫秒为单位Arduino板,该time.ticks_ms()假定任意点的时间参考。所需的全方位价值作为最大射程总是在2的力量,让它保持不变在MicroPython实现不分港口。它被称为TICKS_PERIOD,等于一个TICKS_MAX以上。因此,调用这个函数始终返回一个非负的值从0到TICKS_MAX包容,这是表明提到的毫秒范围开始通过任意点的时间。重要的是要注意,不像Arduino,标准的数学操作符或关系操作符直接或作为参数ticks_diff ()或ticks_add ()方法该方法返回的值或定时如上所述方法是不允许的。这样的操作可能会导致语法错误(取决于IDE)或错误的结果。
time.ticks_us ():这种方法是类似的time.ticks_ms ()除了它返回时间的流逝从任意点的时间以微秒为单位。
time.ticks_cpu ():这种方法是类似的time.ticks_ms ()和time.ticks_us ()除了它返回的CPU时钟周期从任意点的时间。它提供了最高的分辨率。时钟周期,而是另一个最高分辨率单元提供了一个内置的计时器可能返回港口。应该注意的是,这种方法并不是对所有MicroPython端口可用。因此,明确文档之前必须检查MicroPython脚本使用这种方法。
时间。ticks_add(蜱虫,δ):这种方法计算单片机事件和任务的最后期限。根据时间,它返回一个最后期限在一毫秒,微秒或CPU周期.ticks_ms (),time.ticks_us ()或time.ticks_cpu ()分别用作蜱虫参数。三角洲参数可以是一个整数或一个数值参数。它等于蜱虫的数量,蜱虫可以毫秒、微秒,或CPU周期设置为最后期限。例如,以下语句返回一个最后期限的200毫秒。
最后期限= ticks_add (time.ticks_ms (), 200)
下面的语句返回一个期限为100微秒。
最后期限= ticks_add (time.ticks_us (), 100)
下面的语句返回一个期限20 CPU周期。
最后期限= ticks_add (time.ticks_cpu (), 20)
时间。ticks_diff (ticks1 ticks2):这个方法返回两个节拍之间的区别。蜱虫的区别可能在毫秒、微秒或CPU周期根据返回的time.ticks_ms (),time.ticks_us ()或time.ticks_cpu ()函数分别用作蜱虫。返回的值是ticks1-ticks2,它的范围可以从-TICKS_PERIOD / 2 TICKS_PERIOD / 2 - 1。time.ticks_diff()是有用的在轮询一个超时,调度嵌入式任务,或计算一个最后期限。
time.time ():该方法返回(系统纪元以来的秒数)提供了RTC给定端口的设置和维护。时代是embedded-compatible,返回时间是2000-01-01以来的秒数就是UTC。时代可能是一个明确的参考像以来升高或重置在某些港口。
time.time_ns ():这个方法返回时代以来的毫秒数。它是非常有用的决定绝对时间。这个方法的返回值是一个整数。
time.mktime ():这个方法返回一个时代之间传递的秒数(即。,2000-01-01就是UTC)和当地时间作为参数传递。方法以在一个完整的8-tuple为当地时间,以下格式的元组在哪里——(年,月,日,小时,分钟,秒,工作日,yearday)元组值必须在以下范围。
一年 | 年的广告 |
月 | 1 ~ 12 |
mday | 1日~ 31日 |
小时 | 0 ~ 23 |
一分钟 | 0 ~ 59岁 |
第二个 | 0 ~ 59岁 |
工作日 | 0 ~ 6 Mon ~太阳 |
yearday | 1 ~ 366 |
time.gmtime([秒]):这个方法返回以来UTC日期-时间秒指定为参数。是一个元组格式返回的时间(年、月,小时,分钟,秒,工作日,yearday)。
time.localtime([秒]):这个方法返回指定日期时间在当地时间从秒作为参数。是一个元组格式返回的时间(年、月,小时,分钟,秒,工作日,yearday)。当地时间可能根据OS / RTOS或清债信托公司。
使用定时功能
定时功能方便当需要精确定时MicroPython用户程序。定时功能可以计算时间执行嵌入式任务,设定一个最后期限嵌入式任务,设置超时,嵌入式任务和进度。
下面是一个有效的例子计算时间执行MicroPython脚本的一部分。
导入的时间
开始= time.ticks_us ()
时间测试…# MicroPython语句
打印(time.ticks_diff (time.ticks_us(),开始))
下面是一个有效的寻找TICKS_MAX给定端口的例子。
print (ticks_add (0,1))
下面是一个有效的例子嵌入式任务设定最后期限。
最后期限= ticks_add (time.ticks_ms (), 200)
虽然ticks_diff(最后期限,time.ticks_ms ()) > 0:
do_a_little_of_something ()
下面是一个有效的例子轮询事件超时。
开始= time.ticks_us ()
虽然pin.value () = = 0:
如果time.ticks_diff (time.ticks_us(),开始)> 500:
提高TimeoutError
以下是有效的调度使用定时功能嵌入式任务的例子。
现在= time.ticks_ms ()
scheduled_time = task.scheduled_time ()
如果ticks_diff (scheduled_time现在)= = 0:
打印(“时间执行任务!”)
task.run ()
问题与时间相关的函数
定时功能是相当精确的。定时功能是有用的在计算时间间隔,设置超时事件,甚至调度任务。虽然非阻塞,这些功能并不经常用于提供延迟或安排任务。这背后的主要原因是时间模块的依赖在OS / RTOS或清债信托公司。其次,这些方法可以被其他高优先级中断事件的单片机。
另一方面,时间的delay-related功能模块如time . sleep (), time.sleep_ms()和time.sleep_us()有两个品种问题。首先,这些方法在本质上是阻塞的,停止脚本调用时。其次,这些方法不能提供一个准确的延迟。例如,几秒钟的延迟time . sleep()方法可能有错误的几毫秒。这些错误可以高达1或2%。
在这种情况下,定时器来度假。计时器有更高的优先级的中断,通常不能被覆盖,除了复位。他们中断使用底层硬件,即。,the timer registers that leaves no scope of any error. For setting timeouts or scheduling time-critical embedded tasks, timer interrupts are the best options. At the same time, the ticking functions can be used for setting deadlines or calculating time spent in the execution of critical parts of the MicroPython script.
一个计时器是什么?
每个控制器都有一些内置的硬件特性。定时器/计数器的一个重要内置外设几乎出现在每一个微控制器。定时器/计数器是用来测量时间事件或操作作为一个计数器。一个计时器与单片机的系统时钟,使它来跟踪高度准确和精确的时间。可以有多个单片机定时器。每个定时器配置、跟踪和控制的一组内部寄存器。
什么是定时器中断?
计时器的重要功能之一是时间事件。这是在定时器中断的帮助下完成的。一个事件只不过是在单片机执行一个特定的代码块。这个代码块内封闭中断服务例程(ISR)功能。时一个ISR是执行一个中断。
通常,单片机执行指令的顺序。当一个中断,单片机通过跳过当前执行的代码和执行ISR第一。ISR一旦完成,它恢复正常的代码执行。
定时器中断定时器计数达到设定时提出。通常被称为寄存器更新定时器计数定时器登记。还有另一个寄存器,用户设置引用计数。这通常被称为一个比较和匹配寄存器。可能有一个或多个相关寄存器设置定时器的配置。有注册维护各种中断面具的值。只要提起一个定时器中断,其相应的屏蔽位玩家中断屏蔽寄存器。通过跟踪中断屏蔽位,检测到一个定时器中断。这可以提供一个延迟,设置一个超时,或安排任务在一个中断服务例程。
MicroPython定时器类
MicroPython提供了一个定时器类处理定时器和定时器中断的支持港口。定时器类是一个机器模块的一部分。它是进口MicroPython脚本使用下面的语句。
从机进口计时器
港口是WiPy,必须使用以下语句。
从机进口TimerWiPy
重要的是要注意,如果错误是成长在一个中断服务例程的执行,MicroPython不会产生一个错误报告,除非创建一个特殊的缓冲。因此,必须创建一个缓冲区进行调试时,定时器中断,或其他用于MicroPython中断脚本。缓冲区可以创建使用以下语句。
进口micropython
micropython.alloc_emergency_exception_buf (100)
重要的是要注意,缓冲区只存储最新的异常堆栈跟踪。如果第二堆异常而被锁定后,第二个例外的堆栈跟踪取代原来的痕迹。
导入定时器类之后,必须创建一个计时器对象。这是通过调用构造函数方法。构造函数方法具有以下原型。
类的机器。计时器(id、/、…)
构造函数方法以定时器的id作为参数。它可以是正数0,1,2,等等,为虚拟硬件定时器或1计时器,提供端口支持它。其他配置参数也可以在调用构造函数设置方法。否则,可以使用显式配置的计时器对象timer.init ()方法。timer.init()方法有以下原型。
计时器。init(*模式=计时器。周期,= - 1,回调=没有)
可以设置为定时器模式。ONE_SHOT或Timer.PERIODIC。如果设置计时器。ONE_SHOT计时器只运行一次,直到指定的时间以毫秒为单位。如果设置计时器。周期,计时器运行定期在毫秒间隔作为参数传递期。这个论点期是时间以毫秒为单位执行回调函数用作超时一次或定期根据模式集。回调是一个可调用的过期时间执行。中断服务例程执行所需的嵌入式任务提高定时器中断。可调用可以是一个函数或者方法属于一个类对象。
定时器类允许停止计时器和禁用计时器外围。这是通过调用timer.deinit()方法。调用该方法立即停止计时器如果运行,de-initializes计时器对象,禁用计时器外围。它具有以下原型。
Timer.deinit ()
如果一个残疾必须重新启用定时器,定时器对象相同的ID必须重新创建用户程序。
MicroPython中断处理程序
指定的回调函数作为参数的初始化或创建一个计时器对象运行当定时器中断的中断服务例程。有趣的是,MicroPython不暴露register-level编程计时器。相反,它使用定时器中断来提供一个超时,以毫秒为单位。可通过机器的方法。定时器通常适用于所有受支持的端口。
回调函数或定时器中断服务程序对象需要某些编程的预防措施,以避免运行时故障。我们已经讨论了一个这样的警告:定义一个缓冲区对象来存储最新的异常错误。让我们讨论更多的建议写在MicroPython中断处理程序。
一个中断服务例程的身体必须尽可能短而简单。中断服务例程是为了执行时序要求严格的行动。这些不应该滥用嵌入常规调度的任务。如果需要任何嵌入式任务调度在MicroPython脚本,必须使用micropython.schedule。不应该有内存分配在一个中断服务例程。避免浮点值,将它们插入字典,或附加项列表。然而,在中断服务程序可以更新全局变量。
大多数单片机平台不允许中断服务例程返回值。然而,MicroPython允许中断服务程序并返回一个或多个值。ISR可以返回一个值,更新一个全局变量。如果需要返回多个值,预分配的字节数组必须更新的例行公事。预分配的数组对象必须更新如果例程返回多个整数的值。然而,这之间共享变量和对象的ISR和主循环会导致竞态条件,主程序循环和ISR比赛改变变量的值。因此,更新这些变量的值在主程序循环中需要额外的谨慎。在更新共享变量/字节数组/数组之前在主程序循环中,应该通过调用禁用中断pyb.disable_irq ()方法。后更新共享变量/字节数组/数组在主程序中,可以重新启用中断通过调用pyb.enable_irq ()方法。
定时器在ESP8266
在ESP8266,有两个计时器——timer0和timer1。timer0用于网络功能。在ESP8266 timer1可供使用,但MicroPython ESP8266并提供计时器。相反,ESP8266提供一个API为虚拟计时器。这个RTOS-based虚拟计时器的id为1。下面是一个有效的例子在ESP8266定时器中断。
从机进口计时器
蒂姆=计时器(1)
蒂姆。init(= 500,模式=计时器。ONE_SHOT调=λt:打印(1))
蒂姆。init(= 200,模式=计时器。周期,调=λt:打印(2))
定时器在ESP32
ESP32有四个硬件定时器id为0到3。所有的计时器为用户是可用的。下面是一个有效的例子在ESP32定时器中断。
从机进口计时器
tim0 =计时器(0)
tim0。init(= 2000,模式=计时器。ONE_SHOT调=λt:打印(0))
tim1 =计时器(1)
tim1。init(= 1000,模式=计时器。周期,调=λt:打印(1))
使用ESP8266计时器了
现在让我们使用MicroPython定时器的状态切换。
组件的要求
- ESP8266 / ESP32 x1
- 5毫米领导x1
- 330年Ω电阻器x1
- 电路试验板
- 连接电线/跳线
电路的连接
连接电池的阳极LED GPIO14 ESP8266或ESP32。连接一个电阻330Ω阴极的领导和地面电阻的另一端。
MicroPython脚本
它是如何工作的
领导是与GPIO14 ESP8266这样当董事会源电流发光,虽然它是关闭的,是一个从销低信号。MicroPython脚本实现了一个定时器中断每1秒中领导的状态在哪里的话,和闪烁的数量更新到控制台。
结论
从上面的讨论,我们可以得出结论,MicroPython是有用的在计算超时的定时功能和设置最后期限的执行部分的脚本。定时器中断是有用的时序要求严格的嵌入式任务时要精确计划内的脚本,或定期是否需要执行一次。定时器中断更高效生产的延误和间隔。
你可能也喜欢:
了下:特色的贡献
与本文有关的问题?
询问和讨论Electro-Tech-Online.com和EDAboard.com论坛。
告诉我们你的想法! !
你必须登录发布评论。