在连续两次调用AnalogWrite之后,Arduino Mega2560重新启动

时间:2020-03-16 16:44:22

标签: arduino avr atmega pwm

为什么这段代码会导致Arduino Mega2560不断重置?

void setup() {
  Serial.begin(9600);
  Serial.println("SETUP");
  delay(500);             //without this line Serial prints "SESESESESE"
  analogWrite(10, 100);
  analogWrite(11, 50);    //reboots after this line
}

void loop() {
  Serial.println("LOOP"); //doesn't reach here
}

Arduino串行输出以下内容:

SETUP
SETUP
SETUP
SETUP
SETUP
SETUP
SETUP
SETUP

注意事项:

1)如果我将10和11引脚替换为其他引脚(例如8和9),则Arduino不会重新启动,但也会通过12和13引脚重新启动(我猜10-13引脚在某种程度上很特殊)。 / p>

2)如果我在对analogWrite的调用中使用相同的值(例如100和100),则Arduino无法重新启动。

2 个答案:

答案 0 :(得分:1)

如果将引脚设置为:

 void setup() {
    pinMode(10, OUTPUT);  // sets the pin as output
    pinMode(11, OUTPUT);  // sets the pin as output

此类复位通常是由于电源故障,噪声或连接不良(原型板不良)或LED引脚不良(例如,电阻太小或损坏或引脚损坏等)引起的。 如果您的巨型计算机没有硬件缺陷,并且有足够的电源或附加的硬件引起该缺陷,则它应该可以正常工作。

答案 1 :(得分:1)

显然,应该归咎于编译器的优化。在程序的开头添加了这两行之后,它终于可以正常工作了:

void setup() __attribute__((optimize("-O1")));
void loop() __attribute__((optimize("-O1")));