Arduino Nano调用analogWrite()控制LED时程序冻结问题求助
故障根因
你遇到的冻结问题是典型的Arduino定时器资源冲突导致的:
Arduino Nano采用的ATmega328P主控中,Servo.h库默认会占用16位定时器1,而引脚9、11的PWM输出(也就是analogWrite()功能)正好由定时器1提供控制。当你向11引脚输出非0的PWM值时,会和已经被Servo库占用的定时器资源产生冲突,直接导致程序跑飞冻结,这也是你注释掉analogWrite()代码后故障立刻消失的原因。
解决建议
- 优先更换LED输出引脚(最简单方案)
选择其他不受定时器1控制的PWM引脚即可,Arduino Nano支持PWM的引脚有3、5、6、9、10、11,避开9、11这两个被定时器1控制的引脚即可,比如换为3号引脚,只需要修改初始化代码里的引脚定义:
其余逻辑代码无需任何调整即可正常运行。const int ledPin = 3; - 若必须使用11号引脚作为LED输出
可以更换舵机驱动库,改用ServoTimer2.h库驱动舵机,这个库会使用定时器2来驱动舵机,不会占用定时器1,即可避免冲突。但需要注意使用这个库后,3、10引脚的PWM输出功能会被占用,不能再调用analogWrite()控制这两个引脚。 - 额外接线检查
确认LED回路已经串联220Ω-1kΩ的限流电阻,避免LED导通电流过大拉低单片机供电电压导致异常重启,虽然这不是本次故障的核心原因,但属于必要的硬件防护。
内容的提问来源于stack exchange,提问作者SeanOD
相关产品推荐
相关产品推荐

