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

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

功率计材料清单

Arduino Nano

LM358运放

7805

LCD1602

0.22欧姆2瓦电阻

10k可调电阻

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

0.1uF电容

测试负载

面包板

功率计电路图

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

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

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

测量单元

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

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

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

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

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

计算和显示单元

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

如上图所示,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);

完整测试代码

/*

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

}

arduino最大电压_制作Arduino功率计测量电压电流及功耗相关推荐

  1. arduino编码器计数_基于Arduino开发环境的光电编码器检测仪设计方案 - 全文

    0 引言 Arduino是一款基于单片机系统的电子产品开发平台,它的软硬件系统都具有高度的模块化,而且软件系统是完全开源的.其硬件系统也是高度模块化的,在核心控制板的外围有开关量输入/输出模块.各种模 ...

  2. arduino nano 蓝牙_用Arduino玩转掌控板(ESP32):ESP32概述与Arduino软件准备

    前言 近年来,掌控板(英文名:mPython)在创客教育中应用越来越广泛.掌控板集成了 ESP32 高性能双核芯片,具备 WiFi 和蓝牙连接功能,同时在板子上又配置了丰富的传感器,最重要的是它是专门 ...

  3. arduino 长传出错_请问Arduino IDE在编译时正常,却无法上传且显示找无效库是怎么回事?...

    开发板:"Arduino Nano atmega328p" 警告:库 Mozzi 中的分类 'audio' 不可用.设置为 'Uncategorized' 项目使用了 2750 字 ...

  4. arduino智能闹钟_【Arduino综合项目】小闹钟

    小闹钟项目 在额济纳支教这一年,给孩子们上了很多Arduino开发的课,也带他们完成了几个Arduino综合项目,下面陆续把这些小项目放上来,欢迎围观~~~非科班出身,C语言学的不好,望各路大神批评指 ...

  5. arduino灯光装置_用Arduino实现智能控制-夜间感应灯的制作

    教学基本信息 课名 用 Arduino 实现智能控制 - 夜间感应灯的制作 (一个单元两个课时) 是否属于 地方课程或校本课程 否 学科 信息技术 学段 第三学段 年级 初一 授课日期 2 指导思想与 ...

  6. arduino 读取模拟电压_基础部分-读取模拟电压

    这个示例展示了如何用模拟引脚0来读取模拟输入,用analogRead()来转换电压数值,之后把这个值输出在编译器的串口监视器上. 硬件需求 -Arduino控制板 -10K电位器 电路 上面的接线图是 ...

  7. arduino uno电压_了解Arduino UNO电路

    是的,我确实做到了.很难,花了我几天时间,但我做到了. 最后,这是一次很棒的体验,最令人惊讶的是Freeduino确实有效.我想与您分享我的经验. 什么是Freeduino? 它就是没有任何电路板的A ...

  8. arduino平衡车超声波_制作Arduino自平衡车(一)

    第一天 平衡车的配件都到货了,买了arduino pro mini 作为主控板,双电机买的是现成的,自带霍尔编码器,还有就是拜托靠点谱的mpu6050加速度计陀螺仪传感器,当然还有电机驱动,反正买回来 ...

  9. arduino灯光装置_基于Arduino的灯光秀

    步骤1:准备木制框架 您可以按照您希望的任何方式构建框架或外壳.我选择木材是因为仅需使用基本工具即可轻松完成工作. 我已使用一些已打捞过的木板来搭建框架.我在长度为30厘米的木板上标记了4个干净的零件 ...

  10. arduino 休眠 节能_优化arduino程序存储空间

    0x00 Abstract 我们一般在开发Arduino的程序时都是根据功能需求来编写代码,当经过测试后程序满足功能需求后就停止开发,剩下的就是只有在功能需求变更或代码中存在bug时才会再次动手修改代 ...

最新文章

  1. 23种设计模式(一)单例模式
  2. VINS紧耦合优化公式及代码解析
  3. java白钱买白_java实现百钱买白鸡
  4. JavaScript:改变li前缀图片和样式
  5. php链表和联表的区别,PHP_浅谈PHP链表数据结构(单链表),链表:是一个有序的列表,但 - phpStudy...
  6. 笔记本(华硕UL80VT)软件超频setFSB
  7. 【script】python自定义时间格式的几种情况
  8. VMware Workstation 与 Server 的区别
  9. 隐私安全保护再升级!苹果强制要求APP必须有删除账号功能
  10. Java中如何遍历Map对象(值得借鉴)
  11. sharepoint 2013 sp1 patch安装后的手工运行
  12. Umbraco中的Examine Search功能讲解
  13. mybatis使用collection查询集合属性规则
  14. Ubuntu下安装osu
  15. WPS宏插件使用教程
  16. xml--json代码大全
  17. ActiveMQ 停止 关闭 报错 ERROR: No or outdated process id in
  18. 错误 error C2220: 警告被视为错误 - 没有生成“object”文件 (..\..\src\caffe\util\math_functions.cpp)
  19. 傅里叶变换与不确定性
  20. 作者:曹丹星,就职于郑州商品交易所期货及衍生品研究所有限公司。

热门文章

  1. [RK3288][Android6.0] 调试笔记 --- 开机提示mmc rescan错误
  2. 微信小程序自定义屏幕调试
  3. 计算机软件系统验证报告,检验报告管理系统软件
  4. SEM 与 SEO 之间的区别与联系
  5. SpringBoot 通过阿里云的短信功能 实现发送手机验证码
  6. 给txt格式的文档增加目录
  7. PS美容磨皮插件:dr5白金版mac版(兼容ps2020)
  8. 安卓flash插件_谷歌Chrome 76稳定版正式发布:默认禁用Flash
  9. C++ stringstream 从字符串中分离单词
  10. java23种设计模式