
正交编码器提供了一种让硬件读取轴的运动(和方向)的方法,并且它们可以是简单、有效且廉价的设备。但 [Paulo Marques] 观察到,当用它们读取电机速度时,在高速下效果最好的方法在低速下不起作用,反之亦然。他的解决方案? PicoEncoder是一个库,提供了一种轻量级且强大的方法,可以使用 RP2040 上的可编程 I/O (PIO) 硬件来获得更好的结果,甚至(或特别是)使用廉价的编码器,并且高效地实现。
子步方法(蓝色)的结果类似于低通滤波器,但交付时没有延迟或 CPU 负担。
正交编码器的输出通常是两个彼此异相的方波。该数据表明轴是否正在移动以及朝什么方向移动。当用于测量电机轴等物体时,还可以估计转速。计算一段时间内编码器发出的步数,并以此为基础计算每分钟转数等数据。
[Paulo] 指出,这种基本方法的一个问题是质量在很大程度上取决于需要处理的数据量。但电机转得越慢,获得的数据就越少。为了解决这个问题,可以使用针对低速优化的不同计算,但实际上没有一种解决方案可以很好地处理高速和低速。
另一个问题是阶跃转换“边缘”处的读数可能会有很多噪音。这可以被忽略并假设为平均值,但它是不准确的根源,在较慢的速度下会变得更糟。最后,理想编码器的各个相位的占空比恰好为 50%,并且彼此之间的相位差正好为 90 度。对于更便宜的编码器来说,实际上几乎从未出现过这种情况。这又是不准确的根源。
[Paulo] 的解决方案是将他自己的方法与 RP2040 的 PIO 结合起来,使用混合方法来实现“子步”正交编码器。与简单的步数计数相比, PicoEncoder更仔细地跟踪转换以避免噪声问题,甚至考虑特定编码器中存在的相位大小差异。结果是更准确地计算电机速度和位置,没有任何延迟。大部分工作由 RP2040 的 PIO 完成,它执行计算步数和跟踪转换的低级工作,而不涉及任何 CPU 时间。下次您需要读取电机的正交编码器时尝试一下!
PIO 是 RP2040 中最有趣的功能之一,很高兴看到它以如此巧妙的方式使用。正如我们自己的 Elliot Williams 在评估 RP2040时所说的那样,PIO 承诺永远不必再次对解决方案进行修改。
原文: https://hackaday.com/2025/04/29/read-motor-speed-better-by-making-the-rp2040-pio-do-it/