问题:
STM32的外部输入经过光耦接到GPIO输入端,如图所示:
其中,I5对应的按键检测用于即按即停功能,不能有误触发;
MCU中,DI5管脚原来设置成下降沿触发;
测试时发现按键按下和弹起时,都会触发中断,进入中断处理程序的回调函数;
1、将延时时间由300ms延长到3000ms不能解决问题;
2、示波器查看有没有上升沿抖动,时间轴设定为每格100ms,看不到抖动现象;
将时间轴放大到每格1ms就可以清晰地看到抖动了;
3、在中断回调函数中,stop_check ^= 1,也就是说每进一次中断,stop_check的值都会在0和1之间切换;
4、原因找到了,想办法解决抖动问题。
解决办法:
1、解决抖动问题前,在时间轴每格1ms的窗口上,看到的抖动如图所示:
2、在DI5和DGND之间并联了一个0.1uF的电容,
再次测试DI5输入端按键按下时的波形,如图所示:
从图中可以明显看到,由于0.1uf电容的滤波作用,有两个毛刺本来要冲起来,结果被滤掉了。
实测结果:
1、按下按键时(对应上升沿),stop_check的值不再变化,只有按键松开的时候变化;
2、由于按键按下的时间长短不定,stop_check值变化的时刻也随之长短不定,这不符合现场体验;
将外中断改为上升沿触发,这样每次的响应时间都是相同的;
3、将两次进入中断的间隔缩短到5ms,实测没有任何误触发;
问题解决。