Arduino Mega2560中断按键触发时意外调用多个ISR问题求助
问题根因说明
- 引脚耦合串扰:Arduino Mega2560的18~21号中断引脚物理位置相邻,并行排布的按键排线会产生线间电磁耦合。按下某一个按键时,引脚的电平跳变会在相邻引脚上感应出极短的低电平尖峰,刚好满足
FALLING下降沿中断的触发条件,因此会误触发相邻引脚的中断服务程序。你测试时仅保留按键1接地、按键2仅接引脚仍会误触发的现象,完全符合耦合干扰的特征。 - 原有中断逻辑遗漏校验步骤:下降沿中断仅检测电平变化的边沿,不管这个边沿来自真实按键触发还是干扰毛刺。你最初的中断服务程序仅做了间隔时间判断,没有校验触发中断的引脚当前实际电平,耦合产生的尖峰虽然持续时间只有几微秒,已经足够触发中断,但中断响应时尖峰已经消失,引脚回到高电平,你新增
digitalRead(buttonX)==LOW的判断后,自然就能过滤掉这类虚假触发。 - 存在变量类型隐患:你用于存储触发时间的
timeTrigger系列变量定义为float类型,但millis()函数返回值为unsigned long无符号长整型,用浮点数存储整数会出现精度损失,设备连续运行数小时后时间判断逻辑会出错,建议将所有时间相关变量改为unsigned long类型。
可选优化方案
- 硬件层面可以给每个中断引脚并联一个0.1μF陶瓷电容到GND,既可以过滤毛刺干扰,也能缓解按键本身的机械抖动问题。
- 如果使用普通排线布线,可以在相邻的信号引脚之间插入一根GND线做隔离,大幅降低线间串扰概率。
内容的提问来源于stack exchange,提问作者Jesper K.
相关产品推荐
相关产品推荐

