在micropython中使用定时器也是非常轻松简单的。要使用定时器,先需要导入Timer库。
from pyb import Timer
先看看基本用法,后面在详细说明
- 定义Timer
tm=Timer(n)
n=1-14,但是3用于内部程序,5/6用于伺服系统和ADC。
更多定义方式:
tm=Timer(1, freq=100)
tm=Timer(4, freq=200, callback=f)
- 定义回调函数(中断)
tm.callback(f)
例程:
在定时器1中翻转LED1,频率是1Hz
- from pyb import Timer
- tim = Timer(1, freq=1)
- tim.callback(lambda t: pyb.LED(1).toggle())
复制代码
一个呼吸灯的例子:
- from pyb import Timer
- i = 0
- def f(t):
- global i
- i = (i+1)%255
- pyb.LED(4).intensity(i)
- tm=Timer(4, freq=200, callback=f)
复制代码
Timer库说明
- class pyb.Timer(id, ...)
创建定时器对象,id范围是[1..14] - timer.init(*, freq, prescaler, period)
定时器初始化。
- freq,频率
- prescaler,预分频,[0-0xffff],定时器频率是系统时钟除以(prescaler + 1)。定时器2-7和12-14最高频率是84MHz,定时器1、8-11是168MHz
- peroid,周期值(ARR)。定时器1/3/4/6-15是 [0-0xffff],定时器2和5是[0-0x3fffffff]。
- mode,计数模式
- Timer.UP - 从 0 到 ARR (默认)
- Timer.DOWN - 从 ARR 到 0.
- Timer.CENTER - 从 0 到 ARR,然后到 0.
- div,用于数值滤波器采样时钟,范围是1/2/4。
- callback,定义回调函数,和Timer.callback()功能相同
- deadtime,死区时间,通道切换时的停止时间(两个通道都不会工作)。范围是[0..1008],它有如下限制:
- 0-128 in steps of 1.
- 128-256 in steps of 2,
- 256-512 in steps of 8,
- 512-1008 in steps of 16
deadtime的测量是用source_freq 除以 div,它只对定时器1-8有效。
- timer.deinit()
禁止定时器,禁用回调函数,禁用任何定时器通道
- timer.callback(fun)
设置定时器回调函数
- timer.channel(channel, mode, ...)
设置定时器通道
- channel,定时器通道号
- mode,模式
- Timer.PWM,PWM模式(高电平方式)
- Timer.PWM_INVERTED,PWM模式(反相方式)
- Timer.OC_TIMING,不驱动GPIO
- Timer.OC_ACTIVE,比较匹配,高电平输出
- Timer.OC_INACTIVE,比较匹配,低电平输出
- Timer.OC_TOGGLE,比较匹配,翻转输出
- Timer.OC_FORCED_ACTIVE,强制高,忽略比较匹配
- Timer.OC_FORCED_INACTIVE,强制低,忽略比较匹配
- Timer.IC,输入扑捉模式
- Timer.ENC_A,编码模式,仅在CH1改变时修改计数器
- Timer.ENC_B,编码模式,仅在CH2改变时修改计数器
- callback,每个通道的回调函数
- pin,驱动GPIO,可以是None
在 Timer.PWM 模式下的参数
- pulse_width,脉冲宽度
- pulse_width_percent,百分比计算的占空比
在 Timer.OC 模式下的参数
- compare,比较匹配寄存器初始值
- polarity,极性
- Timer.HIGH,输出高
- Timer.LOW,输出低
在 Timer.IC 模式下的参数(捕捉模式只有在主通道有效)
- polarity
- Timer.RISING,上升沿捕捉
- Timer.FALLING,下降沿捕捉
- Timer.BOTH,上升下降沿同时捕捉
Timer.ENC 模式:
- 需要配置两个Pin
- 使用 timer.counter() 方法读取编码值
- 只在CH1或CH2上工作(CH1N和CH2N不工作)
- 编码模式时忽略通道号
- timer.counter([value])
设置或获取定时器计数值
- timer.freq([value])
设置或获取定时器频率
- timer.period([value])
设置或获取定时器周期
- timer.prescaler([value])
设置或获取定时器预分频
- timer.source_freq()
获取定时器源频率(无预分频)
【MicroPython】教程