风筝
发表于: 2018-9-5 17:18:48 | 显示全部楼层

作为电子工程师,我们总会需要依靠仪器仪表来测量和分析电路的工作状况。从简单的万用表到复杂的电能质量分析仪或DSO,一切都有自己独特的应用。这些仪表中的大多数都是现成的,可以根据要测量的参数及其精度购买。但有时候我们可能会遇到需要制作属于自己的仪表的情况。比如说你正在研究一个太阳能光伏项目,你想计算负载的功耗,在这种情况下我们可以使用像Arduino这样的简单微控制器平台制作我们自己的功率计。


制作自己的仪表不仅降低了测试成本,还为我们提供了简化测试过程的空间。比如,使用Arduino构建的功率计可以轻松调整以监控串口监视器上的结果,并在串口绘图仪上绘制图形,或添加SD卡以预定义的时间间隔自动记录电压、电流和功率值。听起来很有趣!?让我们开始吧......


所需的材料

●    Arduino Nano开发板

●    LM358运算放大器

●    7805电压调节器

●    LCD显示屏1602

●    测试负载

●    面包板

●    焊接套件


电路原理图

Arduino功率计的完整电路图如下:

Arduino-Wattmeter-Circuit-Diagram.png


为便于理解,Arduino功率计电路分为两个单元。电路的上部是测量单元,电路的下部是计算和显示单元。对于那些不熟悉这种类型电路的人来说,请参考标签。如+ 5V标签意味着标签所连接的所有引脚都应该被视为它们连接在一起。标签通常用于使电路图看起来整洁。


该电路设计适用于工作电压范围为0-24V、电流范围为0-1A的系统,同时考虑到太阳能光伏发电的规格。但是一旦理解了电路的工作原理,就可以轻松扩展范围。电路背后的基本原理是测量负载两端的电压和通过它的电流,以计算功耗。所有测量值将在液晶显示屏1602上面显示。


接下来让我们将电路分成小段,以便我们可以清楚地了解电路如何工作。


测量单位

测量单元包括一个用于帮助我们测量电压的分压器、一个带有非反相运算放大器的关闭电阻用于帮助我们测量通过电路的电流。上述电路的分压器部分如下所示:

Voltage-Divider-Circuit_1.png


这里输入电压由Vcc表示,如前所述,我们正在设计电压范围为0V至24V的电路。但像Arduino这样的微控制器无法测量如此高的电压值;它只能测量0-5V的电压。因此我们必须将0-24V的电压范围映射为0-5V。这可以通过使用如下所示的分压电路轻松完成。电阻器10k和2.2k一起形成分压器电路。可以使用以下公式计算分压器的输出电压。同样用于决定电阻的值,如果重新设计电路,可以使用我们的在线计算器计算电阻值。

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

映射的0-5V可以从标记为Voltage的中间部分获得。然后可以将该映射电压反馈到Arduino模拟引脚。


接下来我们必须测量通过LOAD的电流。我们知道微控制器只能读取模拟电压,因此我们需要以某种方式将电流值转换为电压。可以通过简单地在路径中添加一个电阻器来完成,根据欧姆定律,该电阻器将降低其上的电压值,该电压值与流过它的电流成比例。此电压降的值将非常小,因此我们使用运算放大器来放大它。其电路如下所示

Converting-Current-into-voltage-value-for-microcontroller.png


这里分流电阻(SR1)的值为0.22欧姆。如前所述,我们正在设计0-1A的电路,因此根据欧姆定律,我们可以计算出该电阻上的电压降,当最大1A电流通过负载时,电压降约为0.2V。这个电压非常小,微控制器可以读取,我们在非反相放大器模式下使用运算放大器将电压从0.2V增加到更高的电平,以便Arduino读取。


非反相模式下的运算放大器如上所示。放大器的增益设计为21,因此0.2 * 21 = 4.2V。下面给出了计算运算放大器增益的公式,如果您正在重新设计电路,也可以使用此在线增益计算器来获得电阻的值。

增益= Vout / Vin = 1 +(Rf / Rin)


在本例中,Rf的值为20k,Rin的值为1k,这样我们的增益值为21。然后将运算放大器的放大电压提供给RC滤波器,使用电阻为1k、电容为0.1uF的滤波器过滤任何耦合的噪音。最后,电压被反馈到Arduino模拟引脚。


测量单元中剩下的最后一部分是电压调节器部分。由于我们将提供可变的输入电压,我们需要一个稳定的+ 5V,以便Arduino和运算放大器工作。该稳压电压将由7805电压调节器提供。在输出端添加一个电容器以滤除噪声。

7805-Voltage-Regulator-Circuit.png


计算和显示单元

在测量单元中,我们设计了电路,将电压和电流参数转换为0-5V,可以反馈到Arduino模拟引脚。现在,在电路的这一部分,我们将这些电压信号连接到Arduino,并将液晶显示屏1602连接到Arduino,以便我们可以查看结果。其电路如下所示

Computation-and-display-unit-for-Arduino-Wattmeter.png


如图所示,电压引脚连接到模拟引脚A3,电流引脚连接到模拟引脚A4。 LCD由7805的+ 5V供电,并连接到Arduino的数字引脚,工作在4位模式。我们还使用连接到Con引脚的电位器(10k)来改变LCD的对比度。


编程Arduino

现在我们已经很好地理解了硬件,让我们打开Arduino并开始编程。该代码的目的是读取引脚A3和A4上的模拟电压并计算电压、电流和功率值,最后将其显示在LCD屏幕上。在页面末尾给出了完整程序,该程序可以用于上面讨论的硬件。接下来,代码被分成小片段并进行解释。


正如我们开始的所有程序,定义我们使用的引脚。本篇文章中,A3和A4引脚分别用于测量电压和电流,数字引脚3、4、8、9、10和11用于连接LCD和Arduino。

  1. int Read_Voltage  = A3;
  2. int Read_Current  = A4;
  3. const int rs = 3, en = 4, d4 = 8, d5 = 9, d6 = 10, d7 = 11; //Mention the pin number for LCD connection
  4. LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
复制代码

我们还包括一个名为 liquid crystal的头文件,用于将液晶显示器与Arduino连接。然后在setup函数中,我们初始化LCD显示屏并显示一个介绍文本为“Arduino Wattmeter”并等待两秒钟后再清除它。代码如下所示。

  1. void setup() {
  2.   lcd.begin(16, 2); //Initialise 16*2 LCD
  3.   lcd.print(" Arduino Wattmeter"); //Intro Message line 1
  4.   lcd.setCursor(0, 1);
  5.   lcd.print("-Circuitdigest"); //Intro Message line 2
  6.   delay(2000);
  7.   lcd.clear();
  8. }
复制代码

在主loop()函数中,我们使用模拟读取功能从引脚A3和A4读取电压值。我们知道Arduino ADC输出值为0-1203,因为它有一个10位ADC。然后必须将该值转换为0-5V,这可以通过乘以(5/1023)来完成。然后在前期的硬件中,我们已经将电压的实际值从0-24V映射到0-5V,电流的实际值从0-1A到0-5V。所以现在我们必须使用乘数将这些值恢复为实际值。这可以通过将其乘以乘数值来完成。乘数的值可以使用硬件部分中提供的公式在理论上计算,或者如果您有一组已知的电压和电流值,您可以实际计算它。我遵循了后一种选择,因为它实时更准确。所以这里乘数的值是6.46和0.239。因此代码如下所示

  1. float Voltage_Value = analogRead(Read_Voltage);
  2. float Current_Value = analogRead(Read_Current);

  3. Voltage_Value = Voltage_Value * (5.0/1023.0) * 6.46;
  4. Current_Value = Current_Value * (5.0/1023.0) * 0.239;
复制代码

如何更准确地测量?

以上计算实际电压和电流值的方法可以正常工作。但是存在一个缺点,即测量的ADC电压和实际电压之间的关系不是线性的,因此单个乘法器不会给出非常精确的结果,同样适用于电流。


因此,为了提高精度,我们可以使用已知的一组值绘制测量的ADC值与实际值,然后使用该数据绘制图形并使用线性回归方法导出乘数方程。、


最后,一旦我们计算出通过负载的实际电压和实际电流的值,我们就可以使用公式计算功率(P = V * I)。然后我们使用下面的代码在LCD显示屏上显示所有三个值。

  1. lcd.setCursor(0, 0);
  2. lcd.print("V="); lcd.print(Voltage_Value);
  3. lcd.print("  ");
  4. lcd.print("I=");lcd.print(Current_Value);

  5. float Power_Value = Voltage_Value * Current_Value;

  6. lcd.setCursor(0, 1);
  7. lcd.print("Power="); lcd.print(Power_Value);
复制代码

跳转到指定楼层
风筝
发表于: 2018-9-5 17:29:29 | 显示全部楼层

工作过程和测试

我使用了一个面包板来焊接所有组件,如电路中所示。我用螺丝端子连接负载和普通DC插座连接电源。 Arduino Nano开发板和LCD安装在面包板上,以便以后可以重复使用。


准备好硬件后,将Arduino代码上传到Nano开发板。调整微调电位器以控制LCD的对比度,直到您看到明确的介绍文本。要测试电路板,请将负载连接到螺钉端子连接器,将电源连接到插孔。该项目工作时,电源电压应大于6V,因为Arduino需要+ 5V才能工作。如果一切正常,您应该在LCD第一行看到负载上的电压值和显示的电流值,以及液晶显示屏第二行显示的计算功率,如下所示。

Arduino-Wattmeter-in-action.jpg


制作某些东西的有趣部分在于测试它以检查它将在多大程度上正常工作。要做到这一点,我已经使用12V汽车指示器气泡作为负载和RPS作为电源。由于RPS本身可以测量和显示电流和电压值,因此我们可以轻松地检查电路的精度和性能。是的,我还使用我的RPS来校准我的乘数值,以便接近准确的值。


这个基于Arduino的功率计项目有更多的升级功能可以添加,以提高自动数据记录的性能,如绘制图形、通知过电压或过电流情况等。所以保持好奇心,让我知道你会用它来做什么。


代码

本篇文章使用的完整代码如下所示:

  1. /*
  2. * Wattmeter for Solar PV using Arduino
  3. * Dated: 27-7-2018
  4. *
  5. * Power LCD and circuitry from the +5V pin of Arduino whcih is powered via 7805
  6. * LCD RS -> pin 2
  7. * LCD EN -> pin 3
  8. * LCD D4 -> pin 8
  9. * LCD D5 -> pin 9
  10. * LCD D6 -> pin 10
  11. * LCD D7 -> pin 11
  12. * Potetnital divider to measure voltage -> A3
  13. * Op-Amp output to measure current -> A4
  14. */



  15. #include <LiquidCrystal.h>  //Default Arduino LCD Librarey is included

  16. int Read_Voltage  = A3;
  17. int Read_Current  = A4;
  18. const int rs = 3, en = 4, d4 = 8, d5 = 9, d6 = 10, d7 = 11; //Mention the pin number for LCD connection
  19. LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

  20. void setup() {
  21.   lcd.begin(16, 2); //Initialise 16*2 LCD

  22.   lcd.print(" Arduino Wattmeter"); //Intro Message line 1
  23.   lcd.setCursor(0, 1);
  24.   lcd.print("  With Arduino  "); //Intro Message line 2

  25.   delay(2000);
  26.   lcd.clear();

  27. }

  28. void loop() {

  29. float Voltage_Value = analogRead(Read_Voltage);
  30. float Current_Value = analogRead(Read_Current);

  31. Voltage_Value = Voltage_Value * (5.0/1023.0) * 6.46;
  32. Current_Value = Current_Value * (5.0/1023.0) * 0.239;

  33. lcd.setCursor(0, 0);
  34. lcd.print("V="); lcd.print(Voltage_Value);
  35. lcd.print("  ");
  36. lcd.print("I=");lcd.print(Current_Value);

  37. float Power_Value = Voltage_Value * Current_Value;

  38. lcd.setCursor(0, 1);
  39. lcd.print("Power="); lcd.print(Power_Value);


  40. delay(200);
  41. }
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-24 02:59 , Processed in 0.047506 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表