您可能要使用单片机来测量直流电压和电流的原因有很多。您可能正在监视发电机或太阳能电池板的输出,可能正在测量项目的电流消耗,或者可能要观察电池的充电和放电。
在本文中,将向您展示如何使用Arduino测量直流电压和电流。这里的技术适用于任何单片机,实际上,诸如ESP-32或SeeeduinoXIAO之类的设备实际上可以执行更好的DC电压测量,因为它们具有更高分辨率的模数转换器。
目录
1第1部分–直流
1.1引言
1.2测量直流电压
1.2.1模数转换器
1.2.2分压器
1.2.3参考电压
1.3用Arduino测量直流电压
1.3.1ArduinoHookup1–基本直流电压测量
1.3.2ArduinoSketch1–基本直流电压测量
1.3.3LM4040精密基准电压源
1.3.4ArduinoHookup2–使用LM4040进行直流电压测量
1.3.5ArduinoSketch2–使用LM4040进行直流电压测量
1.4测量直流电流
1.4.1接入与非接入技术
1.5用Arduino测量直流电流
1.5.1ACS712霍尔效应传感器
1.5.2ACS712霍尔效应传感器连接
1.5.3ACS712霍尔效应传感器代码
1.5.4AdafruitINA219电流和电压传感器
1.5.5AdafruitINA219电流和电压传感器连接
1.5.6AdafruitINA219电流和电压传感器代码
1.6结论
1.6.1资源
第1部分–直流在使用单片机测量电压和电流的第一部分中,我们将看到如何使用Arduino测量DC电压和电流。

图1
用单片机(或任何数字数据设备)测量直流电压需要使用模数转换器(ADC)。许多现代单片机(包括ArduinoUno)都具有内置ADC,这使得直流电压测量成为我们四项任务中最简单的一项。
模数转换器
模数转换器听起来确实很不错。它是一个接受模拟输入并产生数字输出的组件,该输出是输入电平的数字表示。

图2
此转换的准确性取决于几个不同的因素:
位数–这决定了转换器可以将输入分为多少“步”。步越多,输出就可以越细化。

图3
参考电压–转换器的最高值与其所施加的参考电压一样。这也决定了ADC在其输入端可以接受的最大电压。
图4
线性度–转换器需要具有线性输出,也就是说,转换器的输出读数每次增加都要增加相同的量。
许多单片机(例如ArduinoUno)都具有内置ADC。Uno有六个10位ADC,这意味着它们可以将输入分解为1024个离散步长(2的10的幂等于1024)。
其他单片机也具有内置ADC,其中一些具有比ArduinoUno更高的分辨率。借助ESP32和SeeeduinoXIAO,我们可以选择12位ADC,使它们能够将输入电压解析为4096步。
图5
分压器可以输入到ArduinoUnoADC的最大输入电压为5伏,而使用3.3伏逻辑的单片机甚至更低。显然,这有点不切实际,因为您可能想要测量超过此值的输入电压。
图6
为此,我们可以使用分压器,这是一个由两个电阻器构成的非常简单的电路。这样可以降低电压,并具有增加输入阻抗的额外好处,这意味着测量设备不会降低它正在尝试测量的电路的负载并使读数失真。
图7
您当然可以使用分立电阻构建一个分压器,实际上,如果您打算测量非常高的电压,则可能必须这样做。但是,如果您打算使用Arduino测量低于26伏的较低电压,则可以购买预制的分压器来完成这项工作。这些设备非常便宜,并使用精密电阻器来提供准确的读数。
我将在我们的实验中使用这些分频器之一。它由一个7.5k电阻和一个30k电阻组成。
参考电压如前所述,决定我们ADC精度的因素之一是其参考电压。
默认情况下,ArduinoUno使用其电源电压作为参考。该电压假定为5伏,可以从其USB端口或内部线性稳压器获得。
这些电压并不总是精确的,USB电压取决于计算机的电源以及USB电缆本身的长度和规格。当将线性稳压器与外部电源一起使用时,精度由该稳压器确定,精度也可能恰好在5伏之间。
只要电压在4.75到5.25伏之间,Arduino逻辑电路就可以正常工作。但是,当将其用作参考时,该差异会影响模数转换器的精度。
图8
ArduinoUno还能够使用连接到AREF引脚的外部参考电压。该参考电压不能超过5伏。
为了在代码中使用外部引用,您需要使用analogReference命令指定它。此命令使Arduino知道应使用AREF引脚上的外部基准而不是电源电压。
您会从上面的链接中注意到,实际上可以给AnalogReference提供多个参数,但是并非所有的单片机都支持它们:
默认值–使用单片机的电源电压作为参考。如果您未指定任何内容,则将使用此名称。
EXTERNAL–使用施加到AREF引脚的外部参考电压。
内部–一些单片机也具有内部精度基准。上面的链接对此进行了详细说明。
通过使用正确的外部参考电压,您可以改善ArduinoADC的性能。
使用Arduino测量直流电压
Arduino接线-1–基本直流电压测量
我们的第一个实验的连接非常简单:
图9
图10
如果您没有这些电阻,则可以使用几个电阻。我使用的分压器有两个电阻:
在“高端”上有一个30k电阻,用于输出和输入电压之间的连接。
输出和地之间的7.5k电阻。
这将使输入的电压降低约5倍。
如果要测量更高的电压,也可以计算自己的分压器。
ArduinoSketch1–基本直流电压测量这是我们用于直流电压测量实验的代码:
/*/*///DefineanaloginputdefineANALOG_IN_PINA0//FloatsforADCvoltageInputvoltagefloatadc_voltage=0.0;floatin_voltage=0.0;//Floatsforresistorvaluesindivider(inohms)floatR1=30000.0;floatR2=7500.0;//FloatforReferenceVoltagefloatref_voltage=4.096;//IntegerforADCvalueintadc_value=0;voidsetup(){//UseexternalvoltagereferenceanalogReference(EXTERNAL);//(9600);("DCVoltageTest");}voidloop(){//ReadtheAnalogInputadc_value=analogRead(ANALOG_IN_PIN);//DeterminevoltageatADCinputadc_voltage=(adc_value*ref_voltage)/1024.0;//Calculatevoltageatdividerinputin_voltage=adc_voltage/(R2/(R1+R2));//("InputVoltage=");(in_voltage,2);//Shortdelaydelay(500);}请注意,此代码大部分与上一个代码相同,它只有两个区别:
参考电压已设置为4.096。
用analogReference命令指定了一个外部电压参考。
因此,将此代码加载到Arduino并进行测试。
图14
我注意到比以前的代码有了很大的改进,这是可以预期的。
顺便说一句,您还可以使用LM4040来测试万用表的准确性。实际上,我对我的廉价数字万用表的精确度感到惊讶!
测量直流电流现在,我们已经了解了如何使用Arduino测量电压,现在我们将注意力转移到电流测量上。
测量电流通常涉及将电流转换成电压,然后可以像上面所做的那样使用ADC进行测量。有两种不同的方法可以完成此操作。
接入式和非接入式我们可以将当前的测量技术分为两类:接入式和非接入式。
与我们要测量其电流的电路串联。它是“接入性的”,因为其插入会稍微影响电路本身的性能,尽管这种影响通常相当微小。
非接入性方法不需要直接连接到电路。取而代之的是,测量电流在导体中产生的磁场。如果您已经看到(或拥有)这些钳流表,这就是它们的工作方式。
图15
大多数接入式方法使用低值电阻器,该电阻器与要测量其电流的电路串联。测量电阻两端的压降,并使用欧姆定律计算电流。
测量直流电流最常见的非接入性方法涉及使用霍尔效应传感器。将其放置在导体附近,以测量导体周围的磁场。该场强用于确定电流。
尽管可以获得不需要连接电路的霍尔效应传感器,但我们将使用的霍尔效应传感器确实可以作为导体,它所测量的场强在传感器的IC芯片内部。
用Arduino测量直流电流我们将使用接入性和非接入性这两种方法来测量Arduino的电流。我们将从一个非常普遍使用的非接入传感器ACS712开始。
ACS712霍尔效应传感器ACS712已经存在了很多年,实际上,它已被其他型号取代,并且不再用于新设计。但是,它仍然是普遍可用的,而且最重要的是,它非常便宜。
该霍尔效应电流传感器可用于直流和交流电流,尽管今天我们将重点介绍其与直流电一起使用。
该设备使用5伏电源供电,并输出与所测量电流成比例的电压。输入连接与输出隔离,因此可以安全地用于高压应用。
该传感器实际上有三种版本,它们可以测量的最大电流不同:
5安培
20安培
30安培
由于大多数模块没有标识它们正在使用哪个版本的标记,因此您可能需要直接查看ACS712芯片本身来确定这一点。
图16
在上面的示例中,您将看到这是20安培的版本。
当未检测到电流时,ACS712输出2.5伏的电压。高于此电压是正向流动的电流,而低于2.5伏电压则表明为负向电流。
由于该芯片有三个版本,因此需要使用“比例因子”来确定电流,如下所示:
图17
图示中还显示了确定电流的计算公式。
ACS712霍尔效应传感器连接这是我们将ACS712连接到ArduinoUno的方法:
图18
这是一个非常简单的连接,ACS712输出连接到Arduino模拟输入。
请注意,ACS712的输入连接未标有极性,因为它可以读取正电流和负电流。如果按照上面的图表进行连接,您的读数将为正。
ACS712霍尔效应传感器代码这是我们将使用ACS712霍尔效应电流传感器测量直流电流的代码:
/**///VariablesforMeasuredVoltageandCalculatedCurrentdoubleVout=0;doubleCurrent=0;//ConstantsforScaleFactor//UseonethatmatchesyourversionofACS712//constdoublescale_factor=0.185;//5Aconstdoublescale_factor=0.1;//20A//constdoublescale_factor=0.066;//30A//ConstantsforA/Dconverterresolution//Arduinohas10-bitADC,so1024possiblevalues//Referencevoltageis5VifnotusingAREFexternalreference//ZeropointishalfofReferenceVoltageconstdoublevRef=5.00;constdoubleresConvert=1024;doubleresADC=vRef/resConvert;doublezeroPoint=vRef/2;voidsetup(){(9600);}voidloop(){//Voutisread1000Timesforprecisionfor(inti=0;i1000;i++){Vout=(Vout+(resADC*analogRead(A0)));delay(1);}//GetVoutinmvVout=Vout/1000;//ConvertVoutintoCurrentusingScaleFactorCurrent=(Vout-zeroPoint)/scale_factor;//PrintVoutandCurrenttotwoCurrent=");("Vout=");(Vout,2);("Volts");("\tCurrent=");(Current,2);("Amps");delay(1000);}大部分代码涉及读取模拟输入电压并使用数学方法确定电流。
resADC变量是使用参考电压来计算的,在我们的连接中,参考电压为5伏。如果要构建更精确的传感器,则可以对其进行修改以使用我们之前使用的LM4040模块,如果要这样做,则需要相应地更改vRef的值。
还要注意,zeroPoint是由Arduino的电源电压确定的,而不是由电压基准确定的。如果您修改电路作为外部参考,则可以将其更改为2.50。
您需要确保已考虑ACS712比例因子,否则读数将毫无意义。我展示了此代码中使用的ACS712的20安培版本,但我还提供了其他两个版本所需的值。
在循环中,我们读取该值一千次,因此可以得到一个很好的平均值。然后,我们使用您之前看到的公式将电压读数转换为电流。然后我们将其显示在串口监视器上。
图19
将代码加载到您的Arduino并观察您当前的读数。我可以看到没有电流流过,仍然得到了一点读数,这可能是由于两个因素造成的:
基准电压为DEFAULT,使用LM4040模块之类的外部基准电压可能会有所帮助。
提供给ACS712的5伏电压可能也有一点偏离,从而影响了零点。
但是总的来说,它并没有太多的变化,因此这是一种测量直流电流的非常简单的方法(正如您将在以后的文章中看到的,交流电流也是如此)。
AdafruitINA219电流和电压传感器我们今天将要使用的最终传感器与迄今为止所见的其他传感器完全不同。
INA219传感器能够同时测量直流电压和电流。它也没有像我们到目前为止使用的其他设备那样的模拟输出,相反,该设备具有I2C输出。这使得它不仅适用于单片机,而且适用于微型计算机。
图20
它实际上有两种形式,一种是独立模块,另一种是与AdafruitFeatherwing处理器一起使用的。任一种都适合我们的实验。
此模块的一大优势是,它插入电路的“高端”而不是接地端,这是连接了多少个电压和电流显示模块。这使得它非常适合用作电压和电流显示。
该器件具有一个内部12位ADC,可测量高达3.2A的电流。它是一种接入式传感器,使用0.1欧姆的精密电阻器。如果您是真正的高手,则可以用另一个电阻器替换电阻器以更改量程!
INA219的工作电压为5伏特,可以由Arduino提供。
AdafruitINA219电流和电压传感器接线
这是我们将AdafruitINA219传感器连接到Arduino的方法:
图21
请注意,这是一个I2C器件,因此A4和A5引脚被用作SDA和SCL,而不是模拟输入。
AdafruitINA219电流和电压传感器代码为了使用此设备,您需要安装Adafruit提供的库。
在您的库管理器中搜索“AdafruitINA219”。您将得到一个结果,一个需要安装的库。如果您以前没有安装过某些依赖库,还将提示您安装它们,您将继续进行。
一旦安装了库,就可以运行Adafruit提供的示例代码。进入自定义库的示例,然后查找AdafruitINA219。
打开“getcurrent”代码,如下所示:
includeAdafruit__INA219ina219;voidsetup(void){(115200);while(!Serial){//willpauseZero,Leonardo,etcuntilserialconsoleopensdelay(1);}uint32_tcurrentFrequency;("Hello!");//InitializetheINA219.//Bydefaulttheinitializationwillusethelargestrange(32V,2A).However//youcancallasetCalibrationfunctiontochangethisrange(seecomments).if(!()){("FailedtofindINA219chip");while(1){delay(10);}}//Touseaslightlylower32V,1Arange(higherprecisiononamps)://_32V_1A();//Ortousealower16V,400mArange(higherprecisiononvoltsandamps)://_16V_400mA();("MeasuringvoltageandcurrentwithINA219");}voidloop(void){floatshuntvoltage=0;floatbusvoltage=0;floatcurrent_mA=0;floatloadvoltage=0;floatpower_mW=0;shuntvoltage=_mV();busvoltage=_V();current_mA=_mA();power_mW=_mW();loadvoltage=busvoltage+(shuntvoltage/1000);("BusVoltage:");(busvoltage);("V");("ShuntVoltage:");(shuntvoltage);("mV");("LoadVoltage:");(loadvoltage);("V");("Current:");(current_mA);("mA");("Power:");(power_mW);("mW");("");delay(2000);}有了库后,使用此传感器非常简单。在代码中,定义了一个名为“ina219”的对象,该对象的属性具有您需要的所有内容,而无需进行任何计算。当然,该代码还使用了ArduinoWire库,因为它是I2C设备。
代码打印出许多参数,包括电压,电流,功率以及电阻两端测得的实际电压。
图22
加载并查看,确保您的负载不超过3.2安培。您应该发现它工作非常有效,并且由于它使用自己的内部ADC,因此不受ArduinoADC参考电压的影响。
结论如您所见,使用Arduino测量DC电压和电流非常简单,您可以扩展这些代码以使用其他单片机。