简 介: 本文给出了 MicroPython内核开发笔记:书内嵌入实验任务 中的 Timer 软件用例部分内容。
关键词
: Timer,MM32F3277,MicroPython
- 本书稿内容隶属于 MicroPython内核开发笔记:书内嵌入实验任务 中的内容。
§01 书稿内容
在嵌入式应用开发需要考虑到软件执行的时间精确性,比如按照精确的周期执行某种操作,或者在确定的时间点完成某项任务。虽然可以借助于 time 的延迟功能完成相应的工作,但软件在延时过程中处在休眠状态,无法执行其他任务,所以软件运行效率大大降低了。 使用 定时器 Timer 的时间中断功能,既能保证时间的精确性,同时也不会降低软件的执行效率。
在 MM32F3277 的 MicroPython 中存在两个 Timer 可以被使用。下面程序展示了 定时器的基本使用方法,使用 print, dir 分别显示出两个定时器的基本属性和可以调用的函数接口。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18from 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
程序执行输出结果为:
1
2
3
4Timer(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;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16from 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 两个指令显示了定时器属性以及可以使用的函数。下面是程序输出的信息:
1
2
3Timer(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。
1
2
3
4
5
6
7
8
9
10
11
12
13from 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 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18from 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内核开发笔记书内软件用例内容请搜索靠谱客的其他文章。
发表评论 取消回复