class Timer – 控制内部定时器¶
定时器可用于各种任务。目前,仅实现了最简单的情况:定期调用函数。
每个定时器由一个在特定速率下计数的计数器组成。计数速率是外设时钟频率(以 Hz 为单位)除以定时器分频器。当计数器达到定时器周期时,它会触发一个事件,并且计数器将重置为零。通过使用回调方法,定时器事件可以调用一个 Python 函数。
在固定频率下切换 LED 的示例用法:
tim = pyb.Timer(4) # create a timer object using timer 4
tim.init(freq=2) # trigger at 2Hz
tim.callback(lambda t:pyb.LED(1).toggle())
使用命名函数进行回调的示例:
def tick(timer): # we will receive the timer object when being called
print(timer.counter()) # show current timer's counter value
tim = pyb.Timer(4, freq=1) # create a timer object using timer 4 - trigger at 1Hz
tim.callback(tick) # set the callback to our tick function
更多示例:
tim = pyb.Timer(4, freq=100) # freq in Hz
tim = pyb.Timer(4, prescaler=0, period=99)
tim.counter() # get counter (can also set)
tim.prescaler(2) # set prescaler (can also get)
tim.period(199) # set period (can also get)
tim.callback(lambda t: ...) # set callback for update interrupt (t=tim instance)
tim.callback(None) # clear callback
注意: Timer(1) 被使用于摄像头。同样,Timer(5) 控制伺服驱动器,Timer(6) 用于定时 ADC/DAC 读写。建议在您的程序中使用其他定时器。
注意: 在回调期间(中断期间)无法分配内存,因此在回调中引发的异常不会提供太多信息。请参阅 micropython.alloc_emergency_exception_buf()
以解决此限制。
构造¶
- class pyb.Timer(id, ...)¶
构造一个给定 id 的新定时器对象。如果给出了额外的参数,则定时器将通过
init(...)
进行初始化。id
可以是 1 到 14。
方法¶
- Timer.init(*, freq, prescaler, period, mode=Timer.UP, div=1, callback=None, deadtime=0, brk=Timer.BRK_OFF)¶
初始化定时器。初始化必须是通过频率(以 Hz 为单位)或按分频器和周期进行的:
tim.init(freq=100) # set the timer to trigger at 100Hz tim.init(prescaler=83, period=999) # set the prescaler and period directly
关键字参数:
freq
— 指定定时器的周期性频率。您也可以将其视为定时器完成一个完整周期的频率。prescaler
[0-0xffff] - 指定要加载到定时器预分频器寄存器(PSC)的值。定时器时钟源被分频为(prescaler + 1
)以获得定时器时钟。定时器 2-7 和 12-14 的时钟源为 84 MHz(pyb.freq()[2] * 2),而定时器 1 和 8-11 的时钟源为 168 MHz(pyb.freq()[3] * 2)。period
[0-0xffff] 适用于定时器 1、3、4 和 6-15。[0-0x3fffffff] 适用于定时器 2 和 5。指定要加载到定时器自动重载寄存器(ARR)的值。这确定了定时器的周期(即计数器循环的时机)。定时器计数器将在period + 1
定时器时钟周期后溢出。mode
可以是以下之一:Timer.UP
- 配置定时器从 0 到 ARR 计数(默认)Timer.DOWN
- 配置定时器从 ARR 计数到 0。Timer.CENTER
- 配置定时器从 0 到 ARR,然后返回到 0。
div
可以是 1、2 或 4 中的一个。将定时器时钟分割以确定数字滤波器使用的采样时钟。callback
- 与 Timer.callback() 一样deadtime
- 指定在补偿通道(两个通道都将处于非活动状态)之间的“死”或非活动时间之间的量。deadtime
可以是介于 0 和 1008 之间的整数,其约束如下:1 步 0-128、2 步 128-256、8 步 256-512 和 16 步 512-1008。deadtime
是由source_freq
除以div
时钟周期刻度测量的。deadtime
仅适用于定时器 1 和 8。brk
- 指定在断开输入(BRK_IN
输入被断开时)时是否使用断开模式来关闭 PWM 的输出。此参数的值确定是否启用断开模式以及极性如何,可以是以下之一:Timer.BRK_OFF
、Timer.BRK_LOW
或Timer.BRK_HIGH
。要选择BRK_IN
引脚,请使用mode=Pin.ALT, alt=Pin.AFn_TIMx
构造一个 Pin 对象。引脚的 GPIO 输入功能在 alt 模式下可用 -pull=
、value()
和irq()
。
您必须指定 freq 或 period 和 prescaler 中的两者。
- Timer.deinit()¶
分初始化定时器。
禁用回调(及其关联的 irq)。
禁用任何通道回调(及其关联的 irq)。停止定时器,并禁用定时器外设。
- Timer.callback(fun)¶
设置定时器触发时要调用的函数。
fun
传递 1 个参数,即定时器对象。如果fun
是None
,则将禁用回调。
- Timer.channel(channel, mode, ...)¶
如果只传递了通道号,则返回先前初始化的通道对象(如果没有先前的通道,则返回
None
)。否则,将初始化并返回一个 TimerChannel 对象。
每个通道可以配置为执行 pwm、输出比较或输入捕获。所有通道共享相同的底层定时器,这意味着它们共享相同的定时器时钟。
关键字参数:
mode
可以是以下之一:Timer.PWM
— 将定时器配置为 PWM 模式(高电平有效)。Timer.PWM_INVERTED
— 将定时器配置为 PWM 模式(低电平有效)。Timer.OC_TIMING
— 表示不驱动任何引脚。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 更改时才会变化。Timer.ENC_AB
— 将定时器配置为编码器模式。计数器在 CH1 或 CH2 更改时变化。
callback
- 与 TimerChannel.callback() 一样pin
默认为 None,或者是一个 Pin 对象。如果指定了 pin(并且不是 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 模式的注意事项:
需要 2 个引脚,因此一个或两个引脚将需要使用 Pin API 配置使用适当的定时器 AF。
使用 timer.counter() 方法读取编码器值。
仅在 CH1 和 CH2 上有效(不在 CH1N 或 CH2N 上有效)
在设置编码器模式时,通道号将被忽略。
PWM 示例:
timer = pyb.Timer(2, freq=1000) ch2 = timer.channel(2, pyb.Timer.PWM, pin=pyb.Pin.board.X2, pulse_width=8000) ch3 = timer.channel(3, pyb.Timer.PWM, pin=pyb.Pin.board.X3, pulse_width=16000)
具有互补输出、死区时间、断开输入和断开回调的 PWM 电机示例:
from pyb import Timer from machine import Pin # machine.Pin supports alt mode and irq on the same pin. pin_t8_1 = Pin(Pin.board.Y1, mode=Pin.ALT, af=Pin.AF3_TIM8) # Pin PC6, TIM8_CH1 pin_t8_1n = Pin(Pin.board.X8, mode=Pin.ALT, af=Pin.AF3_TIM8) # Pin PA7, TIM8_CH1N pin_bkin = Pin(Pin.board.X7, mode=Pin.ALT, af=Pin.AF3_TIM8) # Pin PA6, TIM8_BKIN pin_bkin.irq(handler=break_callabck, trigger=Pin.IRQ_FALLING) timer = pyb.Timer(8, freq=1000, deadtime=1008, brk=Timer.BRK_LOW) ch1 = timer.channel(1, pyb.Timer.PWM, pulse_width_percent=30)
- Timer.counter([value])¶
获取或设置定时器计数器。
- Timer.freq([value])¶
获取或设置定时器的频率(如果设置,则更改分频器和周期)。
- Timer.period([value])¶
获取或设置定时器的周期。
- Timer.prescaler([value])¶
获取或设置定时器的分频器。
- Timer.source_freq()¶
获取定时器源的频率。
class TimerChannel — 为定时器设置通道¶
定时器通道用于使用定时器生成/捕获信号。
使用 Timer.channel() 方法创建 TimerChannel 对象。
方法¶
- timerchannel.callback(fun)¶
设置当定时器通道触发时要调用的函数。
fun
传递 1 个参数,即定时器对象。如果fun
是None
,则将禁用回调。
- timerchannel.capture([value])¶
获取或设置与通道关联的捕获值。capture、compare 和 pulse_width 都是与同一函数的别名。capture是通道处于输入捕获模式时使用的逻辑名称。
- timerchannel.compare([value])¶
获取或设置与通道关联的比较值。capture、compare 和 pulse_width 都是与同一函数的别名。Compare是通道处于输出比较模式时要使用的逻辑名称。
- timerchannel.pulse_width([value])¶
获取或设置与通道关联的脉冲宽度值。capture、compare 和 pulse_width 都是与同一函数的别名。pulse_width是通道处于 PWM 模式时要使用的逻辑名称。
在边缘对齐模式下,
period + 1
的脉冲宽度对应于 100% 的占空比。在中心对齐模式下,脉冲宽度为period
对应于 100% 的占空比
- timerchannel.pulse_width_percent([value])¶
获取或设置与通道关联的脉冲宽度百分比。该值是介于 0 和 100 之间的数字,并设置脉冲处于活动状态的定时器周期的百分比。该值可以是整数或浮点数,以获得更高的精度。例如,值为 25 表示 25% 的占空比。