MicroPython内核开发笔记书内软件用例 :Timer相关实验

简 介: 本文给出了 MicroPython内核开发笔记:书内嵌入实验任务 中的 Timer 软件用例部分内容。

关键词 TimerMM32F3277MicroPython

书稿内容
目 录
Contents
基础实验
初始化Timer
ONE_SHOT功能
周期信号采集
总 结

§01 稿内容


在嵌入式应用开发需要考虑到软件执行的时间精确性,比如按照精确的周期执行某种操作,或者在确定的时间点完成某项任务。虽然可以借助于 time 的延迟功能完成相应的工作,但软件在延时过程中处在休眠状态,无法执行其他任务,所以软件运行效率大大降低了。 使用 定时器 Timer 的时间中断功能,既能保证时间的精确性,同时也不会降低软件的执行效率。

在 MM32F3277 的 MicroPython 中存在两个 Timer 可以被使用。下面通过代码展示 Timer 的基本应用方法。

一、基础实验

1、初始化Timer

下面代码给出了 Timer 的初始化过程。 软件中定义了一个函数 to_callback(self) ,它是 Timer 定时中断服务函数,示例程序的中断服务函数功能比较简单,就是改变 LED 管脚的状态。

初始化 Timer 需要四个参数:

  • Timer 通道:可以去0,1;
  • 工作模式:PERIODIC 或者 ONE_SHOT;
  • 中断程序:预先定义好的中断程序;
  • 定时周期:定时器周期时间长度,单位 ms;
from machine                import Pin,Timer
import time

led = Pin('PA1', Pin.OUT_PUSHPULL)

def t0_callback(self):
    led(1-led())

t0 = Timer(1, mode=Timer.PERIODIC, callback=t0_callback, period=200)

print(t0)
dir(t0)

while True:
    pass

上述程序执行后,在 NANO_F3270 核心板上的 LED 以周期为 200 ms 改变其自身状态。

▲ 图1.1.1  实验核心板上红色LED改变自身状态

▲ 图1.1.1 实验核心板上红色LED改变自身状态

通过 print, dir 两个指令显示了定时器属性以及可以使用的函数。下面是程序输出的信息:

Timer(channel=1, mode=PERIODIC, period=200ms)
['__del__', 'ONE_SHOT', 'PERIODIC', 'deinit', 'init']

2、ONE_SHOT功能

当 Timer 的模式设置为 ONE_SHOT后, Timer 只完成一次定时中断,之后并停止运行。如果重新启动定时器,可以使用 init 函数来完成。

下面代码是在前面实验代码的基础上,将 Timer 的工作模式修改成 ONE_SHOT。 在主循环中, 设置 LED 状态为点亮,然后启动定时器。 定时器在 100 ms之后进入中断程序,将 LED 关闭。因此程序执行效果是 LED 以500ms 为周期进行闪烁, 点亮时间为 100ms。

from machine                import Pin,Timer
import time

led = Pin('PA1', Pin.OUT_PUSHPULL)
def t0_callback(self):
    led(1-led())
t0 = Timer(1, mode=Timer.ONE_SHOT, callback=t0_callback, period=100)
while True:
    time.sleep_ms(500)
    led.low()
    t0.init(mode=Timer.ONE_SHOT, callback=t0_callback, period=100)
    pass

二、周期信号采集

如果需要周期完成某项操作,相比于利用 time 软件延迟,利用定时器可以保证周期更加精确。 下面利用定时器中断完成模拟信号的采集与输出。 使用 ADC 0 通道(对应PA0)采集信号,使用DAC 0 通道(对应 PA4)输出采集到的模拟信号。采集的周期为 1ms 。

from machine                import Pin,Timer,DAC,ADC
import time

led = Pin('PB2', Pin.OUT_PUSHPULL)
adc = ADC(0, init=True)
dac = DAC(0)

dac.write_u16(0x8000)

def t0_callback(self):
    dac.write_u16(adc.read_u16())
    led(1-led())

t0 = Timer(1, mode=Timer.PERIODIC, callback=t0_callback, period=1)

while True:
    pass

在 PA0 输入幅值为 1V,零点为1.5V, 100Hz 的正弦波。 程序执行后,在PA4(DAC0)管脚可以测量到 DAC的输出信号。 相比 第十章 通过 软件延时进行信号采集的效果,利用定时器中断采集信号可以精确实现 1 ms 进行信号采集一次。

▲ 图1.2.1 Timer中完成信号的采集与输出

▲ 图1.2.1 Timer中完成信号的采集与输出

  结 ※


本文给出了 MicroPython内核开发笔记:书内嵌入实验任务 中的 Timer 软件用例部分内容。


■ 相关文献链接:

● 相关图表链接:

猜你喜欢

转载自blog.csdn.net/zhuoqingjoking97298/article/details/125565265