【雕爷学编程】MicroPython手册之 SAMD21 延迟和计时

在这里插入图片描述
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进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述
SAMD21是一系列使用32位ARM® Cortex®-M0+处理器的低功耗微控制器,由Microchip Technology公司开发。

SAMD21的技术参数如下:

1、处理器:32位ARM® Cortex®-M0+,最高工作频率为48MHz,每兆赫兹可达2.46 Coremark。
2、存储器:闪存容量从32KB到256KB不等,SRAM容量从4KB到32KB不等。
3、电源管理:支持多种低功耗模式,如空闲和待机模式,最低功耗为3.5μA/MHz。
4、外设:拥有丰富的智能和灵活的外设,如直接内存访问控制器(DMAC)、事件系统、定时器/计数器(TC/TCC)、实时时钟(RTC)、看门狗定时器(WDT)、CRC-32生成器、通用串行总线(USB)2.0接口、串行通信接口(SERCOM)、Inter-IC Sound(I2S)接口、模数转换器(ADC/DAC)、模拟比较器(AC)和外设触摸控制器(PTC)。
5、封装:支持多种封装形式,从32引脚到64引脚不等,包括TQFP、QFN、UFBGA和WLCSP。
6、标准:符合AEC-Q100 Grade 1的汽车级标准,工作温度范围为-40°C到+125°C。

在这里插入图片描述
MicroPython的SAMD21延迟和计时是指在SAMD21微控制器上使用MicroPython语言进行延迟和计时操作的过程。

主要特点:

精确的延迟和计时:SAMD21微控制器具有高精度的时钟和定时器功能,可以实现精确的延迟和计时操作。通过MicroPython语言,开发者可以利用SAMD21的定时器模块来实现精确的时间测量和计时功能。
灵活的时间单位:MicroPython语言提供了灵活的时间单位,如毫秒、微秒等,可以根据具体需求选择合适的时间单位进行延迟和计时操作。这使得开发者可以根据应用场景的要求进行精确的时间控制。
简洁易用的语法:MicroPython语言具有简洁易懂的语法,使得延迟和计时的编程变得简单和直观。开发者可以使用简单的代码实现延迟和计时功能,提高开发效率。

应用场景:

扫描二维码关注公众号,回复: 16960087 查看本文章

实时控制系统:SAMD21微控制器适用于实时控制系统,如自动化控制、仪器仪表等。通过延迟和计时功能,可以实现精确的时间控制,例如定时采样、精确的脉冲生成等。
传感器数据采集:在传感器数据采集应用中,延迟和计时功能非常重要。通过SAMD21的延迟和计时特性,可以精确控制传感器采样的时间间隔,确保数据的准确性和一致性。
通信协议实现:在通信协议的实现中,延迟和计时操作常常被用于精确控制数据传输的时间窗口。通过SAMD21的定时器功能和MicroPython语言的支持,可以实现各种通信协议的精确时序控制。

注意事项:

时钟源和精度:在使用SAMD21的延迟和计时功能时,需要注意时钟源的选择和配置。时钟源的稳定性和精度会影响延迟和计时操作的准确性。确保选择合适的时钟源,并进行正确的配置。
中断处理:在延迟和计时过程中,可能会涉及到中断处理。开发者需要合理处理中断,并确保延迟和计时操作不会受到中断的干扰。
资源占用:延迟和计时功能可能会占用一定的系统资源,如定时器、计数器等。在开发过程中,需要合理规划和管理这些资源,以确保系统的稳定性和可靠性。

综上所述,MicroPython的SAMD21延迟和计时利用SAMD21微控制器的高精度时钟和定时器功能,结合MicroPython语言的灵活性和易用性,实现精确的延迟和计时操作。适用于实时控制系统、传感器数据采集以及通信协议实现等应用场景。在使用延迟和计时功能时,需要注意时钟源和精度、中断处理以及资源占用等方面的问题,以确保延迟和计时操作的准确性和可靠性。

在这里插入图片描述
在MicroPython中,我们可以使用SAMD21微控制器的定时器和延迟功能来实现精确的时间控制。以下是几个实际运用程序参考代码案例:

案例一:使用machine.RTC()获取当前时间

import machine

rtc = machine.RTC()
print("当前时间:", rtc.datetime())

重点解读:这个程序使用machine.RTC()函数创建一个实时时钟对象,然后通过datetime()方法获取当前时间并打印出来。

案例二:使用timer.delay()实现延迟

import time

time.sleep(2)  # 延迟2秒
print("延迟结束")

重点解读:这个程序使用Python内置的time.sleep()函数实现延迟,参数为延迟的秒数。在这个例子中,程序会暂停2秒后再继续执行。

案例三:使用timer.Timer()实现定时器

import machine
from machine import Pin, Timer

def task():
    print("任务执行")

pin = Pin(2, Pin.OUT)  # 设置引脚2为输出模式
timer = Timer(-1)  # 创建一个定时器,初始值为-1,表示立即执行

timer.init(period=1000, mode=Timer.PERIODIC, callback=task)  # 初始化定时器,周期为1000毫秒(1秒),模式为周期性,回调函数为task

重点解读:这个程序使用machine模块中的Pin和Timer类实现定时器功能。首先,我们设置引脚2为输出模式,然后创建一个定时器对象,指定周期为1000毫秒(1秒),并设置回调函数为task。当定时器到达设定的周期时,会自动执行回调函数task。

案例四:简单延迟:

import time  
  
def delay():  
    print("开始延迟")  
    time.sleep(2)  # 延迟2秒  
    print("延迟结束")  
  
delay()

这个程序创建了一个简单的延迟函数。time.sleep(2)使程序暂停执行2秒。这是一个基本的使用时间模块来创建延迟的方法。

案例五:定时器应用:

import machine  
import utime  
  
# 设置定时器  
timer = machine.Timer(3)  # Timer3  
timer.init(period=1000000, mode=machine.Timer.PWM, callback=lambda t: print("定时器回调"))  
  
while True:  
    utime.sleep(1)  # 延迟1秒

这个例子创建了一个定时器,并使用一个回调函数作为定时器触发的事件。在这个例子中,每当定时器触发,就会打印出"定时器回调"。使用机器模块中的Timer函数来初始化定时器,并设置周期和模式。

案例六:使用RTC计时:

import machine  
import utime  
  
rtc = machine.RTC()  # 初始化RTC模块  
rtc.init((2023, 7, 5, 10, 0, 0, 0, 367))  # 设置RTC时间  
  
while True:  
    print("当前时间:", rtc.now())  # 打印当前时间  
    utime.sleep(1)  # 延迟1秒

这个例子展示了如何使用RTC(实时时钟)模块。首先初始化RTC,并设置当前时间。然后在一个无限循环中,每秒打印出当前的时间。需要注意的是,这个例子并没有实际的应用场景,只是展示了如何使用RTC模块。

案例七:使用time模块实现LED闪烁

from machine import Pin
import time

led = Pin('D13', Pin.OUT) # 创建输出引脚对象,连接到D13
while True:
    led.on() # 设置引脚为高电平,点亮LED
    time.sleep(0.5) # 延迟0.5秒
    led.off() # 设置引脚为低电平,熄灭LED
    time.sleep(0.5) # 延迟0.5秒

这个案例使用了time模块的sleep函数,它可以接受一个以秒为单位的参数,实现阻塞式的延迟。也可以使用sleep_ms或sleep_us函数,它们分别接受以毫秒或微秒为单位的参数。这个案例也使用了Pin模块,它可以创建和控制GPIO引脚对象。Pin模块有两个参数,第一个是引脚的标识符,可以是字符串或数字,第二个是引脚的模式,可以是Pin.IN或Pin.OUT。引脚对象有on和off方法,可以设置引脚的电平为高或低。

案例八:使用Timer模块实现PWM控制

from machine import Pin, Timer
import math

led = Pin('D13', Pin.OUT) # 创建输出引脚对象,连接到D13
tim = Timer(1) # 创建定时器对象,编号为1
duty = 0 # 初始化占空比为0

def pwm(t): # 定义PWM控制函数
    global duty # 声明全局变量duty
    duty = (duty + 1) % 101 # 更新占空比,范围为0-100
    if duty < 50: # 如果占空比小于50%
        led.on() # 设置引脚为高电平
    else: # 如果占空比大于等于50%
        led.off() # 设置引脚为低电平

tim.init(freq=100, mode=Timer.PERIODIC, callback=pwm) # 初始化定时器,频率为100Hz,模式为周期性,回调函数为pwm

这个案例使用了Timer模块,它可以创建和控制硬件定时器对象。Timer模块有一个参数,是定时器的编号,SAMD21有4个定时器,编号为0-3。定时器对象有init方法,它可以接受三个参数,freq是定时器的频率,mode是定时器的模式,可以是Timer.ONE_SHOT或Timer.PERIODIC,callback是定时器触发时执行的函数。这个案例实现了一个简单的PWM控制器,它可以改变LED的亮度。PWM是一种调制技术,它通过改变占空比来控制输出电平的平均值。占空比是指输出电平为高的时间占总周期的百分比。这个案例中,定时器每10毫秒触发一次回调函数pwm,回调函数中更新占空比,并根据占空比设置引脚的电平。

案例九:使用time模块和RTC模块实现时间显示

from machine import RTC, Pin, I2C
import time
import ssd1306

rtc = RTC() # 创建RTC对象
rtc.datetime((2023, 4, 6, 4, 11, 54, 3, 0)) # 设置RTC日期和时间

i2c = I2C(0) # 创建I2C对象,默认使用SCL和SDA引脚
oled = ssd1306.SSD1306_I2C(128, 64, i2c) # 创建OLED对象,分辨率为128x64

while True:
    dt = rtc.datetime() # 获取RTC日期和时间
    oled.fill(0) # 清空OLED屏幕
    oled.text('Date: {:04d}-{:02d}-{:02d}'.format(dt[0], dt[1], dt[2]), 0, 0) # 显示日期
    oled.text('Time: {:02d}:{:02d}:{:02d}'.format(dt[4], dt[5], dt[6]), 0, 10) # 显示时间
    oled.show() # 刷新OLED屏幕
    time.sleep(1) # 延迟1秒

这个案例使用了RTC模块,它可以创建和控制实时时钟对象。RTC模块没有参数。RTC对象有datetime方法,它可以接受一个包含年、月、日、星期、时、分、秒、微秒的元组,来设置RTC的日期和时间。也可以不带参数调用datetime方法,来获取RTC的日期和时间。
这个案例也使用了I2C模块和ssd1306模块,它们可以创建和控制I2C总线和OLED显示器对象。I2C模块有一个参数,是I2C的编号,SAMD21有两个I2C,编号为0和1。默认情况下,I2C 0使用SCL和SDA引脚,I2C 1使用SCL1和SDA1引脚。ssd1306模块有三个参数,分别是OLED的宽度、高度和I2C对象。OLED对象有fill方法,可以用0或1填充整个屏幕。也有text方法,可以在指定的位置显示一行文本。还有show方法,可以刷新屏幕显示内容。这个案例实现了一个简单的时间显示器,它可以在OLED上显示当前的日期和时间。每秒更新一次,并使用time模块的sleep函数实现延迟。

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41659040/article/details/133433118