Arduino analogRead()复位微控制器

时间:2016-12-02 14:34:39

标签: arduino microcontroller atmega adc

我正在使用Atmega328 arduino bootloader。我的整个代码工作正常。现在我需要使用analogRead()来获取ADC值,但只要PC看到analogRead(),它就会重启微控制器。这是示例代码。

void setup() {
  Serial.begin(19200);
  while(!Serial);
  Serial.println("Setup finish");
  delay(200);
}

void loop() {
  Serial.println("Reading analong Values");
  uint16_t a = analogRead(A0);
  Serial.println(a);
  delay(1000);
}

输出是,

Setup finish
�Setup finish
�Setup finish
�Setup finish
�Setup finish
�Setup finish
�Setup finish
�Setup finish
�

我也试过在它之前和之后放delay()但没有白费。如何解决它。谢谢。

  

更新:   我尝试过0而不是A0,但没有白费。

     

更新:   问题都归结为voltage selection(3.3 or 5V)开启FTDI程序员。将其设置为5V可以很好地工作,但将其切换到3.3V,问题又会出现。

4 个答案:

答案 0 :(得分:0)

来自Arduino网站here

DEFAULT:默认模拟参考电压为5伏(在5V Arduino电路板上)或3.3伏电压(在3.3V Arduino电路板上)

内部:内置参考电压,ATmega168或ATmega328等于1.1伏特,ATmega8等电压为2.56伏特(Arduino Mega不提供)

这清楚地表明,在读取模拟输入时,您使用的atmega328需要1.1v的内部参考。它可能正在重新启动,因为在使用analogReference(DEFAULT);时,atmega328不知道如何正确解码信号并且它会崩溃。

答案 1 :(得分:0)

由于analogRead仅适用于模拟输入引脚,因此需要使用通道编号,而不是引脚编号。尝试传递0而不是A0。它可能会失败,因为A0具有比模拟输入通道数量更多的数字(作为数字引脚),从而导致出界误差。

答案 2 :(得分:0)

电源inductor3.3V引脚之间的AVccanalogRead() reset的问题。这里提到了这个电感的目的,Inductor purpose。但是电感器的短路可以解决这个问题。

答案 3 :(得分:0)

我建议你不应该写uint16_t a = analogRead(A0),而应该将A0的输入声明为变量,稍后在程序中调用它。同时,void setup()部分有一个错误,那就是你用条件编写了while循环,并以半冒号结束了这一行。如果大括号

之间的语句为真,您应该编写要执行的操作