Timer类 – 控制内部定时器

定时器可用于多种任务。目前,仅实现了最简单的情况:周期性调用函数。

每个定时器都包含一个以某一比率计数的计数器。其计数的频率为外设时钟频率(Hz为单位)除以定时器预分频器。 当计数器到达定时器周期时,会触发事件,且计数器重置为0。通过使用回调函数,定时器事件可调用一个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

注意: 定时器(1)用于摄像头。同样地,定时器(5)控制servo驱动,定时器(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中的值。定时器时钟源除以( prescaler + 1 )以得出定时器时钟。

  • 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 - 指定“dead”的数量或在免费通道(两通道须为非活动通道)间转换的无效时间。deadtime - 可为一个介于0-1008间的整数,并满足下列要求:0-128按照步骤1进行,128-256按照步骤2进行,256-512按照步骤8进行,512-1008按照步骤16进行。 deadtime - 测量以 div 时钟滴答划分的 source_freq 滴答。deadtime - 仅适用于定时器1和8。

您必须指定频率或周期和分频数。

Timer.deinit()

反初始化定时器。

禁用回调(以及关联的中断请求)。

禁用任何通道回调(以及关联的中断请求)。停用定时器,并禁用定时器外围设备。

Timer.callback(fun)

设置定时器触发时所调用的函数。 fun 是被传递的1参数,即定时器对象。若 funNone ,则禁用回调。

Timer.channel(channel, mode, ...)

若只有一个通道被传递,则返回一个先前初始化的通道对象(若无先前通道,则 None )。

另外,初始化并返回一个定时器通道对象。

每一通道都可配置来进行脉宽调制、输出比较和输入捕捉。所有通道公用同一基本定时器,即共用同一定时器时钟。

关键字参数:

  • 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 无(默认值)或一个引脚对象。若指定(非默认值),将导致为此定时器通道配置指定引脚的替代函数。若该引脚不支持任何该定时器通道的替代函数,则将引发错误。

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)。

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

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

获取或设置定时器。

Timer.freq([value])

获取或设置定时器频率(改变分频数与周期)。

Timer.period([value])

获取或设置定时器周期。

Timer.prescaler([value])

获取或设置定时器分频数。

Timer.source_freq()

获取时钟源的频率。

TimerChannel类 — 为定时器建立一个通道

定时器通道用来使用定时器生成/捕捉信号。

使用Timer.channel()方法来创建定时器对象。

方法

timerchannel.callback(fun)

设置定时器触发时调用的函数。fun 是被传递的1参数,即定时器对象。若 funNone ,则禁用回调。

timerchannel.capture([value])

获取或设置与通道相关的获取值。捕捉、比较和脉宽都是同一函数的别名。捕捉是通道在输入捕捉模式下的所使用的逻辑名。

timerchannel.compare([value])

获取或设置与通道相关的比较值。捕捉、比较和脉宽都是同一函数的别名。比较是通道在输出比较模式下的所使用的逻辑名。

timerchannel.pulse_width([value])

获取或设置与通道相关的脉宽值。捕捉、比较和脉宽都是同一函数的别名。脉宽是通道在PWM模式下的所使用的逻辑名。

在边沿对齐模式下, period + 1 的脉宽与100%的任务周期相对应。在中心对齐模式下, period 的脉宽与100%的任务周期相对应。

timerchannel.pulse_width_percent([value])

获取或设置与通道相关的脉宽百分比。该数值(介于1-100间)设置脉冲活动的定时器周期的百分比。该值可为整数或更为准确的浮点值。例如:取值25则设置任务周期的25%。