我正在使用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,问题又会出现。
答案 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)
电源inductor
和3.3V
引脚之间的AVcc
是analogRead() reset
的问题。这里提到了这个电感的目的,Inductor purpose。但是电感器的短路可以解决这个问题。
答案 3 :(得分:0)
我建议你不应该写uint16_t a = analogRead(A0)
,而应该将A0的输入声明为变量,稍后在程序中调用它。同时,void setup()
部分有一个错误,那就是你用条件编写了while循环,并以半冒号结束了这一行。如果大括号