最近在将以前的旋转编码开关的轮询查状态程序改为中断触发程序。在测试过程中发现如下问题:
比如我用PA0和PA1输入上拉来接旋转编码开关,PA1开外部中断,上升下降触发中断。中断程序如下:
if(GPIO_Pin == GPIO_PIN_1)
{
port=(GPIOA->IDR)&0x03;
if(port==0)
{Left[0]=0XFF;Right[0]=0X00;}
else if(port==2)
{Right[0]=0XFF;Left[0]=0X00;}
else if((Right[0]&port)==0x01)
{rowResult[0]--;Right[0]=0X00;}
else if((Left[0]&port)==0x03)
{rowResult[0]++;Left[0]=0X00;}
}
这个配置可以准确识别编码器的旋转,在手旋转允许的情况下,快慢都可以检测旋转量,一圈20个脉冲非常准确
但是只要你将PA1的外部中断改成PA0,同时将if(GPIO_Pin == GPIO_PIN_1)改为if(GPIO_Pin == GPIO_PIN_0)。余下的判断程序不做修改。
理论上应该没有问题,但是问题却出现了,问题基本如下:
一般需要转动3到4个脉冲后,程序才能准确识别一个脉冲。每圈识别出来的脉冲数都不同的。
而且奇怪的是,我其实同时接了4个编码器,只要你的中断脚在2个脚中间数值小的那个,就会出现这种情况,比如PA4PA5接了一个,PA4中断,程序不正常,换到PA5就正常。这种情况同时出现在
STM32F1和STM32F4上。
不知为何会出现这种情况。
1、端口干扰,建议加104电容。
2、端口未正确初始化。
3、对应端口的中断优先级,设置不正确。
还有,建议把编码开关两个端口对调一下,
看看问题端口是否还是不正常。
一周热门 更多>