旋转编码器ec11

旋转编码器ec11_第1张图片
旋转编码器ec11_第2张图片
旋转编码器ec11_第3张图片
旋转编码器ec11_第4张图片
旋转编码器ec11_第5张图片
旋转编码器ec11_第6张图片
定时器编码器功能需要用到通道1(TI1)和通道2(TI2),小编使用的是自己画的板子原理图在上一期已附上,故得先对GPIO配置如下。
图片
配置完GPIO后就可以配置定时器、中断优先级和定时器中断服务函数了。
图片
图片
图片
到此定时器编码器功能就全部配置完毕了,下面就可以使用TIM_GetCounter(TIM2)直接读取旋钮值了;需要注意的是读出来的值需要除以4,因为转动一小格编码旋钮会产生如下波形(正转),
图片
从官方参考手册下表很容易看出确实是一个脉冲记四个数。
图片
好的,到现在我们就掌握了两种方法来获取编码旋钮的值了,小编没有使用定时器获取编码旋钮的值,是因为想要榨干编码旋钮的话后面还需要用到一个定时器,如果采用定时器去获取编码旋钮的话,对STM32的资源消耗太大,对小编后期的开发影响较大。当然如果大家做项目时对定时器消耗较小话,也可以采用这种方法。
(注:接下来的内容与上一期紧密连接,没有看上一期的朋友可以先看上一期)

二、快慢旋的判断

需要判断快慢旋的话,肯定就与时间紧密挂钩了,这里就需要用到定时器了。整体思路就是旋转编码旋钮键值在改变的同时给一个flage++,然后配置一个定时器中断去判断flage的大小,来判断快慢旋,直接上代码吧。

先配置一下定时器,这里定时时长会影响都后面对快慢旋判断的阈值。
图片
图片
下面就是判断处理了。每次旋转编码器键值得改变都是一个结构体变量increment,同时不管正反旋都会给一个flage++。定时器中断函数对flage判断如果大于3则increment为10,反之则为1,同时给flage清零。至此我们的编码旋钮就可以判断正反转了。
图片
图片
三、PUSH BUTTON 按下时编码旋钮值

有前面的基础这个相对就简单起来的,直接上代码讲解吧。进入A中断后首先是延时1MS再判断A相是否为低电平(这里是消抖,上一期忘了和大家讲hihi),消完抖后就是判断PUSH BUTTON(KEYC)是否按下了。若为按下则改变Down_number否则改变number。
图片

四、单、双和长击的判断

单、双和长击的判断就需要有一定的逻辑能力了,直接上代码吧。
void EXTIC_IRQHandler(void)
{
if(EXTI_GetITStatus(EXYIC_Line) != RESET)
{
delay_ms(1);
if(KEYC0)
{
Encoder_Init.Encoder_Keep=0;
Encoder_Init.Encoder_Double=0;
Encoder_Init.Encoder_KEY=0;
Encoder_Init.Double_flage=300;
while(KEYC
0&&Encoder_Init.Double_flage>0)
{
delay_ms(1);
Encoder_Init.Double_flage–;
}
if(Encoder_Init.Double_flage0)
{
Encoder_Init.Encoder_Keep=1;
}else
{
Encoder_Init.Double_flage=150;
while(KEYC
1&&Encoder_Init.Double_flage>0)
{
delay_ms(1);
Encoder_Init.Double_flage–;
}
if(Encoder_Init.Double_flage>0)
{
Encoder_Init.Encoder_Double=1;
}else
{
Encoder_Init.Encoder_KEY=1;
}
}

}
}
EXTI_ClearITPendingBit(EXYIC_Line);
}

PUSH BUTTON配置的是下降沿触发的外部中断,进入中断首先延时消抖,然后就是进入键值处理函数了,首先是给上一次的键值清零。然后给Double_flage赋值300然后判断是否进入第一个while,按键一直按下且Double_flage大于零进入,while里面给Double_flage–,只有按键一直按着Double_flage才会为0,若按下就松手则直接跳过while。接下来判断Double_flage,若为零表示300MS按键一直被按下,则Encoder_Keep赋值1 。否则进入判断单双击,首先给Double_flage赋值150然后判断是否进入下一个while,按键松开且Double_flage大于零进入,while里面给Double_flage–,其实也就是在你按键松开后在150ms内,按键是否被在此按下,按下则终止while。最后就是判断Double_flage,若减为0就是松手后没有检测到在此按下,则Encoder_KEY赋值为1,反之Encoder_Double赋值为1 。

旋转编码器ec11_第7张图片
旋转编码器ec11_第8张图片
旋转编码器ec11_第9张图片
旋转编码器ec11_第10张图片
旋转编码器ec11_第11张图片

你可能感兴趣的:(ros)