类 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(2) 和 Timer(3) 用于 PWM 分别设置 LED(3) 和 LED(4) 的亮度。但这些定时器仅在相关 LED 的强度设置为 1 到 254 之间的值时才配置为 PWM。如果不使用 LED 的强度特性,则这些定时器可免费用于一般用途。同样,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)

初始化定时器。初始化必须通过频率(以 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) 中的值。定时器时钟源除以 ( ) 以到达定时器时钟。定时器 2-7 和 12-14 的时钟源为 84 MHz(pyb.freq()[2] * 2),定时器 1 和 8-11 的时钟源为 168 MHz(pyb.freq()[ 3] * 2)。prescaler + 1

  • period[0-0xffff] 用于计时器 1、3、4 和 6-15。[0-0x3fffffff] 用于计时器 2 和 5。指定要加载到计时器的自动重载寄存器 (ARR) 中的值。这决定了定时器的周期(即计数器何时循环)。定时器计数器将在 定时器时钟周期后翻转。 period + 1 timer clock cycles.

  • 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 之间的整数,有以下限制:0-128,步长 1。128-256 步长 2,256-512 步长 8,512-1008 步长 16deadtimesource_freq除以div 时钟滴答。 deadtime仅在计时器 1 和 8 上可用。

您必须指定 freq 或同时指定周期和预分频器。

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 无(默认)或 Pin 对象。如果指定(而不是无),这将导致为该定时器通道配置指定引脚的备用功能。如果该引脚不支持此定时器通道的任何备用功能,则会引发错误。

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 个引脚,因此需要将一个或两个引脚配置为使用引脚 API 使用适当的定时器 AF。

  • 使用 timer.counter() 方法读取编码器值。

  • 仅适用于 CH1 和 CH2(而不适用于 CH1N 或 CH2N)

  • 设置编码器模式时忽略通道号。

脉宽调制示例:

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)
Timer.counter([value])

获取或设置定时器计数器。

Timer.freq([value])

获取或设置定时器的频率(如果设置,则更改预分频器和周期)。

Timer.period([value])

获取或设置定时器的周期。

Timer.prescaler([value])

获取或设置定时器的预分频器。

Timer.source_freq()

获取定时器源的频率。

类 TimerChannel — 为计时器设置通道

定时器通道用于使用定时器生成/捕获信号。

TimerChannel 对象是使用 Timer.channel() 方法创建的。

方法

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 模式时使用的逻辑名称。

在边缘对齐模式下,脉冲宽度为 100% 的占空比在中心对齐模式下,脉冲宽度为 100% 的占空比 period + 1 period corresponds to a duty cycle of 100%

timerchannel.pulse_width_percent([value])

获取或设置与通道关联的脉冲宽度百分比。该值是一个介于 0 和 100 之间的数字,用于设置脉冲处于活动状态的定时器周期的百分比。为了更准确,该值可以是整数或浮点数。例如,值 25 表示占空比为 25%。