ADC转换为电压是否取决于+5 V引脚的实际值?


13

问题:

  1. ADC计数转换为电压是否取决于+5 V引脚的实际电压?
  2. 如果是,从板上获取该电压的可接受方法是什么?

背景/详细信息:

我有一个电路,其中有一个通过USB连接器(从集线器)运行的Arduino Nano(克隆)。Arduino的工作是测量电池上的电压,该电压将驱动Nano接通/断开的第二个电路。供参考,它是电池测试仪。

测试电路

诺基亚5110屏幕上显示了以下非常简单的草图中的电压。

void setup() {
  Serial.begin(9600);
  display.begin();
  // Init done

  // You can change the contrast around to adapt the display
  // for the best viewing!
  display.setContrast(50);

  // Text display tests
  display.setTextSize(1);
  display.setTextColor(BLACK);
}


void loop() {
  display.clearDisplay();   // Clears the screen and buffer
  display.setCursor(0,0);
  display.print("Vin=");
  int rawVIN = analogRead(VIN);
  float floatVin = (rawVIN*4.75)/1023.0;
  display.println(floatVin);
  Serial.println(rawVIN);
  display.display();
  delay(1000);
}
  • 我使用DVM测量了电池电压,该电压为4.13 V,但Nano报告为4.3​​5V。
  • 我在电池和Arduino之间有着共同点。
  • 因为测试电压的连接可能会浮空,所以我有一个下拉电阻来阻止剧烈波动(> 10kΩ)

经过一番调查,我发现+5 V实际上是输出4.75 V,并从

float v = (rawVIN*5.0)/1024.0;

float v = (rawVIN*4.75)/1024.0;

现在Arduino上的电压读数是正确的。我这样做并不是因为我了解自己的所作所为,而是因为我有预感,它可能会将值更改为正确的值。


3
作为一个边不应该被划分1024,不是 1023这是一个被重复过的一遍又一遍,从错误中Arduino的例子是推测得出的一种错误。资源?AVR的数据表。
汤姆·卡彭特

@TomCarpenter我认为这是由于我在一段时间内将头撞到桌子上而长时间摸索计算和读取某些东西的结果-我以1024开始,但如您所见以1023结尾-我将更正我的问题。
北美驯鹿

Answers:


16

Arduino内部的ADC不测量电压,而是测量电压。即,从模拟输入端的电压到Vref引脚上的电压的比率。

在默认配置中,Vref引脚在内部连接到+5 V线。您可以选择使用内部参考作为Vref

analogReference(INTERNAL);

该参考电压约为1.1 V,并且不受+5 V电压波动的影响。问题是您无法测量高于该参考电压的电压。

对于电池测试仪,如果要进行某种“绝对”测量,则可以使用内部基准电压源和分压器来确保测量的电压低于1.1V。

编辑:其不需要的分压器的另一选择是使用Vcc的作为参考,以测量两个模拟输入和内部1.1 V“带隙”参考。针对Vcc测量1.1 V是间接测量Vcc的方法。Arduino核心库不支持此功能,但是您可以通过直接对ADC的控制寄存器进行编程来实现:

// Return the supply voltage in volts.
float read_vcc()
{
    const float V_BAND_GAP = 1.1;     // typical
    ADMUX  = _BV(REFS0)    // ref = Vcc
           | 14;           // channel 14 is the bandgap reference
    ADCSRA |= _BV(ADSC);   // start conversion
    loop_until_bit_is_clear(ADCSRA, ADSC);  // wait until complete
    return V_BAND_GAP * 1024 / ADC;
}

请注意,引导后的第一个读数可能是虚假的。


感谢您的迅速答复:)这现在非常有意思,并解释了为什么通过我的代码(软糖)调整可以得到正确的答案。结合恩格斯式的回答,我得到了我需要继续的一切。
北美驯鹿

9

USB供电的Arduino Nano将具有无法依靠的ADC参考电压,这是因为传入USB电压具有+/- 5%的容差。最重要的是,Nano具有MBR0520肖特基二极管(D1),根据其自身的制造公差,其温度以及电路板的电流消耗,其降压范围为0.1至0.5V。

你能为这个做什么?

Arduino Nano板上的MCU是ATmega328P。Nano的ADC可以根据几个可用的基准来缩放其模拟电压读数(您可以选择一个更适合自己的基准)。您可以通过该analogReference (type)函数执行此操作,并在以下参考文献中进行选择type

  • 默认值:默认模拟参考电压为5伏(在5 V Arduino板上)或3.3伏(在3.3 V Arduino板上)
  • 内部:内置基准电压,等于ATmega168或ATmega328上的1.1伏特,等于ATmega8上的2.56伏特(Arduino Mega上不可用)[...]
  • 外部:施加到AREF引脚的电压(仅0至5 V)用作参考。

资料来源:AnalogReference

这是ATmega328内部的ADC原理图,因此您可以看到那里发生了什么:

ATmega328P ADC模块

资料来源:ATmega328数据表

因此,直接的解决方案是构建一个弱分压器,以使您要测量的电压低于内部1.1 V参考电压,然后进行相应配置analogReference

分压器必须较弱(R值较高),因此您不会从电池中汲取太多电流,但不会太弱以至于无法由ADC输入阻抗加载。

奖金

但是,如果您需要的参考电压比ATmega328的内部1.1 V带隙参考电压高,那么您还是不走运。一种选择是使用板载FT232RL的3.3 V LDO稳压器输出,该输出可通过接头连接器的引脚14使用,但我也不认为这是可靠的。所述FT232RL数据表指定它在3.0 - 3.6 V(标称3.3 V)

因此,通用解决方案将是基于廉价的TL431构建外部电压基准。这样可以为您提供高达4.0-4.25 V的可靠基准,精度为+/- 1%。

外部基准电压电路就这么简单(和TL431可在面包板友好型TO-92封装中使用!):

基于TL431的并联稳压器


感谢您提供的全面解答以及我可以采用的所有替代方法-我可能会变得简单起来,并做一个分压器,将输入范围在0到1.1之间。关于电阻值的提示对我来说很有价值-谢谢
Caribou

3

在Atmega328P上关于ADC转换器的页面。有点下来的页面我描述的电压基准。可以使用TL431芯片提供各种参考电压,例如4V:

4V参考电压

通过改变电阻器,您可以获得其他电压(看起来您希望在4.2V左右)。

输出电压不受输入电压(在这种情况下为5V)的影响。

链接的页面介绍了如何选择电阻值。


2

adc计数转换为电压是否取决于+ 5v引脚的实际电压?

是和否:adc模块关心Vref,它可以通过Vdd内部或外部供电。

如果是,从板上获取该电压的可接受方法是什么?

通过配置ADC模块。器件数据手册应具有为此设置的寄存器/位。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.