文章目录[隐藏]
EC11旋转编码器 下降沿中断触发判断正反转问题解决方案
首先上一张旋转编码器的电平逻辑图:
先说一下思路:A引脚我设置了下降沿中断触发,B引脚设置了读输入。当A引脚出现由高电平向低电平转换的现象,中断触发器检测到下降沿,就会触发下降沿中断,在中断函数里面编写函数读取B引脚的高电平还是低电平。如果是高电平,那么此编码器是正转,反之,低电平是编码器反转。
先说一下出现的两个问题:
现在,我有两个编码器P1和P2。
问题1:
示波器测量P2正处于高电平状态,当正向旋转P1的时候,P2的数值也会正向的增大,调试代码发现P2也跟着进入到了下降沿中断,此时P2的B引脚一直为高电平,因此P2的数值会跟着增大------------------问题:为什么旋转P1,P2会跟着进入中断?(旋转P1的产生中断的那一刻,在示波器40ns的时候看到P2的A引脚叠加了幅值为0.2V左右的高频杂波,幅值这么小难道影响P2的A引脚进入中断?)
这个问题让我很是不明白,P1的旋转抖动为什么会传到P2的A引脚上去,如果有懂的大佬可以留言说说自己的看法。
软件上的做法我增加了一个误判断的方法:在进入中断后读取A引脚的电平,如果读取后的电平状态是高电平说明中断误进入,直接return 退出中断即可。
问题2:
当正向旋转P2的时候,P2的数值会正向增大,但有时候也会减小。通过示波器看到的下降沿抖动的信号(示波器看到抖动信号不超过10us)。
根据问题2和问题1考虑到:如果是真的中断,我应该考虑下降沿的时间做以相应的延迟,避免正好读取的电平是抖动后的高电平造成误判没有进入中断(Delay_us就是这个功能),这个延迟也不能太长,否则读取B引脚状态也会出现问题:
void EXTI0_IRQHandler(void)
{
Delay_us(100); /* 延时消抖 */
if(__HAL_GPIO_EXTI_GET_IT(ENA8_Pin) != RESET) /* 中断标志位获取 */
{
__HAL_GPIO_EXTI_CLEAR_IT(ENA8_Pin);
HAL_GPIO_EXTI_Callback(ENA8_Pin); /* 中断回调 */
}
}
除了软件上这种消抖,硬件上也需要在B脚加消除高频杂波的电容(100nf电容如还出现问题2 ,建议使用10nf电容),如上基本上可以解决问题。
版权声明:本文为CSDN博主「看电路的程序猿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_43559363/article/details/122726756
EC11旋转编码器 下降沿中断触发判断正反转问题解决方案
首先上一张旋转编码器的电平逻辑图:
先说一下思路:A引脚我设置了下降沿中断触发,B引脚设置了读输入。当A引脚出现由高电平向低电平转换的现象,中断触发器检测到下降沿,就会触发下降沿中断,在中断函数里面编写函数读取B引脚的高电平还是低电平。如果是高电平,那么此编码器是正转,反之,低电平是编码器反转。
先说一下出现的两个问题:
现在,我有两个编码器P1和P2。
问题1:
示波器测量P2正处于高电平状态,当正向旋转P1的时候,P2的数值也会正向的增大,调试代码发现P2也跟着进入到了下降沿中断,此时P2的B引脚一直为高电平,因此P2的数值会跟着增大------------------问题:为什么旋转P1,P2会跟着进入中断?(旋转P1的产生中断的那一刻,在示波器40ns的时候看到P2的A引脚叠加了幅值为0.2V左右的高频杂波,幅值这么小难道影响P2的A引脚进入中断?)
这个问题让我很是不明白,P1的旋转抖动为什么会传到P2的A引脚上去,如果有懂的大佬可以留言说说自己的看法。
软件上的做法我增加了一个误判断的方法:在进入中断后读取A引脚的电平,如果读取后的电平状态是高电平说明中断误进入,直接return 退出中断即可。
问题2:
当正向旋转P2的时候,P2的数值会正向增大,但有时候也会减小。通过示波器看到的下降沿抖动的信号(示波器看到抖动信号不超过10us)。
根据问题2和问题1考虑到:如果是真的中断,我应该考虑下降沿的时间做以相应的延迟,避免正好读取的电平是抖动后的高电平造成误判没有进入中断(Delay_us就是这个功能),这个延迟也不能太长,否则读取B引脚状态也会出现问题:
void EXTI0_IRQHandler(void)
{
Delay_us(100); /* 延时消抖 */
if(__HAL_GPIO_EXTI_GET_IT(ENA8_Pin) != RESET) /* 中断标志位获取 */
{
__HAL_GPIO_EXTI_CLEAR_IT(ENA8_Pin);
HAL_GPIO_EXTI_Callback(ENA8_Pin); /* 中断回调 */
}
}
除了软件上这种消抖,硬件上也需要在B脚加消除高频杂波的电容(100nf电容如还出现问题2 ,建议使用10nf电容),如上基本上可以解决问题。
版权声明:本文为CSDN博主「看电路的程序猿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_43559363/article/details/122726756
暂无评论