【问题标题】:Arduino Mega2560 reboots after two consecutive calls to analogWrite连续两次调用analogWrite 后,Arduino Mega2560 重新启动
【发布时间】:2020-06-27 19:10:36
【问题描述】:

为什么这段代码会导致 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 有点特殊)。

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

【问题讨论】:

  • 显示连接到此的电路。
  • Arduino 没有插入任何东西,这很有趣。

标签: arduino avr atmega pwm


【解决方案1】:

如果您将引脚设置为:

,则不应发生此行为:
 void setup() {
    pinMode(10, OUTPUT);  // sets the pin as output
    pinMode(11, OUTPUT);  // sets the pin as output

此类复位是电源故障、噪音或连接不良(不良原型板)或 LED 引脚不良(例如:电阻器太小或损坏,或引脚损坏等)的典型表现。 如果您的 mega 没有硬件缺陷并且有足够的电源或附加的导致此缺陷的硬件,它应该可以按预期工作。

【讨论】:

  • 为什么会有帮助。?类比写入配置引脚
  • 请仔细阅读文档: 文中写道:在调用analogWrite() 之前,您无需调用pinMode() 将引脚设置为输出。 - 所以是的,我们应该假设我们不需要这个。但是在同一页面示例中,使用了 pinmode,并且各种问题表明analogWrite 并不总是做它应该做的事情。文档中的此注释: 注意:pinMode(..);在调用analogWrite(pin, value)之前需要;否则引脚将不会被初始化为 PWM 输出并设置为所需的占空比。所以我的提示总是明确地将它们设置为输出。
【解决方案2】:

显然,编译器的优化是罪魁祸首。在程序开头添加这两行之后,它终于可以正常工作了:

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

【讨论】:

  • 你能解释一下,为什么你认为这是一个修复?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
相关资源
最近更新 更多