0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何利用Arduino构建一个功率计

科技观察员 来源:八色木 作者:八色木 2022-04-12 16:23 次阅读

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

pYYBAGJVNrKAWcQgAAgM650SDEg747.png

构建自己的功率计不仅可以降低成本,还可以为我们提供更深入了解开发测试功能的途径。例如,使用Arduino的功率计可以很容易地调整串口监视器上的监控结果,可以在串口上绘制图形,可以添加SD卡在预定义的时间内自动记录电压、电流和功率的数值。

功率计材料清单

Arduino Nano

LM358运放

7805

LCD1602

0.22欧姆2瓦电阻

10k可调电阻

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

0.1uF电容

测试负载

面包板

功率计电路图

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

poYBAGJVNriAVo3jAALe0sBaDUI609.png

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

下面,我们再把电路分成多个功能块进行介绍,这样我们就能更清楚地了解电路是如何工作的。

测量单元

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

poYBAGJVNr2AICbpAAAihGVDlWg110.png

这里输入电压是由Vcc表示的,就像前面说的,我们正在设计从0到24V的电压范围的电路。但是像Arduino这样的微控制器无法测量如此高的电压值,它只能测量0-5v的电压。因此,我们必须将0-24v的电压(转换)到0-5v。这因此我们通过使用一个分压电路来实现,如下所示。10k和2.2k电阻形成了分压电路,用下面的公式可计算出分压器的输出电压。

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

电路图中标记为Voltage的电压可以从两个电阻中间获得,这个转换后的电压就可以被输入到Arduino的interwetten与威廉的赔率体系 针中。接下来就是电流测量单元,我们知道微控制器只能读取模拟电压,所以我们需要将电流的值转换成电压。这时,可以通过在电路中添加一个电阻(并联)来实现,根据欧姆定律,它会降低电压值,这与流过它的电流成正比。这样获得的值会非常小,所以我们用一个运算放大器来放大它。电路如下所示:

poYBAGJVNsKAQVFoAABuq9Zvf2U253.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稳压模块并添加一个噪声电容来进行电压调节。电路如下:

pYYBAGJVNsmASG_JAAAlt4JQjAw622.png

计算和显示单元

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

pYYBAGJVNs6Aeh5iAADaIVLZcE8175.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和A4针分别用于测量电压和电流,数字针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 = 11; //1602 LCD 连接针

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-5v的电压转换,以及0-1a到0-5v的转换。所以现在我们要用一个乘数把这些值恢复到实际值。可以通过将其与乘数值相乘来完成。乘数的值可以用硬件部分提供的公式来计算,或者如果你已知电压和电流值,你可以实际计算它。本例遵循了后一种选择,因为它在现实中往往更准确。所以乘数的值是6.46和0.239。因此,代码如下所示:

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);

完整测试代码

poYBAGJVNwWAchosAAWDO1I3Ta0450.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);
}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 功率计
    +关注

    关注

    2

    文章

    203

    浏览量

    29820
  • Arduino
    +关注

    关注

    188

    文章

    6469

    浏览量

    186970
收藏 人收藏

    评论

    相关推荐

    如何使用8051微控制器构建简单的数字温度

    有时,由于波动,人们发现很难从模拟温度读取温度。因此,在这里我们将使用8051微控制器构建简单的数字温度,其中LM35传感器用于测量
    的头像 发表于 11-21 16:38 3278次阅读
    如何使用8051微控制器<b class='flag-5'>构建</b><b class='flag-5'>一</b><b class='flag-5'>个</b>简单的数字温度<b class='flag-5'>计</b>

    请问下怎样去设计种基于Arduino功率

    怎样去设计种基于Arduino功率?怎样去设计Arduino功率
    发表于 07-26 06:18

    Arduino功率电路是如何工作的

    怎样去设计Arduino功率的完整电路?Arduino功率电路是如何工作的?
    发表于 09-29 08:46

    使用Arduino构建数字罗盘

    描述几个人用机器人威廉希尔官方网站 开发项目,其中大问题是确定他们的导航方向。换句话说,机器人在环境中移动,但系统不知道它的确切方向,这意味着它的导航过程。作为种解决方案,许多人采用GPS设备来辅助确定方向
    发表于 08-25 06:11

    利用IC构建简单的温度式电压指示

    利用IC构建简单的温度式电压指示 本应用笔记介绍了产生温度式电压指示的电路。该电路可以
    发表于 04-25 10:44 1015次阅读
    <b class='flag-5'>利用</b>IC<b class='flag-5'>构建</b>简单的温度<b class='flag-5'>计</b>式电压指示

    如何使用Arduino构建电子动画眼睛

    在这个项目中,我们将使用 Arduino 构建动画眼睛。在网上寻找新的项目创意时,我萌生了制作动画眼睛的想法,这个项目立即引起了我的注意。
    的头像 发表于 07-10 09:52 2595次阅读
    如何使用<b class='flag-5'>Arduino</b><b class='flag-5'>构建</b><b class='flag-5'>一</b><b class='flag-5'>个</b>电子动画眼睛

    使用Arduino设计壁挂式红外温度

    在这个项目中,我们将使用 Arduino 设计壁挂式红外温度,可以简单地固定在墙上并保持开启状态。
    发表于 08-09 16:54 2777次阅读
    使用<b class='flag-5'>Arduino</b>设计<b class='flag-5'>一</b><b class='flag-5'>个</b>壁挂式红外温度<b class='flag-5'>计</b>

    如何使用Arduino和OLED设计GPS车速表

     在这个项目中,我们将使用带有 OLED 显示屏的 NEO6M GPS 模块 构建Arduino GPS 速度
    发表于 08-09 17:01 5289次阅读
    如何使用<b class='flag-5'>Arduino</b>和OLED设计<b class='flag-5'>一</b><b class='flag-5'>个</b>GPS车速表

    如何制作Arduino pH

     在这个项目中,我们将制作Arduino pH ,并学习如何使用重力 pH 传感器和 Arduino 测量液体溶液的 pH 值。16x
    发表于 08-12 16:39 5242次阅读
    如何制作<b class='flag-5'>一</b><b class='flag-5'>个</b><b class='flag-5'>Arduino</b> pH<b class='flag-5'>计</b>

    使用RDA5807构建Arduino FM收音机

    在本教程中,我们将构建Arduino FM 接收器,并将其添加到我们的项目库中。我们将使用带有 Arduino 的 RDA5807 FM
    发表于 08-19 14:50 2w次阅读
    使用RDA5807<b class='flag-5'>构建</b><b class='flag-5'>一</b><b class='flag-5'>个</b><b class='flag-5'>Arduino</b> FM收音机

    使用Arduino和加速度构建简单且便宜的计步器

    在本教程中,我们将使用 Arduino 和加速度构建简单且便宜的 DIY 计步器。该计步器将计算脚步的数量并将其显示在16x2 LCD
    的头像 发表于 08-19 15:15 4820次阅读
    使用<b class='flag-5'>Arduino</b>和加速度<b class='flag-5'>计</b><b class='flag-5'>构建</b><b class='flag-5'>一</b><b class='flag-5'>个</b>简单且便宜的计步器

    如何使用Arduino构建无线门铃

     在这个项目中,我们将使用 Arduino 构建无线门铃。我们将有按钮,按下该按钮将无线
    发表于 08-19 15:57 1807次阅读
    如何使用<b class='flag-5'>Arduino</b><b class='flag-5'>构建</b><b class='flag-5'>一</b><b class='flag-5'>个</b>无线门铃

    如何使用MPU6050和Arduino构建数字量角器

    MPU6050是款 集成 了 IC 3 轴加速度和 3 轴陀螺仪的 单元。它还包含温度传感器和
    发表于 08-31 15:42 5542次阅读
    如何使用MPU6050和<b class='flag-5'>Arduino</b><b class='flag-5'>构建</b><b class='flag-5'>一</b><b class='flag-5'>个</b>数字量角器

    构建Arduino交通灯模块

    电子发烧友网站提供《构建Arduino交通灯模块.zip》资料免费下载
    发表于 12-13 10:39 0次下载
    <b class='flag-5'>构建</b><b class='flag-5'>一</b><b class='flag-5'>个</b><b class='flag-5'>Arduino</b>交通灯模块

    如何使用加速度构建基于Arduino的地震探测器

    采取预防措施。在这里,我们使用加速度ADXL335来检测地震前的振动。加速度ADXL335对所有三轴的振动和振动都非常敏感。在这里,我们正在 使用加速度
    的头像 发表于 01-25 15:57 1675次阅读
    如何使用加速度<b class='flag-5'>计</b><b class='flag-5'>构建</b><b class='flag-5'>一</b><b class='flag-5'>个</b>基于<b class='flag-5'>Arduino</b>的地震探测器