概述
简 介: 本文给出了 MicroPython内核开发笔记:书内嵌入实验任务 中的 Timer 软件用例部分内容。
关键词
: Timer,MM32F3277,MicroPython
- 本书稿内容隶属于 MicroPython内核开发笔记:书内嵌入实验任务 中的内容。
§01 书稿内容
在嵌入式应用开发需要考虑到软件执行的时间精确性,比如按照精确的周期执行某种操作,或者在确定的时间点完成某项任务。虽然可以借助于 time 的延迟功能完成相应的工作,但软件在延时过程中处在休眠状态,无法执行其他任务,所以软件运行效率大大降低了。 使用 定时器 Timer 的时间中断功能,既能保证时间的精确性,同时也不会降低软件的执行效率。
在 MM32F3277 的 MicroPython 中存在两个 Timer 可以被使用。下面程序展示了 定时器的基本使用方法,使用 print, dir 分别显示出两个定时器的基本属性和可以调用的函数接口。
from machine import Timer
def t0_callback(self):
pass
def t1_callback(self):
pass
t0 = Timer(0, mode=Timer.PERIODIC, callback=t0_callback, period=100)
t1 = Timer(1, mode=Timer.PERIODIC, callback=t1_callback, period=100)
print(t0)
print(t1)
dir(t0)
while True:
pass
程序执行输出结果为:
Timer(channel=0, mode=PERIODIC, period=100ms)
Timer(channel=1, mode=PERIODIC, period=100ms)
['__del__', 'ONE_SHOT', 'PERIODIC', 'deinit', 'init']
一、基础实验
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改变自身状态
通过 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中完成信号的采集与输出
※ 总 结 ※
本文给出了 MicroPython内核开发笔记:书内嵌入实验任务 中的 Timer 软件用例部分内容。
■ 相关文献链接:
- MicroPython内核开发笔记:书内嵌入实验任务
● 相关图表链接:
- 图1.1.1 实验核心板上红色LED改变自身状态
- 图1.2.1 Timer中完成信号的采集与输出
最后
以上就是冷酷烤鸡为你收集整理的MicroPython内核开发笔记书内软件用例 :Timer相关实验 §01 书稿内容 ※ 总 结 ※ 的全部内容,希望文章能够帮你解决MicroPython内核开发笔记书内软件用例 :Timer相关实验 §01 书稿内容 ※ 总 结 ※ 所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复