成为订阅者(免费)

加入29,000名其他订阅者以获得用户销售折扣和 其他免费资源。
:
:
大学教师'担心 - 您的邮件地址完全是 安全的。我保证使用它 只要 to send you MicroZine.

arduino.电压参考

有一个Arduino电压参考(1.1V)内置于某些Arduino 微控制器。 uno和nano都有一个,并且相当多 另一个arduinos拥有它们。


这一页:

  • 尝试量化内部电压参考(它有多好?)。
  • 向您展示如何衡量"real"VCC的值(使用参考)。

上面的第二件物品很有趣,因为它使用内部 reference to "calibrate"电源电压使您可以测量电压 使用整个电源范围不仅仅是1V1。

您通常使用微控制器电源设置Arduino ADC 供应作为电压参考(因为它很容易!它是默认值 Arduino软件的模式)。这是电源的麻烦 然后芯片将定义测量的准确性即,您赢了'如果它与温度准确或稳定,则有一个线索。

笔记: 虽然内部Arduino电压参考是稳定的 温度和电压,其初始值在芯片之间变化 (可能是由于芯片制造的差异)。它需要校准。

当你不时,Arduino电压参考是有用的'想要加入添加的麻烦 external 芯片弄清楚电压并需要比VCC更稳定的参考或电源电压变化。

例如,Arduino Uno / Nano可以从1V8到5V5操作,并使用两个AA 单元格将允许操作(但仅当您将时钟设置为4MHz时 - 请参阅 数据表第29.3节"Speed Grades")。您可以使用内部电压引用来监视器 电池的状态 - 没有额外的组件。

带隙电压参考

Atmega328p中的参考类型是带隙类型。这用途 两个元素,一个具有负温度系数和 一个具有抵消的正温度系数 temperature effects.

While not 为您提供arduino的超精确电压读数,该电路旨在稳定地防止变化 温度和电源电压。

这种类型的电路布局用于现有技术参考。 MAX6143。 但是,在Atmega328和类似的过程中,控制布局的过程 芯片上的芯片并不明确,不使用激光 修剪,因此arduino电压的初始精度差 reference (±9%).

您可以了解如何在此页面后面消除此偏移量。

笔记: 如果使用外部参考ADC 由于您控制芯片规格,测量将更准确。
但是,记得 Arduino中的内部ADC无论如何都不太准确(请参阅Atmega328数据表:绝对 精度2LSB(包括INL,DNL,量化,增益和偏移错误)。

警告: 永远不要使用外部 voltage reference 同时 启用内部参考 - 有些东西会破坏!

用于Arduino电压参考

Arduino电压参考可以以五种不同的方式之一使用:
  1. 用于欠出检测(请参阅数据表以启用)。
  2. 作为ADC中的测量值(进入其中一个输入)。
  3. 作为ADC测量的参考。
  4. 作为比较器的输入。
  5. 温度 measurement (The ADC must use the internal reference).

棕色检测

欠压检测允许处理器识别供应时 电压已浸到阈值以下,但并未完全消失 零。这用于向处理器标记存储器可能已经存在 写得很糟糕。它只需提供额外的可靠性 application.

对ADC的输入

测量ADC输入处的参考将允许校准a 不同的参考源例如供应(见 这里)或作为原油的比较 其他ADC输入(除非您 校准 the reference first as shown in 此页面 - 在这种情况下,它可能是非常准确的(〜1%))。

ADC参考

使用Arduino电压参考作为您希望使用它!

提示: 使用1V1参考表示10位ADC具有LSB值 〜1mV(1.074mV / LSB)。但是,您可以只测量高达1.1V的电压!

比较器输入

使用电压参考允许原油比较I.E只能 将任何输入电压与1V1进行比较。一个有趣的点是任何一个有趣的点 ADC输入可以通过比较器进行比较 - 而且没有 使用任何外部组件。请参阅数据表的第23.2节 labelled "模拟比较器多路复用输入".

你可以问这个问题"当你可以时,为什么要使用比较器 使用ADC轻松计算结果?"答案是速度。

比较器可以比较100纳秒内的两个电压 而ADC是连续近似类型,大约需要13us 收集ADC值。该值必须由处理器检索 然后你会将值与极限设置进行比较,持续 more time.

温度 Measurement

由于Arduino电压参考是与其可以的温度无关 与温度依赖电路的输出进行比较 - a 芯片内的电路。这允许您测量温度 ATMega328P.

气温 ADC中的传感元件可以设置为ADC输入之一。这 数据表指出温度系数为1mV /°C但是 由于芯片的过程变化,初始精度为±10°C 生产。 (参见标有数据表的第24.8节"Temperature Measurement")。准确的阅读需要校准此 system.

arduino.电压参考性能

arduino.电压参考的数据表中的信息指出它具有最大值和最小值 1.0V〜1.2V,名义上1V1。除此之外,还没有更多信息。

没有关于重复性或稳定性的信息。它表明电压可能在1.1V左右变化±9%。

所以真正的问题是:

    Arduino电压是否参考任何良好的参考 all?

规范似乎意味着它可能随时改变±9%。 事实上,这不是真的,电压引用更好,并且 quite useful.

在此页面上有一些电压参考测量 - 这些 并非详尽无遗,但会给你带隙的味道 参考性能。

arduino.电压参考问题

此处提出的问题是:
  • 参考电压如何随温度变化?
  • 参考电压如何随VCC而变化?
  • 参考电压一般有多稳定?
请记住,这些测量基于测试几个芯片 和一组或两组测量。因此,他们将给予 印象而不是绝对答案。

笔记: 所有电压测量都是在突破上使用ADS1115进行的 木板。所有电压测量都在ADS1115差分模式下进行。 使用MAX6675和J的温度测量 thermocouple.

初始准确性

初始精度在±9%的±9%差,但校准Arduino电压参考允许您消除此错误。

笔记: MAX6143的初始精度为0.05%(更好的180倍,C.f.9%)。

输出稳定性

测量两个板,首先是S标准Arduino Uno板和 第二个是Arduino纳米板。这些都使用相同的处理器 ATMega328P.

从USB(集线器)电源供电的Arduino UNO的不同时间/天的测量产生了以下结果:

arduino. UNO USB稳定性测量

arduino. Uno(PDIP)
USB(集线器)电源
电压(环境温度)
%错误(5V)
内部的
参考
%错误(1v1)
4.806V(21°C)差异
3.9%
1.104V差异
0.36%
4.826V(16°C)差异 3.5%
1.097V差异
0.27%
4.862V(22°C)差异 2.8%
1.0976V差异
0.22%
4.878V(21°C)差异 2.4%
1.0980V差异
0.18%
4.842V(20°C)差异 3.2%
1.0975V Diff.
0.23%
4.809V(19.5°C)差异 3.8%
1.0963V差异
0.34%
4.788V(23°C)差异
4.2%
1.0957V差异
0.39%
4.866V(23°C)差异 2.8% 1.0956V差异
0.39%
4.853V(20°C)差异 17/2/20 2.9%
1.0958V差异
0.38%
4.876V(17°C)差异 18/2/20
2.5%
1.0961V差异
0.35%
4.860V(18°C)Diff 24/2/20 2.8%
1.0957V差异
0.39%

VCC = 4.2 - 2.4 = 1.80%的最大错误
VREF的最大错误更改= 0.39 - 0.18 = 0.21%

在PC USB端口的不同时间/天的不同时间/天进行测量,得到以下结果:

arduino. Nano USB稳定性测量

Arduino Nano (MSOP)
USB(PC)电源
电压(环境温度)
%错误(5V)
内部的
参考
%错误(1v1)
4.821V(20°C) 3.6%
1.070V
2.72%
4.824V(16°C) 3.5%
1.069V
2.81%
4.831V(17°C)差异
3.4%
1.068V差异
2.91%
4.825V(22°C)差异
3.5%
1.068V差异
2.91%
4.851V(21°C)差异 3.0%
1.068V差异
2.91%
4.852V(15°C)差异 3.0% 1.069V差异
2.81%
4.830V(23°C)差异 3.4%
1.067V差异 3.00%
4.833V(20°C)差异 17/2/20 3.3%
1.067V差异
3.00%
4.862V(17°C)差异 19/2/20 2.8%
1.0691V差异
2.81%
4.879V(20°C)差异21/2/20
2.4%
1.0715V差异
2.69%

vcc = 3.6 - 2.4 = 1.20%的最大错误更改
Vref = 3.00 - 2.69 = 0.31%的最大错误更改

USB电压随比2.4%至3.6%,这没有一个大 对参考误差变化的影响(参见电压测量 below).

注意参考电压如何保持常量即,具有常数 偏移错误。即使电压引用从值开始关闭 1.070V它保持接近该价值。这可能是由于 制造过程似乎随着时间的推移似乎保持不变。

对于最高结果,供应是 从USB集线器中获取,其自有电源输出,而底部 是直接PC USB输出。后者似乎更稳定(纳米)。

在两种情况下,使用底板内部电压参考 将提供更一致的结果,因为它将具有更严格的电压调节。

笔记: 请记住,您要么直接使用5V USB电源(何时 在工作台上工作或使用外部电源块。在船上5V调节器 - LD1117AG(与NCP1117相同) - 有一个 比USB电源更紧密的错误规格(5V = 2%)(参见下面的供应灵敏度测量)。

结论稳定性

即使Arduino电压参考有初始偏移误差 (可能是由于制造过程)的稳定性 参考仍然非常好。这里的测量结果显示 0.21%〜0.31%的变化。

电压供应稳定性

在无焊接面包板上使用ATMEGA382P并连接到可变电源电压。

提供稳定性测量

电源电压

内部的
参考
%初始错误
更改(1v1)。
5.261V(20°C)差异 1.0995V Diff.
0.05%
4.948V(20°C)差异 1.0988V差异
0.11%
4.389V(20°C)差异 1.0980V差异
0.18%
4.056V(20°C)差异 1.0975V Diff.
0.23%
3.615V(20°C)差异 1.0971V差异
0.26%
3.370V(20°C)差异 1.0968V差异
0.29%
2.759V(20°C)差异 1.0965V差异
0.32%
注意:引用在2.3V下产生奇数值 它们不包括在内。原因是最大时钟速度 允许与电源电压成比例 - 应较低时钟速度 在1V8的操作中运行4MHz(参见数据表第29.3节速度等级 - 安全操作区域)。

在从5.26V开始时,误差会在每个电源VIL下降到每电源VIL下降-1.2mV
这是每电源伏下降的-11%。

    计算:[(1.0965-1.0995)/(2.759-5.261)]。

TCL.
proc perr {max val} {
   puts [expr {(($ max-$ val)/ $ max)* 100.0}]
}

结论供电电压

带隙电压参考似乎非常好,不敏感 电源电压变化。它下降1.2mV,每个电源伏下降开始 在5.26V供电时误差0.05%。如果供应保持不变,那么这 还可以通过校准引用来消除偏移误差。

温度 Stability

使用带有MAX6675芯片和MSOP Arduino的热电偶(j) 纳米。加热芯片一分钟并等待温度 稳定。 MAX6675热电偶具有偏移温度误差,但 我们真正想要的是温度的变化 以及如何涉及参考输出。环境温度 也使用不同的设备测量以提供参考点 the thermocouple.

arduino.纳米温度测量

对于通过热电偶测量的纳米环境温度为24.5°C (原始温度计表示23°C)所以非常接近。芯片温度是 30°C.

第一测量:
  • Vref是1.0674V。
  • VREF将1.0659kV加热芯片至75°C

下降是:-1.5mv

改变温度

对于35°C温度,更改参考电压变为-1.5mV。 大约为-1.5 / 35 = -0.043mV /°C。但这只能基于一个设备 and one measurement!

    更改为-0.043mv /°C

温度从25°C增加至125°C(100°C Delta)该参考 应该下降4.28mV。在百分比术语(4.28e-3 / 1.1)* 100 = 0.39%.

对于将25°C的温度降低至-40°C(-65°C delta)参考 应该增加2.79mV。在百分比术语(2.79e-3 / 1.1)* 65 = 0.16%.

如果考虑一个具有-2.1mV /°C温度的简单晶体管 随后改变,对于相同的温度增量,您将获得201mV电压 更改(18.2%的变化)所以带隙电路做得很好!

第二测量:
  • VREF为1.0665V.TEMP 30°C
  • VREF将1.0652kV加热芯片加热至75°C
下降是:-1.3mv - 所以这是第一个的结果。

第3次测量:
  • VREF为1.0688V.TEMP 30°C
  • VREF是1.0683kV加热芯片至75°C
下降是:-0.5mv - 有点不同,但在相同的范围内。

结论温度

温度性能良好,仅参考0.55% 在全温度范围内更换(估计35°C至75°C results).

参考电压变化0.003%/℃(估计)[0.55%/ 165(估计)]。

注意:MAX6143在3ppm /°C的温度性能上具有1000倍。

在全温度范围内(-40°C至+ 125°C)参考将会 变化约0.55%(0.39%+ 0.16%)= 0.55%(1V1),这不是太糟糕。

电压参考应在这些温度下达到2.79mV〜4.28mV(从1v1)。

关于Arduino电压参考的结论

参考可以具有大的偏移量(由于制造过程)±9%,因此其初始精度可能是坏的。

电源电压灵敏度:每电源伏下降〜-1.2mV。
        这是每个电源伏下降~.11%。

温度 stability: ~0.003% per °C (estimated)    
        在全温范围内〜0.55%。

输出电压稳定性:〜0.31%

为了获得Arduino电压的最佳结果,您应该 校准它。这将消除由于偏移电压 制造工艺和供应伏灵敏度(如果电压源 保持常数,即通过监管机构提供)。

然后将其稳定为0.55±0.31 =〜0.86%。

请记住,这是基于极少的样本的估计,所以你的 结果可能会有所不同,但确实表明可以更多地制作参考 如果校准,则稳定。它还表明Arduino电压参考 可能比你想象更有用。

如何测量电源电压

您可以从中操作微控制器(Atmega328p - Uno,Nano) 在1V8和5V5之间。这 微控制器无法检测到这一点"real"电源电压的值 除非您使用已知的参考 搞定的电压。这是因为ADC测量一切 相对于参考即,电源电压是参考!

警告: 一台电视CC.=4.5V时钟可以是20MHz和vCC.=2.7V 时钟速度必须是<= 10MHz, and for VCC.=1.8V 时钟速度必须是<= 4MHz)。见部分"29.3 Speed Grades" 这表明时钟频率必须线性地减少 降低电源电压。

它是ADC测量的一种反向方法。 而不是使用电压引用作为"reference" you use the 供应电压作为参考和"Arduino内部电压 reference"作为要测量的数量。

自从你可以以这种方式完成'T选择VCC电压作为ADC的输入。看看"ADC MUX块图" below.

在这种情况下,电源电压"reference" is worth:

    V = VCC./ 1024 v / lsb [pow(2,10)= 1024]

在上面的等式VCC. 未知(到微控制器!)。

通过测量1V1参考,并获得它的ADC值,您可以解决方程

    V = V裁判 / ADC价值

所以:

    VCC./ 1024 = v裁判 / ADC价值

所以

    VCC. = 1024 * (V裁判 / ADC价值)

和...

    VCC. = 1024 * (1V1 / ADC价值)

这里1024是正确的(1024是 VCC的除法 对于参考电压)。

提示: 提示:有更好的结果校准Arduino电压参考。

要使用Arduino电压参考弄清楚电源电压的值:

  • 将ADC参考源设置为VCC。
    (这是ADC MUX中的选项 - 见下图)
  • 采用带隙电压的ADC读数(Arduino电压参考)。
您可以使用上面的方程来计算电源电压或按照下面的示例进行操作。

示例速度1测量电源电压

将以下代码放入Setup()函数中的草图中。

如果你 校准 the reference 然后改变...的价值
	arduinoADCcal 

......到你的测量值。 1.1V的表示是11000 是一个固定的小数点表示,小数点是 假设是右边的一个地方。所以你可以想到11000 表示实际电压中的0.1mV的数量.11000 x 0.1e-3 = 1.1V

使用ADS1115或Good Voltmeter将为您提供足够的数字。如果 您使用标准DVM,那么您只会获得3位数(在2伏范围内)设置 最后两位数字到零。

////////////////////////////////////////////////////////////////
void selfMeasureVcc(char *buf) {
uint8_t low,high; // ADC bytes.
// Default reference value. Set this to your measured reference voltage (or leave as is).
// The value uses an integer fixed point representation
// with the assumed decimal point one place to the right.
static unsigned long arduinoADCcal = 11000;

   if (strlen(buf)>1) {
      if (strlen(buf)<6)
         Serial.print(F("Not enough digits"));

      else if (strlen(buf)>6)
         Serial.print(F("Too many digits"));
      else
         arduinoADCcal = atoi(&buf[1]);

   } else if (strlen(buf)==1)
      Serial.print(F("Ref calibration value: ")); Serial.println(arduinoADCcal);


   // ADCSRA |= _BV(ADEN); // Enable ADC. Enabled by init() in Arduino code.

   ADMUX = _BV(裁判S0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); // Set VCC ref and band gap as input.
   delay(2); // Vref settling time delay

   // Throw away 1st result as datasheet says
   // After switch, ref may be invalid.
   // Datasheet: "24.5.2 ADC电压参考".
   ADCSRA |= _BV(ADSC); // Start conversion
   while ( bit_is_set(ADCSRA, ADSC) ); // Wait for conversion complete.

   ADCSRA |= _BV(ADSC); // Start conversion
   while ( bit_is_set(ADCSRA, ADSC) ); // Wait for conversion complete.

   // ADCL must be read first, then ADCH, to ensure that the content
   // of the Data Registers belongs to the same conversion
   // Datasheet Section "24.2 Overview"
   low = ADCL;  // Read ADCL first which blocks ADCH updates.
   high = ADCH; // After reading ADCH both registers can be updated by the chip.

   long ADCValue = (high << 8) | low;
   Serial.print(F("ADC value of 1V1 ref: "));  Serial.println(ADCValue);

   #define BINS 1024L // VCC/1024 is the value of each LSB of the ADC.

   Serial.println( (arduinoADCcal)* 箱S );
   Serial.println( ((arduinoADCcal * 箱S)+5L) );
   Serial.println( ((arduinoADCcal * 箱S)+5L) / 10L );

   // Note +5 = middle of LSB bin
   // Calculate Vcc (in mV); 1125300 = 1.1*1024*1000
   // Here ccal value is 1.1*10e4 so no need for *1000 and must divide by 10.

   uint32_t res = (((arduinoADCcal * 箱S)+5L) / 10L) / ADCValue;

   // Calculate Vcc (in mV); 1126400 = 1.1*1024*1000
   // should be 1024 / ADCValue = 1125300L / ADCValue; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
   // internal1.1Ref = 1.1 * Vcc1 (per voltmeter) / Vcc2 (per readVcc() function)
   Serial.print(F("Measured (mV) ")); Serial.print(res); Serial.println(F(" mV"));
}

arduino.电压参考框图

arduino. Uno/Nano ADC MUX块图

arduino. ADC MUX用于带隙电压参考操作
资料来源:ATMEGA328P数据表

Attiny85内部电压参考


ADC的ATTINY85电压参考可选择为1V1或2.56V,布置在ADC中略微不同。 A.裁判 PIN只能设置为输入(没有切换FET将内部参考MUX连接到A.裁判 别针)。因此,您无法在A中设置Arduino电压参考以进行测量裁判 别针。

因此你可以't直接校准它。你要么假设 它具有所述值或准确测量VCC供应然后采取 ADC阅读(但记住ADC也有自己的错误!)。

将消除ADC误差的一种方式是在可变电压中馈送 到ADC输入 - 你测量的。然后将它与阅读进行比较 从电压参考(ADC读数)。一旦两个读数匹配 输入电压然后显示真正的Arduino参考电压 (当然仅限于1LSB精度)。

arduino. ATTiny85 ADC MUX块图

Attiny85内部电压参考
资料来源:Attiny85数据表

校准Arduino电压参考

校准UNO或NANO中的参考您只需打开 参考并测量参考引脚处的电压。记住这一点 只有销钉上的东西应该是电容器,没有其他驱动 电路(如果要保留芯片!)。

警告: 请勿连接到V的任何其他电压参考裁判 在切换Arduino(UNO / NANO)电压参考时引脚 - 没有 保护,您可能会损坏外部参考或 内部参考电路。


开启参考是简单地使用以下Arduino代码:

    analogreenere(内部); 

但是,您需要激活ADC以启用参考,因此简单的读取将执行。

    analogread(0); //可以是任何频道

这是由于"wiring"代码写入 - Mux寄存器 并且refs0 / 1仅在ADC READ命令之前写入(在Analogread()函数中)。

对于Arduino Mega,您可以选择以下内容:
    INTERNAL1V1
    INTERNAL2V56

将上面的代码放在Arduino草图的Setup()部分中。

现在将万用表连接到v裁判 引脚并记下结果(用于在代码中使用 - 请参阅 测量电源电压, 具体来说)。

提示: 使用标准万用表,或用于更多数字使用 差分模式或侥幸计(非常昂贵)的ADS1115。

提示: 将电容器添加到VREF引脚以进行额外降噪。我使用100nf电容器。


要将引用设置为供应使用:

    analogreference(默认);

......再次接下来......

    analogread(0); //可以是任何频道

此处找到模拟操作代码:
"C:/程序文件(x86)/ darduino/hardware/arduino/avr/cores/arduino/wiring_analog.c"

定义(#define)在这里:
C:/程序文件(x86)/ darduino/hardware/arduino/avr/cores/arduino/arduino.h

上面的Arduino代码(对于内部参考选择)将设置 寄存器如下(数据表部分:24.9.1控制器ADC多路复用器 Selection Register):

Acmux位7和6设置高(REFS1和REFS0)。
Ambux比特3..0设置为B1110。

注意:数据表状态:

"开关参考电压后的第一个ADC转换结果 源可能不准确,建议用户丢弃此 result."
 
(见Datasheet部分"24.5.2 ADC电压参考").

所以你应该扔掉第一个ADC结果。


新的! Comments

让你说到你刚刚阅读的东西!留下下面的框中的评论。




隐私政策 | 接触 | 关于我

网站地图 | 使用条款


ezoic.报告此广告

访问我们的Facebook页面:

   点击这里



最近的文章

  1. 如何使用ADS1115

    使用ADS1115精度16位ADC进行教程进行低功耗。

    阅读更多

  2. arduino.模拟输出...易模拟输出生成

    arduino.模拟输出:如何创建最精确的PWM模拟输出以及如何创建模拟PWM正弦波。

    阅读更多

  3. 数号和等效的快速宏。加快代码!

    了解DigitalWrite()的工作原理......现在使用17倍宏宏!

    阅读更多

  4. TCS230颜色传感芯片:如何运作以及如何使用它。

    如何使用TCS230(/ TCS3200)彩色检测器芯片并轻松将其添加到您的任何项目中。

    阅读更多

  5. 如何使用ADXL345进行运动感测等。

    使用ADXL345 Acellerometer,您可以检测到16G!您还可以了解如何使用它来点击检测等。

    阅读更多

  6. HMC5883L 3轴数字MAGENTOMTER如何运作

    HMC5883L - 如何制作数字罗盘,了解HMC5883L和QMC5883L之间的差异以及它们是否兼容。

    阅读更多



读者 Comments

"I wanted to thank
你这么好
对于所有信息
你已经提供了
你的网站's

高超极好的."

- 逃亡Potthath.

"This site really is
最好的和我最喜欢的。
我发现这里有很多很有用
项目和提示。"

- 米兰

Bursach.<at>gmail.com<

"Awesome site,
非常,非常容易和好
导航!"


-
镭_tr.<at>
wolf359.cjb.net.


学习微控制器

"Interested in
微控制器?"

注册
免费7天指南:

自由 GUIDE : CLICK HERE


"I am a newbie to PIC
我想说
 how great your
网站一直在为我。"


- 戴夫

de_scott.<at>bellsouth.net

"Your site is a great
和完美的工作。
恭喜。"


- SURESH.

IntegratedInfosys.<at>
Yahoo.com.

"I couldn't find the correct
要定义的词语
你的网页。

非常有用,揭开,
诚实明确。

非常感谢
你的时间和作品。
问候。"


- Anon.

回到顶部