增量编码器 - 轮询还是中断?

问题描述

我接手了一个项目,包括 PIC18f25k80 微控制器和增量编码器。基本上我只需要使用编码器跟踪电机的位置,并将设备驱动到特定位置。我知道有更多方法可以读取编码器并更新位置。电机根本转不快,这里不涉及高速。

如果我要从头开始开发整个东西,我可能会将编码器的一个通道挂到一个中断引脚上,比如端口 B,然后在 ISR 中检查另一个引脚的状态。对我来说,这似乎是最干净的解决方案,这种方法可能会捕获所有位置变化,如果我错了,请纠正我。

另一种方法是轮询主循环中的 2 个通道。主循环的内容不多,基本上只是根据位置调整电机速度和方向,所以在低速下,我想我不会错过位置变化,但让我烦恼的是,仍然有可能错过编码器通道的变化。

第三个选项可能是初始化定时器中断,在该中断例程中,我可以检查引脚状态。这个中断的发生速度是最高速度发生状态变化的两倍,所以我想我也不会错过这个方法的任何变化。

话虽如此,我的问题如下:我应该选择哪个选项?

正如我所说,我会选择第一个,编码器通道连接到 RB4 和 RB5,所以我可以只启用端口 B 上的中断。但据我所知,这是我没有的地方当然,我只能为 PIC18f25k80 上的整个端口 B 启用中断,而不能为单个引脚启用中断。这意味着端口 B 上的所有引脚都会创建一个中断,而不仅仅是我想要的那个。不仅是编码器的另一个通道,而且端口 B 上的所有引脚都连接到某个东西上,我无法更改布局,只能更改软件。我是不是没看错,在这种情况下,这种方法是无效的,因为所有引脚都会导致端口 B 上的中断,而且开销太大?

我的问题结束:如果我正确地看到了上述问题,您会选择哪种方法,轮询固定定时器中断?我们谈论的是每秒旋转 5 圈。

感谢提前回答!

这是有问题的编码器:https://www.power-tronic.com/wp-content/uploads/2019/11/Type-Magnetic-Incremental-2019-01-08.pdf

解决方法

作为我从这里和电子堆栈交换中学到的东西的总结:

首先,也可以为单个引脚启用和禁用中断。 B口是IOCB寄存器需要配置的对应寄存器。

最好的选择是使用具有 QEI 的 PIC。虽然我不能改变硬件,只能改变软件,但这是一个值得一提的解决方案。

中断应用于低分辨率编码器和低速应用程序。

轮询适用于高分辨率编码器和高速应用,但您需要确保主循环符合时间限制。如果主循环花费的时间超出预期,您还可以在主循环中轮询更多次。

术语“高”和“低”取决于实际实现,例如 MCU 的时钟速度、编码器的分辨率、电机的最大转速和软件的结构。

>

感谢您的回答!

链接到关于电子堆栈交换的同一问题: https://electronics.stackexchange.com/questions/544340/incremental-encoder-polling-or-interrupts

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...