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

在这里插入图片描述

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的pyboard特定端口库pyb.udelay(us)是一个用来延迟程序执行的函数。

它的主要特点、应用场景和需注意事项如下:

主要特点:pyb.udelay(us)函数可以让程序暂停执行指定的微秒数,参数us应该是一个正数或0。在延迟期间,CPU不会执行任何其他任务,只会等待延迟结束。

应用场景:pyb.udelay(us)函数可以用来控制程序的执行精度,或者在需要等待非常短的时间的情况下使用。例如,可以使用pyb.udelay(us)函数来实现精确的脉冲宽度调制(PWM)信号,或者在与某些外设通信时添加必要的延迟时间。

需注意事项:pyb.udelay(us)函数会占用CPU资源,不适合用来实现长时间的延迟。如果需要长时间的延迟,可以使用time.sleep()函数,它会让CPU进入低功耗模式,等待外部中断唤醒2。另外,pyb.udelay(us)函数的精度受到硬件和软件的影响,可能不是非常准确。

下面给出几个使用pyb.udelay(us)函数的实际运用程序案例:

案例一:使用内部LED灯实现呼吸灯效果

# 导入所需模块
import pyb

# 创建内部LED灯对象,选择第4个(蓝色)LED灯
led = pyb.LED(4)

# 定义一个函数,根据亮度值生成PWM信号
def pwm_led(intensity):
    # PWM信号的周期为1000微秒
    period = 1000

    # PWM信号的占空比为亮度值除以255
    duty = intensity / 255

    # PWM信号的高电平时间为占空比乘以周期
    on_time = int(duty * period)

    # PWM信号的低电平时间为周期减去高电平时间
    off_time = period - on_time

    # 产生PWM信号
    led.on() # 设置LED灯为高电平
    pyb.udelay(on_time) # 延迟高电平时间
    led.off() # 设置LED灯为低电平
    pyb.udelay(off_time) # 延迟低电平时间

# 循环改变LED灯的亮度,并产生PWM信号
while True:
    # 从0到255逐渐增加亮度
    for i in range(256):
        pwm_led(i)

    # 从255到0逐渐减少亮度
    for i in range(255, -1, -1):
        pwm_led(i)

案例二:使用UART通信发送和接收数据,并添加延迟时间

# 导入所需模块
import pyb

# 创建UART对象,连接到Y1(TX)和Y2(RX)引脚,波特率为9600
uart = pyb.UART(6, 9600)

# 发送数据"Hello"到另一个设备,并添加延迟时间
uart.write("Hello")
pyb.udelay(1000) # 延迟1000微秒

# 如果有数据可读,则读取并打印数据,并添加延迟时间
if uart.any():
    data = uart.read()
    print(data)
    pyb.udelay(1000) # 延迟1000微秒

案例三:使用SPI通信与LCD屏幕进行交互,并添加延迟时间

# 导入所需模块
import pyb

# 创建SPI对象,连接到X5(SCK),X6(MOSI),X7(MISO)引脚,模式为主机,极性为0,相位为0,波特率为1000000
spi = pyb.SPI(1, pyb.SPI.MASTER, polarity=0, phase=0, baudrate=1000000)

# 创建LCD对象,连接到X8(CS),X9(DC),X10(RST)引脚
lcd = pyb.LCD(spi, 'X8', 'X9', 'X10')

# 初始化LCD屏幕,并添加延迟时间
lcd.init()
pyb.udelay(1000) # 延迟1000微秒

# 在LCD屏幕上显示一条水平线,并添加延迟时间
lcd.hline(0, 32, 128, 0xffff) # 从(0, 32)开始,长度为128,颜色为白色的水平线
pyb.udelay(1000) # 延迟1000微秒

# 在LCD屏幕上显示一条垂直线,并添加延迟时间
lcd.vline(64, 0, 64, 0xffff) # 从(64, 0)开始,长度为64,颜色为白色的垂直线
pyb.udelay(1000) # 延迟1000微秒

# 在LCD屏幕上显示一个矩形,并添加延迟时间
lcd.rect(32, 16, 64, 32, 0xffff) # 从(32, 16)开始,宽度为64,高度为32,颜色为白色的矩形
pyb.udelay(1000) # 延迟1000微秒

案例四:精确控制LED亮灭时间:

import pyb

led = pyb.LED(1)

for i in range(5):
led.on()
pyb.udelay(100)
led.off()
pyb.udelay(100)

案例五:超声波测距时序控制:

import pyb
trig = pyb.Pin('X3', pyb.Pin.OUT_PP)
echo = pyb.Pin('X2', pyb.Pin.IN)

trig.low()
pyb.udelay(2)
trig.high()
pyb.udelay(10)
trig.low()

案例六:模拟串口波特率生成:

import pyb

baudrate = 9600
delay = 10000/baudrate

while True:
ser.send(byte)
pyb.udelay(delay)

这些例子分别展示了在LED控制、超声波测距和串口通信场景下利用us级延时控制的应用。

案例七:精确延迟控制:使用pyb.udelay(us)函数实现精确的微秒级延迟控制。

import pyb

while True:
    pyb.udelay(500)  # 延迟500微秒
    # 执行其他操作

在这个程序中,使用pyb.udelay(us)函数添加了500微秒的延迟。可以根据需要在代码中插入这样的延迟以实现精确的时间控制。

案例八:PWM信号生成:使用pyb.udelay(us)函数生成PWM信号,用于控制电机或其他需要脉冲宽度调制的设备。

import pyb

pwm_pin = pyb.Pin(2, pyb.Pin.OUT_PP)  # 使用引脚2作为PWM输出

while True:
    pwm_pin.high()   # 设置引脚为高电平
    pyb.udelay(1000)  # 延迟1000微秒
    pwm_pin.low()    # 设置引脚为低电平
    pyb.udelay(1000)  # 延迟1000微秒

在这个程序中,通过使用pyb.udelay(us)函数,实现了一个简单的PWM信号生成,使引脚2在高电平和低电平之间切换,每个状态持续1毫秒。

案例九:精确时间测量:使用pyb.udelay(us)函数进行精确的时间测量。

import pyb

start_time = pyb.micros()  # 记录起始时间

# 执行需要测量时间的操作

end_time = pyb.micros()  # 记录结束时间
elapsed_time = end_time - start_time  # 计算经过的时间(微秒)
print("Elapsed time:", elapsed_time, "us")

在这个程序中,使用pyb.micros()函数获取当前的微秒级时间戳,通过执行需要测量时间的操作后再次获取时间戳,并计算两个时间戳之间的差值,从而得到经过的时间(微秒)。

这些案例展示了pyb.udelay(us)函数在不同情况下的实际运用。请注意,pyb.udelay(us)函数是一个阻塞函数,会阻塞当前线程的执行。在一些应用中,可能需要考虑使用其他机制来实现非阻塞的微秒级延迟或时间测量。

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值