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_OFFTimer.BRK_LOWTimer.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 个参数,即定时器对象。如果 funNone,则将禁用回调。

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 个参数,即定时器对象。如果 funNone,则将禁用回调。

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% 的占空比。

常量

Timer.UP
Timer.DOWN
Timer.CENTER

将定时器配置为向上、向下计数,或从 0 到 ARR 再返回到 0。

Timer.BRK_OFF
Timer.BRK_LOW
Timer.BRK_HIGH

当传递给 brk 关键字参数时,配置断开模式。