class Counter -- 脉冲计数器

Counter 类封装了配置为单输入脉冲计数器的 i.MX RT QENC(正交编码器 / 计数器)硬件模块。源引脚上的每个上升沿都会使硬件位置计数器递增(或递减);可以为 ROLL_OVER / ROLL_UNDER / RESET / INDEX / MATCH 事件附加软件回调。

仅在 OpenMV Cam RT1062(mimxrt 移植)上可用。在基于 STM32 的 OpenMV cam 上,请改用配置为输入捕获模式的 pyb.Timer。在 OpenMV Cam AE3(alif 移植)上不提供。

用法示例:

from machine import Pin, Counter

counter = Counter(0, Pin("P0", Pin.IN))
counter.value(0)
# ... wait some time ...
print("pulses:", counter.value())

构造函数

class machine.Counter(id: int, src: Pin | None = None, *, direction: int | Pin = UP, filter_ns: int = 0, max: int | None = None, min: int = 0, reset: Pin | None = None, match: int | None = None, match_pin: Pin | None = None)

构造(或获取)由 id 标识的 QENC 计数器模块的单例。RT1062 具有多个 QENC 模块(由 id 选择其一);init() 也接受相同的参数,用于重新配置现有实例。

src —— 用于对其上升沿进行计数的输入引脚。

direction(仅限关键字)—— 取 UP / DOWN 以设置固定方向,或取一个 Pin,其逻辑电平在运行时选择方向(低电平 = 向上计数,高电平 = 向下计数)。

filter_ns(仅限关键字)—— 一个脉冲被计数所需的最小输入稳定时间(以纳秒为单位)。驱动会使用小于或等于该值的最长硬件滤波器。0(默认值)表示禁用滤波。

max / min(仅限关键字)—— 位置计数器的取模范围。当计数器越过 max 时,会回绕到 min,并且循环计数器递增(向下计数时则递减)。将 maxmin 都传入 0 可禁用该范围。

reset(仅限关键字)—— 一个 Pin,其上升沿会将位置计数器重新加载为起始值(而不改变循环计数器)。

match(仅限关键字)—— 触发 IRQ_MATCH 中断的计数器值。传入 None 可禁用。

match_pin(仅限关键字)—— 一个 Pin,当位置计数器等于 match 时被驱动为高电平,否则为低电平。

方法

init(src: Pin | None = None, *, direction: int | Pin = UP, filter_ns: int = 0, max: int | None = None, min: int = 0, reset: Pin | None = None, match: int | None = None, match_pin: Pin | None = None) None

使用给定参数重新初始化计数器,并重置其位置计数器和循环计数器。接受与构造函数相同的关键字参数。

deinit() None

停止计数器,禁用所有挂起的中断,并释放 QENC 硬件资源。软复位会自动反初始化所有 Counter 实例。

value() int
value(value: int, /) int

获取或设置带符号的位置计数器。

不带参数时,返回当前计数值。

带单个 value 参数时,原子地将位置计数器设置为 value 并返回之前的计数值。常见用法 counter.value(0) 会在测量窗口开始时重置计数器。

cycles() int
cycles(value: int, /) int

获取或设置循环计数器,这是一个带符号的 16 位整数,用于跟踪位置计数器越过 max / min 的次数。

不带参数时,返回当前循环计数值。

带单个 value 参数时,将循环计数器设置为 value(而不改动位置计数器)并返回之前的计数值。

irq(handler: Callable[[Counter], None] | None = None, trigger: int = 0, hard: bool = False) None

注册一个回调,当某个受支持的 QENC 事件触发时被调用。处理程序接收 Counter 对象作为其唯一参数;可在处理程序内部通过 irq.flags() 识别具体事件。

trigger 是由一个或多个 IRQ_* 常量组成的位掩码:

  • IRQ_RESET —— reset 引脚被置位。

  • IRQ_INDEX —— index 线上发生跳变。

  • IRQ_MATCH —— 位置计数器达到 match。匹配在触发后会自动禁用,必须通过重新安装 IRQ 来重新使能。

  • IRQ_ROLL_OVER —— 位置计数器从 max 回绕到 min

  • IRQ_ROLL_UNDER —— 位置计数器从 min 回绕到 max

hard=True 会注册一个硬中断处理程序(延迟更低,但处理程序不得分配内存)。默认是调度回调。传入 handler=None 可禁用中断。

常量

UP: int

传给 direction 以将上升沿计为正向。

DOWN: int

传给 direction 以将上升沿计为负向。

IRQ_RESET: int

reset 引脚事件的 irq() 触发标志。

IRQ_INDEX: int

索引输入事件的 irq() 触发标志。

IRQ_MATCH: int

位置匹配事件的 irq() 触发标志。

IRQ_ROLL_OVER: int

计数器上溢(max -> min)的 irq() 触发标志。

IRQ_ROLL_UNDER: int

计数器下溢(min -> max)的 irq() 触发标志。