Arduino Mini Pro 3.3V不使用ADC的1.1V内部基准电压源

时间:2016-12-18 15:17:26

标签: arduino adc

使用Arduino Mini Pro 3.3V我在" INTERNAL"之间切换时偶然发现了一个问题。和" DEFAULT" ADC的参考电压。 我想测量分压器的输出[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) DEFAULT参考的ADC结果总是很好。

对于2.56V参考值,240的值是可行的。我知道有些ATmegas使用的是2.56V参考电压,但ATmega328只能使用1.1V。奇怪的是,(ATmega328/P datasheet)在第28.7章的ADC示例中提到了2.56V参考,所以我很困惑。

在某个ATmega328p版本中是否有可能存在2.56V ADC参考?

1 个答案:

答案 0 :(得分:0)

事实证明,与2.56V的相似性是巧合,可能是数据表中的错误(或者在我的理解中)。 问题是在模拟参考(内部)调用之后,必须立即读取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

将参考值更改回DEFAULT似乎不太容易......但至少需要一次读数才能获得精确的结果。

我希望没有人不得不花时间在这个......