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

C 增量编码器-轮询还是中断?,c,pic,encoder,pic18,C,Pic,Encoder,Pic18,我接手了一个项目,包括PIC18f25k80微控制器和增量编码器。基本上,我只需要使用编码器跟踪电机的位置,并将设备驱动到特定位置。我知道有更多的方法来读取编码器和更新位置。电机根本不转快,这里不涉及高速 如果我从头开始开发整个程序,我可能会将编码器的一个通道挂接到一个中断引脚(比如端口B),在ISR中,我会检查另一个引脚的状态。对我来说,这似乎是最干净的解决方案,这种方法可能捕捉到所有的位置变化,如果我错了,请纠正我 另一种方法是轮询主循环中的2个通道。主回路中没有太多内容,基本上只是根据位置

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

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

另一种方法是轮询主循环中的2个通道。主回路中没有太多内容,基本上只是根据位置调整电机速度和方向,因此在低速时,我想我不会错过位置更改,但这让我感到困扰,仍然有可能错过编码器通道中的更改

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

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

正如我所说,我将使用第一个,编码器通道连接到RB4和RB5,因此我可以只启用端口B上的中断。但据我所知,这是我不确定的地方,我只能为PIC18f25k80上的整个端口B启用中断,而不能为单引脚启用中断。这意味着端口B上的所有管脚都将创建一个中断,而不仅仅是我想要的中断。不仅是编码器的另一个通道,而且端口B上的所有引脚都连接到某个东西上,我无法更改布局,只能更改软件。我看得对吗,在这种情况下,这种方法是错误的,因为所有管脚都会在端口B上引起中断,这会造成太多的开销

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

提前感谢您的回答


这是有问题的编码器:

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

首先,还可以为各个管脚启用和禁用中断。在端口B上,需要配置的相应寄存器(如果IOCB寄存器不可用)

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

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

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

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

谢谢你的回答

链接到有关电子堆栈交换的同一问题:

您可能会在这里得到更好的回复-谢谢!我会把它贴在那里。首先我必须纠正你认为的错误信息。在PORTB上使用中断时,不会对端口的所有管脚启用该中断。PORTB上的每个中断源都有一个单独的启用选项。对于INTx源,您可以通过写入相关的INTCONx寄存器来启用或禁用每个INTx源,例如INTCON3bits.INT3IE=1以启用INT3中断。对于本例中的更改引脚中断,您可以通过写入IOCB寄存器来启用或禁用。第二个问题是您应该使用什么方法。你说旋转速度很慢。答案实际上取决于振荡器频率的快慢和主扫描周期的快慢。如果主循环没有需要很多时间才能完成的繁重工作(不是指几秒钟,而是几百毫秒),那么可以在主循环中实现它。但是,如果旋转速度为每秒5次,则应该对销进行4次采样,以获得良好的采样结果。但是如果你的main不能适应时间的限制,你应该去中断。恰恰相反!中断应该用于高分辨率和高速度!中断应用于低分辨率编码器和低速应用。轮询适用于高分辨率编码器和高速应用程序,但需要确保主循环符合时间限制。如果主循环花费的时间比所需时间长,则还可以在主循环中轮询更多次。