【雕爷学编程】MicroPython手册之 pyboard 特定端口库 pyb.Timer()

在这里插入图片描述

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进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。

在这里插入图片描述

pyboard是一个紧凑而强大的电子开发板,运行MicroPython。它通过USB连接到您的PC,为您提供一个USB闪存驱动器来保存Python脚本,以及用于即时编程的串行Python提示符(REPL)。需要微型 USB 电缆。适用于 Windows、Mac 和 Linux。

MicroPython是对Python(版本3.4)编程语言的完全重写,因此它适合并在微控制器上运行。它包括许多优化,因此它可以高效运行并使用很少的 RAM。

MicroPython在pyboard上运行裸机,本质上是一个Python操作系统。内置 pyb 模块包含用于控制板上可用外设的函数和类,例如 UART、I2C、SPI、ADC 和 DAC。观看此视频,了解 pyboard 的概述。

在这里插入图片描述
MicroPython 的 pyb.Timer() 是一个用于创建和操作内部定时器的函数。内部定时器可以用于多种任务,目前只实现了最简单的情况:定期调用一个函数。每个定时器都包含一个以特定速率递增的计数器,当计数器达到定时器周期时,会触发一个事件,并且计数器会重置回零。通过使用回调方法,定时器事件可以调用 Python 函数。

pyb.Timer() 的主要特点是:

它是一种简单而方便的定时器对象创建方式,可以用 pyb.Timer() 的形式来创建一个定时器对象,不需要指定任何参数。
它是一种灵活而强大的定时器对象操作方式,可以用 init 方法来设置定时器的参数,如频率、预分频器、周期、模式等,可以用 counter、prescaler、period 等方法来获取或设置定时器的属性,可以用 callback 方法来注册或取消一个回调函数。
它是一种兼容而可扩展的定时器对象接口方式,可以用其他模块或函数来访问或修改定时器对象的属性和方法,可以用其他硬件或软件来同步或校准定时器的时钟。

pyb.Timer() 的应用场景有:

用于实现固定频率的动作或反馈,如以固定频率切换 LED 灯、发出蜂鸣声、打印信息等。
用于实现时间相关的控制或测量,如控制 PWM 信号的占空比、测量信号的频率或脉宽等。
用于实现创意和艺术的表达,如控制一些装置或装饰品的动态效果,如摇摆风扇、摇头娃娃等。

pyb.Timer() 的需注意事项有:

在使用 pyb.Timer() 之前,需要确保 pyboard 已经正确地连接到电源和电脑,并且已经安装了 MicroPython 的固件。
在使用 pyb.Timer() 时,需要注意定时器对象的电压范围和电流限制,避免造成硬件损坏或故障。
在使用 pyb.Timer() 时,需要注意定时器对象的功能冲突和共享问题,避免造成功能失效或干扰。例如,Timer (2) 和 Timer (3) 用于 PWM 分别设置 LED (3) 和 LED (4) 的亮度;Timer (5) 控制伺服驱动器;Timer (6) 用于定时 ADC/DAC 读/写。建议在程序中使用其他定时器。

以下是几个使用 pyb.Timer() 的实际运用程序案例:

案例一:使用 pyb.Timer(4) 来创建一个定时器对象,并以 2 Hz 的频率触发回调函数,回调函数会让 LED (1) 灯切换状态。代码如下:

import pyb # 导入 pyb 模块
tim = pyb.Timer(4) # 创建一个定时器对象
tim.init(freq=2) # 设置定时器的频率为 2 Hz
tim.callback(lambda t:pyb.LED(1).toggle()) # 设置回调函数为切换 LED (1) 灯

这个程序可以让 LED (1) 灯以每秒一次的频率闪烁。你可以用其他方法来修改 LED (1) 灯的颜色或亮度。如果你想了解更多关于 LED 对象的信息,你可以参考以下链接。

案例二:使用 pyb.Timer(4) 来创建一个定时器对象,并以 100 Hz 的频率触发回调函数,回调函数会向 X1 引脚上连接的 DAC8552 数模转换模块发送数据,输出一个正弦波信号。代码如下:

import pyb # 导入 pyb 模块
import math # 导入 math 模块
spi = pyb.SPI(1) # 创建一个 SPI 对象,表示 X1 引脚上的 SPI 总线
dac8552_addr = 0x30 # DAC8552 的 SPI 地址
dac8552_cmd_a = b'\x10' # DAC8552 的 A 输出通道命令字节
angle = 0 # 定义一个角度变量,初始值为 0
def send_data(t): # 定义一个回调函数
    global angle # 声明全局变量 angle
    value_a = int((math.sin(math.radians(angle)) + 1) * 2047.5) # 根据角度计算 A 输出通道的值,范围为 [0,4095]
    data_a = dac8552_cmd_a + value_a.to_bytes(2, 'big') # 组合 A 输出通道的命令字节和数据字节
    spi.send_recv(data_a, addr=dac8552_addr) # 向 DAC8552 发送 A 输出通道的数据
    angle += 10 # 角度增加 10 度
    if angle >= 360: # 如果角度大于等于 360 度
        angle = 0 # 角度归零
tim = pyb.Timer(4) # 创建一个定时器对象
tim.init(freq=100) # 设置定时器的频率为 100 Hz
tim.callback(send_data) # 设置回调函数为 send_data

这个程序可以让 DAC8552 模块输出一个频率为 10 Hz 的正弦波信号。你可以用示波器或其他设备来观察和测量这个信号。如果你想了解更多关于 DAC8552 模块的信息,你可以参考以下链接。

案例三:使用 pyb.Timer(4) 来创建一个定时器对象,并以 1 Hz 的频率触发回调函数,回调函数会打印当前的日期和时间。代码如下:

import pyb # 导入 pyb 模块
rtc = pyb.RTC() # 创建一个 RTC 对象
rtc.datetime((2023, 4, 6, 4, 11, 54, 3, 0)) # 设置 RTC 的日期和时间为 2023 年 4 月 6 日 星期四 11:54:03
def show_time(t): # 定义一个回调函数
    year, month, day, weekday, hour, minute, second, subsecond = rtc.datetime() # 获取 RTC 的日期和时间
    print('Date: {}/{}/{}'.format(year, month, day)) # 打印 RTC 的日期
    print('Time: {}:{}:{}'.format(hour, minute, second)) # 打印 RTC 的时间
tim = pyb.Timer(4) # 创建一个定时器对象
tim.init(freq=1) # 设置定时器的频率为 1 Hz
tim.callback(show_time) # 设置回调函数为 show_time

这个程序可以让终端每秒显示一次当前的日期和时间。你可以用其他方法来修改 RTC 的日期和时间。

案例四:定时执行任务:

import pyb

# 初始化Timer对象
timer = pyb.Timer(1)

# 定义任务函数
def task():
    print("执行任务!")

# 设置定时器中断回调函数
timer.callback(task)

# 设置定时器的定时周期为1秒
timer.init(freq=1)

# 保持程序运行
while True:
    pass

在这个例子中,我们使用pyb.Timer()函数初始化Timer对象,并指定使用的定时器号(在这里是1)。我们定义了一个任务函数task(),用于在定时器中断时执行。通过调用timer.callback()方法,我们将任务函数设置为定时器的中断回调函数。然后,通过调用timer.init()方法,我们设置定时器的定时周期为1秒。最后,我们使用一个无限循环来保持程序运行。

案例五:计时器功能:

import pyb

# 初始化Timer对象
timer = pyb.Timer(2, prescaler=83, period=9999)

# 开始计时
timer.counter(0)  # 将计数器值重置为0
timer.start()

# 延时一段时间
pyb.delay(5000)

# 停止计时并获取计时结果
elapsed_time = timer.counter()

print("经过的时间(毫秒):", elapsed_time)

在这个例子中,我们使用pyb.Timer()函数初始化Timer对象,并指定使用的定时器号(在这里是2)。我们通过设置prescaler和period参数来调整计时器的分频和周期,以便实现所需的计时精度。然后,我们使用timer.counter()方法将计数器值重置为0,并使用timer.start()方法开始计时。我们使用pyb.delay()函数延时一段时间(在这里是5000毫秒)。最后,我们使用timer.counter()方法获取经过的时间,并打印出来。

案例六:脉冲计数功能:

import pyb

# 初始化Timer对象
timer = pyb.Timer(3)

# 定义脉冲计数函数
def count_pulse(timer):
    global pulse_count
    pulse_count += 1

# 设置脉冲计数回调函数
pulse_count = 0
timer.callback(count_pulse)

# 计数一段时间内的脉冲数量
pyb.delay(10000)

# 停止计数并获取脉冲数量
total_pulses = pulse_count

print("脉冲数量:", total_pulses)

在这个例子中,我们使用pyb.Timer()函数初始化Timer对象,并指定使用的定时器号(在这里是3)。我们定义了一个脉冲计数函数count_pulse(),用于在每次脉冲到来时增加计数器。通过调用timer.callback()方法,我们将脉冲计数函数设置为定时器的回调函数。然后,我们使用pyb.delay()函数延时一段时间(在这里是10000毫秒),期间计数器会记录脉冲的数量。最后,我们将脉冲数量打印出来。

案例七:定时触发任务

import pyb

# 定义定时器回调函数
def timer_callback(timer):
    print("Timer callback triggered!")

# 创建定时器对象
timer = pyb.Timer(1)

# 设置定时器触发时间和回调函数
timer.init(freq=1, callback=timer_callback)

这个示例程序使用pyb.Timer()创建一个定时器对象timer。通过调用timer.init()方法,可以设置定时器的触发频率和回调函数。在这个示例中,定时器被设置为每秒触发一次,当定时器触发时,将调用timer_callback()回调函数,并打印相应的信息。

示例8:测量时间间隔

import pyb

# 创建定时器对象
timer = pyb.Timer(2)

# 开始计时
timer.start()

# 执行待测量的任务
# ...

# 停止计时并获取时间间隔
interval = timer.stop()
print("Time interval:", interval, "ms")

这个示例程序使用pyb.Timer()创建一个定时器对象timer。通过调用timer.start()方法,可以开始计时。在待测量的任务执行完成后,通过调用timer.stop()方法,可以停止计时,并获取时间间隔。在这个示例中,打印了计时的时间间隔(以毫秒为单位)。

示例9:PWM输出

import pyb

# 创建定时器对象
timer = pyb.Timer(3)

# 设置定时器的通道和频率
channel = timer.channel(1, pyb.Timer.PWM, pin=pyb.Pin.board.X1, pulse_width_percent=50)
frequency = 1000  # 1kHz
channel.freq(frequency)

# 改变PWM占空比
new_pulse_width_percent = 75
channel.pulse_width_percent(new_pulse_width_percent)

这个示例程序使用pyb.Timer()创建一个定时器对象timer。通过调用timer.channel()方法,可以创建定时器的通道,并设置通道的工作模式为PWM。在这个示例中,定时器通道被设置为使用引脚X1作为PWM输出引脚,初始占空比为50%。通过调用channel.freq()方法,可以设置PWM的频率。通过调用channel.pulse_width_percent()方法,可以改变PWM的占空比。在这个示例中,将PWM的占空比改变为75%。

这些示例程序展示了使用pyb.Timer()的一些用法,可以用于定时触发任务、测量时间间隔和进行PWM输出等功能。具体的应用场景和使用方式可能会根据实际需求而有所不同。

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值