【雕爷学编程】MicroPython手册之 WiPy 特定端口库 wipy.machine.timerchannel.irq()

在这里插入图片描述

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、适当使用抽象来封装底层硬件操作。

总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述

MicroPython 是一种适用于微控制器的 Python 语言的精简实现,它可以让开发者使用 Python 语法和标准库来编写嵌入式应用程序。WiPy 是一种基于 ESP32 芯片的无线开发板,它支持运行 MicroPython 固件。MicroPython 特定于 WiPy 的库是一组为 WiPy 设计的模块,它们提供了 WiPy 的特有功能和硬件接口的访问。MicroPython 特定于 WiPy 的库的主要特点如下:

1、它包含了一些与 WiPy 相关的模块,如 machine, network, pycom, uos 等,它们分别提供了 WiPy 的机器级别控制,网络连接,灯光控制,操作系统接口等功能。
2、它还包含了一些通用的 MicroPython 模块,如 binascii, hashlib, math, random, struct, time 等,它们提供了一些常用的数据处理,加密,数学,随机数,数据结构,时间等功能。
3、它遵循了 MicroPython 的设计原则,即简洁,高效,可移植和兼容。

在这里插入图片描述

MicroPython的wipy.machine.timerchannel.irq()是一个用于注册或注销定时器通道的中断请求(IRQ)的方法。中断请求是一种机制,可以让定时器通道在触发某些事件时执行一个回调函数,例如超时、匹配或捕获。

wipy.machine.timerchannel.irq()的主要特点是:

它可以根据定时器通道的触发模式(超时、匹配或捕获)设置回调函数的触发条件,例如在每次周期结束、每次占空比匹配或每次输入信号捕获时执行回调函数。
它可以指定回调函数的优先级,用于在多个中断请求同时发生时决定执行的顺序,优先级越高越先执行。
它可以传入一个回调函数作为参数,用于注册该函数到定时器通道的中断请求,或者传入None作为参数,用于注销已经注册的回调函数。

wipy.machine.timerchannel.irq()的应用场景有:

在需要输出一个固定或可变频率、周期、极性、占空比的PWM信号时,使用该方法来注册一个回调函数,用于在每次匹配时改变占空比,例如实现渐变、呼吸等效果。
在需要定期执行某些操作或任务时,使用该方法来注册一个回调函数,用于在每次超时时执行该操作或任务,例如闪烁LED灯、读取传感器数据、更新显示屏等。
在需要捕获输入信号的参数时,使用该方法来注册一个回调函数,用于在每次捕获时获取信号的频率、周期、极性、占空比等信息,例如测量频率计数器、编码器等设备。

wipy.machine.timerchannel.irq()的注意事项有:

在使用该方法之前,应确保已经创建并配置了一个TimerChannel对象,并指定了定时器通道的频率、周期、极性等参数。
在使用该方法时,应确保给出了触发模式和优先级两个参数,否则会引发异常。
在使用该方法后,应注意保存返回的IRQ对象,并使用它来操作中断请求,例如启动或停止中断请求,获取或设置中断请求的状态。

以下是MicroPython的wipy.machine.timerchannel.irq()几个实际运用程序案例:

案例一:使用PWM模式的定时器,在GP24引脚上输出一个1kHz频率、可变占空比、负极性的PWM信号,并用它来控制一个LED灯的亮度。

from machine import Timer

tim = Timer(0) # 创建一个16位的硬件定时器
tim.init(mode=Timer.PWM, freq=1000) # 初始化为PWM模式,频率为1kHz

def fade(timer):
    duty = timer.duty_cycle() # 获取当前的占空比
    if duty < 10000: # 如果占空比小于100%
        duty += 100 # 增加占空比1%
    else: # 如果占空比等于100%
        duty = 0 # 重置占空比为0
    timer.duty_cycle(duty) # 设置新的占空比

ch = tim.channel(Timer.A, polarity=Timer.NEGATIVE, duty_cycle=0) # 创建并配置通道A,极性为负,占空比为0
ch.irq(handler=fade, trigger=Timer.MATCH) # 注册回调函数,在每次匹配时执行渐变函数
ch.start() # 启动通道

案例二:使用周期触发模式的定时器,在每秒钟读取GP22引脚上连接的温度传感器的数据,并打印出来。

from machine import Pin, Timer, ADC

adc = ADC(bits=12) # 创建一个12位的ADC对象
temp = adc.channel(pin="GP22") # 创建一个ADC通道连接到温度传感器
tim = Timer(1) # 创建一个16位的硬件定时器
tim.init(mode=Timer.PERIODIC, freq=1) # 初始化为周期触发模式,频率为1Hz

def read(timer):
    value = temp.value() # 读取ADC通道的值
    voltage = value * 3.3 / 4095 # 计算电压值
    temperature = (voltage - 0.5) * 100 # 计算温度值
    print("Temperature: {:.2f} C".format(temperature)) # 打印温度值

ch = tim.channel(Timer.A, trigger=Timer.TIMEOUT) # 创建并配置通道A,在超时时触发
ch.irq(handler=read, trigger=Timer.TIMEOUT) # 注册回调函数,在每次超时时执行读取函数
ch.start() # 启动通道

案例三:使用单次触发模式的定时器,在GP9引脚上捕获一个输入信号,并打印出信号的频率和占空比。

from machine import Pin, Timer

pin = Pin("GP9", mode=Pin.IN) # 创建一个输入引脚连接到信号源
tim = Timer(2) # 创建一个16位的硬件定时器
tim.init(mode=Timer.ONE_SHOT, period=1000) # 初始化为单次触发模式,周期为1秒

def capture(timer):
    freq = timer.freq() # 获取捕获到的频率
    duty_cycle = timer.duty_cycle() # 获取捕获到的占空比
    print("Frequency: {} Hz".format(freq)) # 打印频率
    print("Duty cycle: {:.2f} %".format(duty_cycle / 100)) # 打印占空比

ch = tim.channel(Timer.A, polarity=pin.value()) # 创建并配置通道A,极性与引脚相同
ch.irq(handler=capture, trigger=Timer.CAPTURE) # 注册回调函数,在每次捕获时执行捕获函数
ch.start() # 启动通道

案例四:设置定时器中断处理函数:

from machine import Timer

def handle_irq(timer):
print('Timer IRQ')

timer = Timer()
channel = timer.channel()
channel.irq(trigger=Timer.EDGE_RISING, handler=handle_irq)

案例五:删除中断处理函数:

def handle_irq(timer):
pass

channel.irq(handler=None)

案例六:设置不同中断触发方式:

channel.irq(trigger=Timer.EDGE_FALLING, handler=handle_irq)

第一个例子绑定定时器中断服务函数。第二个例子清除已绑定的中断函数。第三个例子设置中断触发条件。irq()函数管理定时器中断,可以绑定/解绑中断服务函数,以及设置中断触发条件。用于定时器原生中断驱动实现高性能和实时处理功能。

案例七:数据采集:

from machine import Timer, ADC

# 创建一个定时器对象
timer = Timer(-1)

# 创建一个ADC对象
adc = ADC(0)

# 定义数据采集函数
def collect_data(timer):
    sensor_value = adc.read()
    print("传感器数值:", sensor_value)

# 每隔1秒采集一次数据
timer_channel = timer.channel(0, Timer.PERIODIC, callback=collect_data)
timer_channel.freq(1)
timer_channel.start()

在这个例子中,我们使用machine.Timer()创建一个定时器对象,并指定编号为-1。然后,我们使用machine.ADC()创建一个ADC对象,用于读取传感器的数值。接着,我们定义了一个数据采集函数collect_data(),在每次定时器中断触发时调用该函数。在函数中,我们使用ADC对象读取传感器的数值,并打印出来。最后,我们使用定时器的通道功能,设置定时器的频率为1Hz,并启动定时器。

案例八:超时处理:

from machine import Timer

# 创建一个定时器对象
timer = Timer(-1)

# 定义超时处理函数
def timeout_handler(timer):
    print("操作超时!")

# 设置5秒的超时时间
timer_channel = timer.channel(0, Timer.ONE_SHOT, callback=timeout_handler)
timer_channel.freq(1)
timer_channel.start()

在这个例子中,我们使用machine.Timer()创建一个定时器对象,并指定编号为-1。然后,我们定义了一个超时处理函数timeout_handler(),在定时器触发中断时调用该函数。在函数中,我们打印出"操作超时!"。最后,我们使用定时器的通道功能,设置定时器的模式为一次性执行,并设置定时器的频率为1Hz,并启动定时器。

案例九:PWM输出:

from machine import Timer, Pin

# 创建一个定时器对象
timer = Timer(-1)

# 创建一个LED引脚对象
led_pin = Pin(0, Pin.OUT)

# 定义PWM输出函数
def pwm_output(timer):
    led_pin.toggle()

# 每隔500ms切换LED的状态
timer_channel = timer.channel(0, Timer.PERIODIC, callback=pwm_output)
timer_channel.freq(2)
timer_channel.start()

在这个例子中,我们使用machine.Timer()创建一个定时器对象,并指定编号为-1。然后,我们使用machine.Pin()创建一个LED引脚对象,并将其设置为输出模式。接着,我们定义了一个PWM输出函数pwm_output(),在每次定时器中断触发时切换LED的状态。在函数中,我们使用led_pin.toggle()方法切换LED的状态。最后,我们使用定时器的通道功能,设置定时器的频率为2Hz,并启动定时器。

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值