【雕爷学编程】MicroPython手册之 ESP32-S3 定时器

在这里插入图片描述
MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。

MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。

MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。

使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。

在这里插入图片描述

总体来说,ESP32-S3在功耗、硬件资源和功能支持方面进行了优化,非常适合作为低功耗物联网设备的处理平台。相比ESP32,ESP32-S3在无线、安全性和稳定性等方面有所提升。

1、搭载 Xtensa® 32 位 LX7 双核处理器,主频 240 MHz,内置 512 KB SRAM (TCM),具有 45 个可编程 GPIO 管脚和丰富的通信接口。
2、支持更大容量的高速 Octal SPI flash 和片外 RAM,支持用户配置数据缓存与指令缓存。
3、加入了用于加速神经网络计算和信号处理等工作的向量指令 (vector instructions),性能对比 ESP32 有可观的提升。
4、集成 2.4 GHz Wi-Fi (802.11 b/g/n),支持 40 MHz 带宽;其低功耗蓝牙子系统支持 Bluetooth 5 (LE) 和 Bluetooth Mesh,可通过 Coded PHY 与广播扩展实现远距离通信。它还支持 2 Mbps PHY,用于提高传输速度和数据吞吐量。
5、外设新增 LCD 接口、USB、SD/MMC 主机控制器和 TWAI TM 控制器等常用外设接口。
6、拥有完善的安全机制和保护措施,支持基于 AES-XTS 算法的 flash 加密、基于 RSA 算法的安全启动、数字签名和 HMAC。还新增了一个“世界控制器 (World Controller)”模块,提供了两个互不干扰的执行环境,实现可信执行环境或权限分离机制。

在这里插入图片描述
MicroPython的ESP32-S3定时器是基于MicroPython语言的一组功能模块,用于在ESP32-S3芯片上实现定时器功能。下面将详细解释其主要特点、应用场景以及需要注意的事项。

MicroPython的ESP32-S3定时器具有以下主要特点:

多个定时器通道:ESP32-S3芯片上的定时器模块提供多个定时器通道,允许同时管理多个定时器任务,实现并行执行。

灵活的定时器配置:ESP32-S3定时器模块提供了灵活的配置选项,包括定时器频率、计数模式和中断触发方式等。这使得开发人员可以根据具体应用需求选择最合适的配置参数。

中断触发和回调函数:ESP32-S3定时器模块支持中断触发机制。当定时器达到设定的时间时,会触发中断,并执行预定义的回调函数。通过回调函数,开发人员可以在定时器到期时执行特定的操作,如数据采集、状态更新等。

ESP32-S3定时器在以下应用场景中有广泛的应用:

定时任务和周期性操作:通过配置ESP32-S3定时器的计时周期和中断触发方式,可以实现定时执行的任务。例如,数据采集、数据传输、周期性状态更新等。

PWM信号生成:ESP32-S3定时器模块支持生成PWM信号。通过配置定时器通道的计数模式和频率,可以实现精确的PWM信号生成,用于控制电机速度、LED亮度调节等应用。

输入捕获和边沿检测:ESP32-S3定时器模块具备输入捕获功能,可以实时记录外部信号的边沿变化。这可用于测量脉冲宽度、频率计数等应用。

在使用ESP32-S3定时器时,需要注意以下事项:

定时器资源限制:ESP32-S3芯片上的定时器资源是有限的。在使用定时器时,应合理规划和管理资源的使用,避免资源冲突和过度占用,以确保系统的稳定性和可靠性。

中断处理:定时器模块的中断触发机制需要与中断处理程序配合使用。编写正确的中断处理程序,并避免在中断处理程序中执行耗时操作,以避免影响系统的响应性能。

定时器精度:ESP32-S3定时器的精度受到一定的限制,可能存在一定的误差。在使用定时器时,应了解和考虑其精度范围,并进行适当的校准和误差处理,以满足应用的要求。

定时器冲突:如果同时使用多个定时器通道,需要注意定时器之间的冲突和协调。配置和使用定时器时,应避免冲突,以确保定时器的正常工作和准确性。

综上所述,MicroPython的ESP32-S3定时器具有灵活性、多通道支持和中断触发等特点,可广泛应用于定时任务、PWM信号生成和输入捕获等场景。在使用时,需要注意资源管理、中断处理、精度和冲突问题。

案例一:使用ESP32-S3的定时器实现LED闪烁

from machine import Pin, Timer
import time

# 定义LED引脚
led = Pin(2, Pin.OUT)

# 定义定时器回调函数
def led_blink(timer):
    led.value(not led.value())

# 创建定时器对象,设置间隔为1秒(1000毫秒)
timer = Timer(0)
timer.init(period=1000, mode=Timer.PERIODIC, callback=lambda t: led_blink(t))

# 主循环
while True:
    time.sleep(1)

要点解读:在这个程序中,我们使用了MicroPython的machine模块中的Pin和Timer类来实现LED的闪烁。首先,我们定义了LED的引脚为2号引脚,并将其设置为输出模式。然后,我们定义了一个定时器回调函数led_blink,用于切换LED的状态。接下来,我们创建了一个定时器对象timer,并设置了间隔为1秒(1000毫秒),模式为周期性,回调函数为led_blink。最后,我们进入主循环,让程序持续运行。

案例二:使用ESP32-S3的定时器实现按键计数

from machine import Pin, Timer
import time

# 定义按键引脚
button = Pin(0, Pin.IN, Pin.PULL_UP)

# 定义按键计数变量
count = 0

# 定义定时器回调函数
def button_press(timer):
    global count
    count += 1
    print("按键按下次数:", count)

# 创建定时器对象,设置间隔为1秒(1000毫秒)
timer = Timer(1)
timer.init(period=1000, mode=Timer.PERIODIC, callback=lambda t: button_press(t))

# 主循环
while True:
    time.sleep(1)

要点解读:在这个程序中,我们使用了MicroPython的machine模块中的Pin和Timer类来实现按键计数功能。首先,我们定义了按键的引脚为0号引脚,并将其设置为输入模式,同时启用内部上拉电阻。然后,我们定义了一个全局变量count用于存储按键按下的次数。接着,我们定义了一个定时器回调函数button_press,用于在每次按键按下时增加计数器的值,并打印出当前计数值。最后,我们创建了一个定时器对象timer,并设置了间隔为1秒(1000毫秒),模式为周期性,回调函数为button_press。进入主循环后,程序将持续运行。

案例三:使用ESP32-S3的定时器实现PWM输出

from machine import Pin, PWM
import time

# 定义PWM引脚
pwm_pin = Pin(5, Pin.OUT)

# 定义PWM对象
pwm = PWM(pwm_pin, freq=1000, duty=50)

# 主循环
while True:
    for duty in range(0, 101, 5):
        pwm.duty(duty)
        time.sleep(0.5)
    for duty in range(100, -1, -5):
        pwm.duty(duty)
        time.sleep(0.5)

要点解读:在这个程序中,我们使用了MicroPython的machine模块中的Pin和PWM类来实现PWM输出功能。首先,我们定义了PWM的引脚为5号引脚,并将其设置为输出模式。然后,我们创建了一个PWM对象pwm,并设置了频率为1000Hz,占空比为50%。接下来,我们进入主循环,通过改变PWM对象的占空比来控制输出信号的强度。在这个例子中,我们让PWM信号从0%到100%变化,然后再从100%回到0%,实现了一个简单的PWM波形输出。

案例四:使用定时器实现周期性任务
在这个程序中,我们将使用ESP32-S3的定时器功能实现一个周期性任务。具体来说,我们将使用machine.timer()函数创建一个定时器对象,并设置定时器的回调函数和回调间隔时间。在回调函数中,我们将执行需要周期性执行的任务。

import machine  
import time  
  
def周期性任务():  
    print('执行周期性任务')  
  
# 创建定时器对象,设置回调函数和回调间隔时间  
timer = machine.Timer(2, period=5000, callback=周期性任务)  
  
# 启动定时器  
timer.start()

在这个程序中,我们首先导入了machine模块和time模块。然后,我们定义了一个名为周期性任务的回调函数,用于执行需要周期性执行的任务。接下来,我们使用machine.Timer()函数创建一个定时器对象,并设置回调函数为周期性任务和回调间隔时间为5秒。最后,我们使用timer.start()函数启动定时器。这样,程序将会每隔5秒执行一次周期性任务函数。

案例五:使用定时器实现延时任务
在这个程序中,我们将使用ESP32-S3的定时器功能实现一个延时任务。具体来说,我们将使用machine.timer()函数创建一个定时器对象,并设置定时器的回调函数和延时时间。在回调函数中,我们将执行需要延时执行的任务。

import machine  
import time  
  
def延时任务():  
    print('执行延时任务')  
    time.sleep(2) # 延时2秒  
    print('延时任务执行完毕')  
  
# 创建定时器对象,设置回调函数和延时时间  
timer = machine.Timer(2, period=None, callback=延时任务)  
timer.start() # 启动定时器

在这个程序中,我们首先导入了machine模块和time模块。然后,我们定义了一个名为延时任务的回调函数,用于执行需要延时执行的任务。在这个回调函数中,我们首先打印出"执行延时任务",然后使用time.sleep()函数设置一个2秒的延时,最后打印出"延时任务执行完毕"。接下来,我们使用machine.Timer()函数创建一个定时器对象,并设置回调函数为延时任务和延时时间为2秒。最后,我们使用timer.start()函数启动定时器。这样,程序将会在执行完"执行延时任务"的打印后暂停2秒,然后打印出"延时任务执行完毕"。

案例六:使用定时器实现硬件定时开关
在这个程序中,我们将使用ESP32-S3的定时器功能实现一个硬件定时开关。具体来说,我们将使用machine.timer()函数创建一个定时器对象,并设置定时器的回调函数和开关时间。在回调函数中,我们将控制硬件的开关状态。

import machine  
import time  
  
# 设置GPIO引脚为输出模式  
pin = machine.Pin(2, machine.Pin.OUT)  
  
def定时开关():  
    if pin.value() == 1: # 如果当前为开状态  
        pin.off() # 关闭开关  
    else: # 如果当前为关状态  
        pin.on() # 打开开关  
  
# 创建定时器对象,设置回调函数和开关时间  
timer = machine.Timer(2, period=5000, callback=定时开关)  
timer.start() # 启动定时器

在这个程序中,我们首先导入了machine模块和time模块。然后,我们使用machine.Pin()函数将GPIO引脚2设置为输出模式,并将其存储在pin变量中。接下来,我们定义了一个名为定时开关的回调函数,用于控制硬件的开关状态。在这个回调函数中,我们首先检查当前开关状态,如果为开状态则关闭开关,否则打开开关。然后,我们使用machine.Timer()函数创建一个定时器对象,并设置回调函数为定时开关和开关时间为5秒。最后,我们使用timer.start()函数启动定时器。这样,程序将会每隔5秒控制一次硬件开关的状态。

案例七:定时执行任务:

import machine

def task():
    print("Task executed")

tim = machine.Timer(-1)
tim.init(period=5000, mode=machine.Timer.PERIODIC, callback=lambda t: task())

要点解读:
该代码片段演示了如何使用MicroPython在ESP32-S3上设置定时器以定时执行任务。
使用machine.Timer()创建一个定时器对象。
使用init()方法初始化定时器,指定定时周期(单位为毫秒)、工作模式和回调函数。
在这个示例中,定时器每隔5秒执行一次task()函数,并打印出"Task executed"。

案例八:倒计时器:

import machine

def countdown(seconds):
    for i in range(seconds, 0, -1):
        print("Countdown:", i)
        machine.delay(1000)

countdown(10)

要点解读:
该代码片段演示了如何使用MicroPython在ESP32-S3上实现倒计时器功能。
使用machine.delay()函数进行延时操作,单位为毫秒。
在这个示例中,countdown()函数从指定的秒数开始倒计时,并每秒打印出剩余秒数。

案例九:定时测量时间间隔:

import machine
import time

def measure_interval():
    start_time = time.ticks_ms()
    machine.delay(2000)  # 模拟一些耗时操作
    end_time = time.ticks_ms()
    interval = time.ticks_diff(end_time, start_time)
    print("Interval:", interval, "ms")

measure_interval()

要点解读:
该代码片段演示了如何使用MicroPython在ESP32-S3上定时测量时间间隔。
使用time.ticks_ms()函数获取当前的毫秒级时间戳。
使用time.ticks_diff()函数计算两个时间戳之间的差值,得到时间间隔。
在这个示例中,measure_interval()函数测量一个耗时操作的时间间隔,并打印出结果。

请注意,以上案例只是为了拓展思路,可能存在错误或不适用的情况。不同的硬件平台、使用场景和MicroPython版本可能会导致不同的使用方法。在实际编程中,您需要根据您的硬件配置和具体需求进行调整,并进行多次实际测试。需要正确连接硬件并了解所使用的传感器和设备的规范和特性非常重要。对于涉及到硬件操作的代码,请确保在使用之前充分了解和确认所使用的引脚和电平等参数的正确性和安全性。

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值