增量编码器RPM计算中每转脉冲数(PPR)的设置问题
问题分析与解决方案
核心问题
你的读数(7800RPM)远高于实际标称的500RPM,主要源于两个问题:
- 正交编码器的4倍频计数未被正确处理:你用的是正交增量编码器,代码里对A、B相的
CHANGE边沿都触发中断,每转实际会产生4×PPR次计数(PPR是编码器标称每转脉冲数),但原代码的转速计算公式没考虑这个4倍频系数。 - 可能存在硬件干扰导致误触发:如果编码器输出没做滤波,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
相关产品推荐
相关产品推荐

