Skip to content

AB 相旋转编码器 ​

外设 type 43 使用 GPIO ISR 采集 AB 相,当前没有 PCNT 或轮询回退。A 相电平变化中断结合 B 相判断方向,计数、边沿频率及转速都是软件估算,不是机械位置反馈保证。

配置与接线 ​

示例适用于核对后的经典 ESP32 板卡;按具体模块确认供电、AB 上拉和电平:

json
{
  "id": "encoder1",
  "name": "旋转编码器",
  "type": 43,
  "enabled": false,
  "pinCount": 2,
  "pins": [32, 33],
  "params": { "resolution": 20, "useInterrupt": true }
}

pins[0] 为 A,pins[1] 为 B,必须不同且通过资源检查。resolution 是按当前边沿计数方式标定的每转脉冲数,不能直接假设等于模块印刷标称。按压 SW 作为另一 GPIO 输入外设配置;不存在自动占用第三脚的按压输入。

先禁用保存,核对接线,再启用并检查正反转、计数符号及一次整圈计数。机械抖动、最高脉冲频率、长线及多实例必须实测。

读数与规则 ​

读数含义
count64 位累计计数,边界饱和
delta自上一次完整读取后的增量,读取时清零
direction最近方向
frequencyHz最近有效边沿间隔估算,超时降为 0
rpmfrequencyHz × 60 / resolution

动作 19 类别 pulse 读取 count/delta/direction;类别 frequency 读取频率或 rpm。单独读取引脚电平不等同于读取累计计数。

json
{
  "targetPeriphId": "encoder1",
  "actionType": 19,
  "actionValue": "{\"periphId\":\"encoder1\",\"sensorCategory\":\"pulse\",\"channelField\":\"count\",\"dataField\":\"encoderCount\",\"decimalPlaces\":0}",
  "useReceivedValue": false
}

在定时规则中使用上面动作才产生周期读数和可配置上报;事件来源为 ds:encoder1_count。平台触发器响应云端消息,不能把本地 count 上报当作自动返回的平台控制消息。多个读取者会共同消费 delta,依赖增量时应安排单一采集者,再分发缓存结果。

生命周期与验证边界 ​

最多四个固定 ISR 槽,清理失败的槽继续占用容量。配置、IRQ 附加或释放失败会保留故障/清理记录;故障期间不能把计数快照当作可信读数。旧 ISR 令牌不会沿用到新代次,重复健康初始化不清空计数。复位计数不代表物理回零。

真实生产入口的主机回归见 test/unit/test_encoder_checked_lifecycle.py,涵盖受检初始化、ISR、读取/复位与故障清理。用例存在不表示本次已运行通过;实际中断上限、机械抖动、方向、并发采集、MQTT 联动与长期运行仍须对应硬件验收。

蜂信物联 | fastbee.cn