【问题标题】:Arduino Mini Pro 3.3V does not use 1.1V internal reference for ADCArduino Mini Pro 3.3V 不为 ADC 使用 1.1V 内部参考
【发布时间】:2016-12-18 15:17:25
【问题描述】:

使用 Arduino Mini Pro 3.3V 在 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 的值是可行的。我知道一些 ATmega 使用 2.56V 参考电压,但 ATmega328 应该只有 1.1V。奇怪的是 (ATmega328/P datasheet) 在第 28.7 章的 ADC 示例中提到了 2.56V 参考,所以我很困惑。

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

【问题讨论】:

  • 只有一条评论:为什么在执行过程中必须更改参考电压?我认为,如果您的应用程序需要精确的参考,那么您必须将其设置为内部以进行所有测量(因此在设置中设置参考并且永远不要更改它)
  • 在我的最小示例草图中,我只测量了 VCC 两次。我不得不承认我不知道切换参考电压的原因。在我的实际应用中,我想读出其他传感器,它们充当 GND 和 VCC 之间的分压器。使用相同的 VCC 作为 ADC 的参考电压,我可以独立于实际 VCC 来解释测量结果。
  • 然后你还必须用更稳定的参考来测量一些东西。这是完全合理的。谢谢
  • 是的,参考更稳定的测量其实确实是电池的VCC。我想在电池电压下降时监测它。
  • 那你不能用Vcc作为参考电压,测量“稳定”的参考电压吗?您将获得电压的倒数,但通过简单的数学运算,您将获得电压,而无需电阻分压器即可获得电池电压的一小部分

标签: arduino adc


【解决方案1】:

事实证明,与 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

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

我希望没有人再花时间在这个上......

【讨论】:

    猜你喜欢
    • 2019-02-19
    • 2013-10-27
    • 2017-04-18
    • 2016-07-17
    • 1970-01-01
    • 2022-01-15
    • 2013-08-14
    • 1970-01-01
    • 2015-01-18
    相关资源
    最近更新 更多