Arduino中IR输入与PWM输出同时使用时均失效问题排查
问题分析与解决方案
核心原因:硬件定时器资源冲突
Arduino的PWM输出和IRremote库的红外解码都依赖硬件定时器。以Arduino Uno/Nano为例:
- 引脚11的PWM输出由Timer2提供
IRremote库默认使用Timer2实现红外信号的解码计时
当调用analogWrite(LED_PIN, ...)开启引脚11的PWM时,会抢占Timer2的控制权,导致红外接收器失去必要的定时器支持,无法继续解码信号;同时定时器被两个功能同时占用,PWM输出也会异常,最终出现LED不亮、红外接收失效的情况。
解决方案
方案1:更换LED的PWM引脚(最简单)
选择不与IRremote默认定时器冲突的引脚。比如在Uno/Nano上,将LED_PIN改为9或10(这两个引脚由Timer1控制,与IRremote默认的Timer2不冲突):
#define LED_PIN 9 // 或10
修改后重新上传代码,即可同时正常使用红外接收和PWM功能。
方案2:修改IRremote库的定时器配置
如果必须使用引脚11,可以修改IRremote库的定时器设置,让它使用其他空闲定时器:
- 打开Arduino库管理器,找到
IRremote库,点击"打开文件夹" - 找到并打开
IRremoteInt.h(新版本可能在src目录下的IRremote.hpp) - 将默认的定时器定义改为Timer1:
#define IR_USE_TIMER 1 // 原默认值为2 - 保存后重新编译上传代码即可。
代码优化建议
你的getCommand()函数中判断指令的逻辑存在问题,data.flags是位掩码,正确过滤重复指令的方式应该是检查重复标志位,避免重复触发:
uint16_t getCommand() { const IRData& data = IrReceiver.decodedIRData; // 过滤重复的红外指令,只返回新指令 if (data.flags & IRDATA_FLAGS_IS_REPEAT) { return 0; } return data.command; }
内容的提问来源于stack exchange,提问作者Exenifix
相关产品推荐
相关产品推荐

