Arduino Mini Pro 3.3V 不使用 ADC 的 1.1V 内部参考
Arduino Mini Pro 3.3V does not use 1.1V internal reference for ADC
使用 Arduino Mini Pro 3.3V 在 ADC 的 "INTERNAL" 和 "DEFAULT" 电压参考之间切换时,我偶然发现了一个问题。
我想测量分压器的输出 [GND - 110kOhm - A2 - 500kOhm - VCC] 以计算 VCC。 VCC 被测量为 3.3V。它由稳压器提供。
在循环中,我首先使用内部参考测量分压器输出,然后使用默认电压参考。
我看到代码示例,其中人们建议在读取下一个值之前等待几毫秒,并且 (analogReference() documentation) 建议在调用 analogReference() 后忽略第一个读数。我遵循这些准则。
我将提供一个最小示例草图:
// the setup function runs once when you press reset or power the board
void setup()
{
pinMode(A2, INPUT); // ADC pin
Serial.begin(9600);
Serial.println("----------------");
}
void burn8Readings(int pin)
{
for (int i = 0; i < 8; i++)
{
analogRead(pin);
}
}
// the loop function runs over and over again forever
void loop()
{
uint16_t nResult1, nResult2;
analogReference(INTERNAL); // set the ADC reference to 1.1V
delay(10); // idle some time
burn8Readings(A2); // make 8 readings but don't use them to ensure good reading after ADC reference change
nResult1 = analogRead(A2); // read actual value
analogReference(DEFAULT); // set the ADC reference back to internal for other measurements
delay(10); // idle again
burn8Readings(A2); // make 8 readings but don't use them to ensure good reading after ADC reference change
nResult2 = analogRead(A2); // do other measurements
// print result to serial interface..
Serial.print("1: ");
Serial.print(nResult1);
Serial.print(" - 2: ");
Serial.println(nResult2);
delay(2000);
}
第一对 ADC 结果似乎正确 (553 / 184),但在接下来的迭代中,第一个值是错误的,没有改变 ADC 引脚上的实际电压。 (240 / 183)
默认参考的 ADC 结果总是好的。
对于 2.56V 参考,240 的值是可行的。我知道一些 ATmegas 使用 2.56V 参考电压,但 ATmega328 应该只有 1.1V。奇怪的是 (ATmega328/P datasheet) 在第 28.7 章的 ADC 示例中提到了 2.56V 参考,所以我很困惑。
是否有可能在某个 ATmega328p 版本中有 2.56V ADC 参考?
原来与 2.56V 的相似性是巧合,可能是数据表中的错误(或我的理解)。
问题是在调用 analogReference(INTERNAL) 之后必须立即读取 ADC 值!不像我那样在几毫秒之后。 (Source)
在完成虚拟读数后等待几毫秒仍然很重要。对我来说,一个读数和延迟 (5) 就足够了,但我想这取决于 ADC 电容器中剩余的电荷:所以我建议更高的延迟。
正确的顺序是:
analogReference(INTERNAL); // set the ADC reference to 1.1V
burn8Readings(A2); // make 8 readings but don't use them
delay(10); // idle some time
nResult1 = analogRead(A2); // read actual value
和
analogReference(DEFAULT); // set the ADC reference back to internal
burn8Readings(A2); // make 8 readings but don't use them
delay(10); // idle again
nResult2 = analogRead(A2); // read actual value
将参考改回默认值似乎不太容易......但至少仍然需要一个读数才能获得精确的结果。
我希望没有人再花时间在这上面了...
使用 Arduino Mini Pro 3.3V 在 ADC 的 "INTERNAL" 和 "DEFAULT" 电压参考之间切换时,我偶然发现了一个问题。 我想测量分压器的输出 [GND - 110kOhm - A2 - 500kOhm - VCC] 以计算 VCC。 VCC 被测量为 3.3V。它由稳压器提供。
在循环中,我首先使用内部参考测量分压器输出,然后使用默认电压参考。 我看到代码示例,其中人们建议在读取下一个值之前等待几毫秒,并且 (analogReference() documentation) 建议在调用 analogReference() 后忽略第一个读数。我遵循这些准则。
我将提供一个最小示例草图:
// the setup function runs once when you press reset or power the board
void setup()
{
pinMode(A2, INPUT); // ADC pin
Serial.begin(9600);
Serial.println("----------------");
}
void burn8Readings(int pin)
{
for (int i = 0; i < 8; i++)
{
analogRead(pin);
}
}
// the loop function runs over and over again forever
void loop()
{
uint16_t nResult1, nResult2;
analogReference(INTERNAL); // set the ADC reference to 1.1V
delay(10); // idle some time
burn8Readings(A2); // make 8 readings but don't use them to ensure good reading after ADC reference change
nResult1 = analogRead(A2); // read actual value
analogReference(DEFAULT); // set the ADC reference back to internal for other measurements
delay(10); // idle again
burn8Readings(A2); // make 8 readings but don't use them to ensure good reading after ADC reference change
nResult2 = analogRead(A2); // do other measurements
// print result to serial interface..
Serial.print("1: ");
Serial.print(nResult1);
Serial.print(" - 2: ");
Serial.println(nResult2);
delay(2000);
}
第一对 ADC 结果似乎正确 (553 / 184),但在接下来的迭代中,第一个值是错误的,没有改变 ADC 引脚上的实际电压。 (240 / 183) 默认参考的 ADC 结果总是好的。
对于 2.56V 参考,240 的值是可行的。我知道一些 ATmegas 使用 2.56V 参考电压,但 ATmega328 应该只有 1.1V。奇怪的是 (ATmega328/P datasheet) 在第 28.7 章的 ADC 示例中提到了 2.56V 参考,所以我很困惑。
是否有可能在某个 ATmega328p 版本中有 2.56V ADC 参考?
原来与 2.56V 的相似性是巧合,可能是数据表中的错误(或我的理解)。 问题是在调用 analogReference(INTERNAL) 之后必须立即读取 ADC 值!不像我那样在几毫秒之后。 (Source)
在完成虚拟读数后等待几毫秒仍然很重要。对我来说,一个读数和延迟 (5) 就足够了,但我想这取决于 ADC 电容器中剩余的电荷:所以我建议更高的延迟。
正确的顺序是:
analogReference(INTERNAL); // set the ADC reference to 1.1V
burn8Readings(A2); // make 8 readings but don't use them
delay(10); // idle some time
nResult1 = analogRead(A2); // read actual value
和
analogReference(DEFAULT); // set the ADC reference back to internal
burn8Readings(A2); // make 8 readings but don't use them
delay(10); // idle again
nResult2 = analogRead(A2); // read actual value
将参考改回默认值似乎不太容易......但至少仍然需要一个读数才能获得精确的结果。
我希望没有人再花时间在这上面了...