锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

制作Arduino功率计测量电压电流及功耗

时间:2022-07-18 06:30:00 电压电流电阻电压乘电流

作为电子爱好者,我们经常依靠一些仪器来测量和分析电路。从简单的万用表到复杂的功率分析仪或DSOs,所有的仪器都有自己独特的用途。这些仪器大多是成品,我们可以根据具体需要购买。有时我们可能想自己做一个仪器。例如,当我们准备做一个太阳能光伏项目时,我们想计算负载的功耗,在这种情况下,我们可以使用它Arduino这样的微控制器平台构建了我们自己的功率计。

73fb3d226e869cde63ecc677406df2bc.png

构建自己的功率计不仅可以降低成本,还可以为我们提供更深入地了解测试功能的方法。例如,使用Arduino功率计可以轻松调整串口监控器上的监控结果,在串口上绘制图形,添加SD电压、电流和功率动记录电压、电流和功率值。

电源计材料清单

Arduino Nano

LM358运放

7805

LCD1602

0.22欧姆2瓦电阻

10k可调电阻

10k,20k,2.2k,1k电阻

0.1uF电容

测试负载

面包板

功率计电路图

下面是arduino功率计项目完整电路图:

b2c16ca8d32d8ea8becee485dfa893b8.png

为了便于理解,我们把arduino功率计电路分为两部分。电路的上半部分是测量单元,电路的下半部分是计算和显示单元。该电路的测量范围适用于0-24V,考虑到太阳能光伏电池的规格,电流为0-1A。电路的基本原理是计算负载消耗的能量,并在1602显示器上显示测量值。

接下来,我们将电路分为多个功能块,以便更清楚地了解电路是如何工作的。

测量单元

测量单元包含一个分压器,可以帮助我们测量电压;非反向操作放大器可以帮助我们通过电路测量电流。上述电路的分压部分如下:

31478de94afdefd28c9b8469a40fde18.png

输入电压为由Vcc正如前面所说,我们正在设计从0到24V电压范围内的电路。Arduino这种微控制器不能测量如此高的电压值,它只能测量0-5v电压。因此,我们必须使用0-24v的电压(转换)到0-5v。因此,我们使用分压电路,如下所示。k和2.2k电阻形成了分压电路,用下面的公式可计算出分压器的输出电压。

Vout = (Vin × R2) / (R1 R2)

电路图标记为Voltage电压可以从两个电阻之间获得,转换后的电压可以输入Arduino模拟针。接下来是电流测量单元。我们知道微控制器只能读取模拟电压,因此我们需要将电流值转换为电压。此时,可以通过在电路中添加电阻(并联)来实现。根据欧姆定律,它将降低电压值,这与流过它的电流成正比。这个值会很小,所以我们使用操作放大器来放大它。电路如下:

6cf8110199f819c9a4b54ea3d73737ed.png

分流电阻(SR1)的值是0.22欧姆。正如我们之前所说,我们设计了0-1A的测量电路,基于欧姆定律,我们可以计算出这个电阻的电压降,当最大的1A当电流通过负载时,其电压为0.2V左右。这个电压对于微控制器来说很小。我们使用操作放大器将电压从0开始.2V放大到更高。这个放大器的增益是21,0.2*21=4.2v。计算放大器增益的公式如下:

Gain = Vout / Vin = 1 (Rf / Rin)

在例子中,Rf的值是20k而Rin的值是1k,这样,我们就可以获得21的增益值。然后,将放大器的放大电压输入电阻1k和电容0.1uf组成的的RC过滤电路,过滤掉耦合噪声。最后,输入电压Arduino模拟针上。

测量单元的最后一部分是电压调节电路。由于实际输入的电压可能是可变的,因此Arduino运算放大器需要一个稳定的 5V来保证正常工作,因此我们用7805稳压模块并添加一个噪声电容来进行电压调节。电路如下:

d94165042b85b9a4fa31a56d44569058.png

计算和显示单元

在测量单元中,我们将电压和电流参数转换为0-5v,可使用Arduino模拟输入。现在,我们需要使用这些电压信号Arduino连接起来,连接1602液晶显示器Arduino这样我们就可以查看最终结果了。

c9043caa3b75ddc7097dee5573d9b43b.png

如上图所示,Voltage针与Arduino模拟针A3相连,而Current针连接到Arduino模拟针A4.1602液晶显示器的电源来自7805输出的 5 V,同时,其他1602信号针也将同时使用Arduino数字针连接4-bit同时,我们使用电位计(10 k)连接到1602的 Con 针用于调节LCD的对比度。

Arduino编程部分

讨论硬件后,现在轮到软件了。软件代码的基本思路是读取A3和A4上的模拟电压,计算电压、电流和功率值,最后显示LCD屏幕上。让我们把代码分成小段来解释。以及所有的Arduino一开始,程序是定义使用的引脚。在这种情况下,A3和A数字针3、4、8、9、10和11用于测量电压和电流Arduino进行交互。

int Read_Voltage = A3;

int Read_Current = A4;

const int rs = 3,en = 4,d4 = 8,d5 = 9,d6 = 10,d7 = 11LCD 连接针

LiquidCrystal lcd(rs,en,d4,d5,d6,d7);

included一个名为“liquid crystal头文件setup 函数,初始化LCD将串口显示文本设置为显示屏Arduino Wattmeter然后等两秒钟。代码如下:

void setup()

lcd.begin(16,2); ////Initialise 16*2 LCD

lcd.print(" Arduino Wattmeter");

lcd.setCursor(0,1);

lcd.print("-Circuitdigest");

delay(2000);

lcd.clear();

}

我们使用主循环函数analogread函数来读取A3和A4的电压值。Arduino ADC输出值为0-1203,因为它有10位ADC,这个值必须转换为0-5v,乘以(5/1023)可以完成。在硬件介绍部分,我们已经完成了0-24v到0-5v0-1a到0-5v转换。所以现在我们需要使用乘数将这些值恢复到实际值。它可以乘以乘数值。乘数值可以用硬件部分提供的公式计算,或者如果您已知电压和电流值,您可以实际计算。本例遵循后一种选择,因为它在现实中往往更准确。所以乘数值是6.46和0.因此,代码如下:

float Voltage_Value = analogRead(Read_Voltage);

float Current_Value = analogRead(Read_Current);

Voltage_Value = Voltage_Value * (5.0/1023.0) * 6.46;

Current_Value = Current_Value * (5.0/1023.0) * 0.239;

如何提高测量精度?

上述计算实际电压和电流值的方法可以很好地工作。但也有一个缺点,即测量ADC电压与实际电压的关系不是线性的,所以结果不是很准确。为了提高精度,我们可以使用已知的一组值来建立测量值ADC收集值,然后使用线性回归方法推导乘数方程。一旦我们计算了实际电压和实际电流值,我们就可以用公式计算功率(P=V*I)。然后使用以下代码LCD这三个值显示在上面。

lcd.setCursor(0,0);

lcd.print("V="); lcd.print(Voltage_Value);

lcd.print(" ");

lcd.print("I=");lcd.print(Current_Value);

float Power_Value = Voltage_Value * Current_Value;

lcd.setCursor(0, 1);

lcd.print("Power="); lcd.print(Power_Value);

完整测试代码

569a5a31eec9f84bd3a35a484a729dfc.png

/*

* Wattmeter for Solar PV using Arduino

* Dated: 2-10-2018

* Website: www.basemu.com

* Translation to:circuitdigest.com

* Power LCD and circuitry from the +5V pin of Arduino whcih is powered via 7805

* LCD RS -> pin 2

* LCD EN -> pin 3

* LCD D4 -> pin 8

* LCD D5 -> pin 9

* LCD D6 -> pin 10

* LCD D7 -> pin 11

* Potetnital divider to measure voltage -> A3

* Op-Amp output to measure current -> A4

*/

#include

int Read_Voltage = A3;

int Read_Current = A4;

const int rs = 3, en = 4, d4 = 8, d5 = 9, d6 = 10, d7 = 11;

LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {

lcd.begin(16, 2);

lcd.print(" Arduino Wattmeter");

lcd.setCursor(0, 1);

lcd.print(" With Arduino ");

delay(2000);

lcd.clear();

}

void loop() {

float Voltage_Value = analogRead(Read_Voltage);

float Current_Value = analogRead(Read_Current);

Voltage_Value = Voltage_Value * (5.0/1023.0) * 6.46;

Current_Value = Current_Value * (5.0/1023.0) * 0.239;

lcd.setCursor(0, 0);

lcd.print("V="); lcd.print(Voltage_Value);

lcd.print(" ");

lcd.print("I=");lcd.print(Current_Value);

float Power_Value = Voltage_Value * Current_Value;

lcd.setCursor(0, 1);

lcd.print("Power="); lcd.print(Power_Value);

delay(200);

}

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章