HAL库中断下降沿解决编码器问题方案

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

生成海报
点赞 0

看电路的程序猿

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

HAL库中断下降沿解决编码器问题方案

EC11旋转编码器 下降沿中断触发判断正反转问题解决方案 首先上一张旋转编码器的电平逻辑图: 先说一下思路:A引脚我设置了下降沿中断触发,B引脚设置了读输入。当A引脚出现由高电平向低电平转换的现象&

基于STM32F4系列 之 霍尔编码器减速直流电机

文章目录 前言一、关于编码器介绍二、编码器工作原理三、编码器电机配置四、代码配置五、实验工程链接前言 这篇博文为作者实验经历写下的笔记,借鉴学习了多位博主的博文,并总结了互联网资料。本篇使用的是JGB37-520减

串口不定长接收

一、保留接收区和开启接收的语句    uint8_t buffer[5];HAL_UART_Transmit_IT(&huart1,buffer,3); 二、写入开启空闲中断的语句    __HAL_UART_ENABLE_IT(&huart