You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

增量编码器RPM计算中每转脉冲数(PPR)的设置问题

问题分析与解决方案

核心问题

你的读数(7800RPM)远高于实际标称的500RPM,主要源于两个问题:

  1. 正交编码器的4倍频计数未被正确处理:你用的是正交增量编码器,代码里对A、B相的CHANGE边沿都触发中断,每转实际会产生4×PPR次计数(PPR是编码器标称每转脉冲数),但原代码的转速计算公式没考虑这个4倍频系数。
  2. 可能存在硬件干扰导致误触发:如果编码器输出没做滤波,Arduino的INPUT_PULLUP模式容易拾取噪声,额外触发中断,进一步放大转速读数。

正确的转速计算逻辑

针对正交编码器(CHANGE边沿触发),正确的RPM计算公式需要加入4倍频系数:

float speed = (encoder_pulse_counter * 60.0) / (4 * 400); // 4为倍频系数,400是编码器标称PPR

让读数匹配实际转速的两种处理方式

方式1:修正代码公式(推荐)

保持编码器PPR为400,修改转速计算逻辑,加入4倍频系数:

void loop()
{
    float speed = (encoder_pulse_counter * 60.0) / (4 * 400); 
    Serial.print("RPM: ");
    Serial.println(direction * speed);
    encoder_pulse_counter = 0;
    delay(1000);
}

方式2:临时调整PPR假值(不推荐)

如果暂时不想修改公式,仅为了让读数显示500RPM,可通过比例计算得到假的PPR值:
正确PPR假值 = 当前设置的400 × (当前读数7800 / 实际转速500) = 400 × 15.6 = 6240
把代码中的400替换为6240即可,但这只是掩盖问题,无法解决计数逻辑错误或硬件干扰。

额外优化建议

  • 硬件滤波:在编码器A、B相引脚与GND之间接100nF电容,减少噪声导致的误触发。
  • 改用RISING边沿触发:如果不需要方向判断或仅需1倍频计数,可将中断触发方式改为RISING,此时公式中的倍频系数改为1,计数更稳定:
    attachInterrupt(0, encoderPinChangeA, RISING);
    attachInterrupt(1, encoderPinChangeB, RISING);
    

内容的提问来源于stack exchange,提问作者le_stan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 09:33:30