使用电流互感器和 Arduino 进行交流电流测量
2021-11-18
使用电流互感器和 Arduino 进行交流电流测量
电流互感器是一种专门设计用于在其次级绕组中变换交流电的仪器互感器,其产生的电流量与初级绕组中的电流成正比。这种类型的电流互感器设计用于无形地测量来自高压子系统或大量电流流经系统的电流。电流互感器的工作是将高电流量转换为低电流量,这可以通过微控制器或模拟仪表轻松测量。我们之前在不同类型的电流传感技术文章中解释了使用电流互感器进行电流测量。
在这里,我们将详细学习这种电流感应技术,并在Arduino的帮助下连接电流互感器以测量交流电流。我们还将学习确定未知电流互感器的匝数比。
电流互感器
正如我之前提到的,电流互感器是一种设计用于测量电流的变压器。上图显示了我目前拥有的两个互感器,称为窗口式电流互感器或通常称为铁心平衡变压器r。
电流互感器如何工作?
电流互感器的基本原理与电压互感器相同,与电压互感器一样,电流互感器也由初级绕组和次级绕组组成。当交流电通过变压器的初级绕组时,会产生交变磁通,此时次级绕组中会感应出交流电,如果您认为这是区别,您可以说它与电压互感器几乎相同.
通常,电流互感器在负载电阻的帮助下始终处于短路状态, 而且,流经次级绕组的电流仅取决于流经导体的初级电流。
电流互感器结构
为了让您更好地理解,我已经拆除了我的一个电流互感器,您可以在上图中看到。
从图中可以看出,一根非常细的导线缠绕在环形磁芯材料上,一组导线从变压器中出来。初级绕组只是一根与负载串联的单线,并承载流经负载的大电流。
电流互感器比
通过在电流互感器的窗口内放置一根导线,我们可以形成一个回路,匝数比变为 1:N。
与任何其他变压器一样,电流互感器必须满足如下所示的安匝比方程。
TR = Np / Ns = Is / Ip
在哪里,
TR = 传动比
Np = 初级匝数
Ns = 次级匝数
Ip = 初级绕组中的电流
Is = 次级绕组中的电流
要找到次级电流,将方程重新排列为
Is = Ip x (Np/NS)
如上图所示,变压器的初级绕组由一个绕组组成,变压器的次级绕组由数千个绕组组成,如果我们假设初级绕组流过 100A 的电流,则次级电流将为 5A . 因此,初级与次级之间的比率变为 100A 至 5A 或 20:1。因此,可以说初级电流是次级电流的 20 倍。
笔记!请注意,电流比与匝数比不同。
现在所有的基本理论都没有了,我们可以把注意力转回到计算手头电流互感器的匝数比上。
电流互感器误差
每个电路都有一些错误。电流互感器也不例外;电流互感器存在各种误差。其中一些描述如下
电流互感器中的比率误差
电流互感器的初级电流并不完全等于次级电流乘以匝数比。一部分电流被变压器的铁芯消耗,使其进入励磁状态。
电流互感器的相角误差
对于理想的 CT,初级和次级电流矢量为零。但在实际的电流互感器中,总会有差异,因为初级必须向磁芯提供励磁电流,并且会有很小的相位差。
如何减少电流互感器的误差?
始终需要减少系统中的错误以实现更好的性能。因此,通过以下步骤,可以实现
使用具有高磁导率和低磁滞磁性材料的磁芯。
负载电阻值必须非常接近计算值。
可以降低次级的内部阻抗。
反向计算电流互感器的匝数比
上图显示了测试设置,我用它来计算匝数比。
正如我之前提到的,我拥有的电流互感器 (CT) 没有任何规格或零件编号,只是因为我是从损坏的家用电表中抢救出来的。所以,此时我们需要知道匝数比才能正确设置负载电阻的值,否则系统中会引入各种问题,我将在后面的文章中详细介绍。
借助欧姆定律,可以很容易地计算出匝数比,但在此之前,我需要测量在电路中充当负载的 10W、1K 大电阻,并且还需要获得任意负载电阻来计算匝数比。
负载电阻
在上图中,可以看出使用了一个1.0313KΩ的电阻作为负载
负载电阻
上图显示了负载电阻值为 6784Ω
测试期间所有组件值的汇总
输入电压Vin = 31.78 V
负载电阻RL = 1.0313 KΩ
负载电阻RB = 678.4 Ω
输出电压Vout = 8.249 mV 或 0.008249 V
流过负载电阻的电流为
I = Vin / RL I = 31.78 / 1.0313 = 0.03080A 或 30.80 mA
所以现在我们知道输入电流,即0.03080A 或 30.80 mA
让我们找出输出电流
I = Vout / RB I = 0.008249 / 678.4 = 0.00001215949A 或 12.1594 uA
现在,要计算匝数比,我们需要将初级电流除以次级电流。
匝数比 n = 初级电流 / 次级电流n = 0.03080 / 0.0000121594 = 2,533.1972
所以电流互感器由2500 匝(四舍五入值)组成
笔记!请注意,这些错误主要是由于我不断变化的输入电压和万用表容差造成的。
计算合适的负载电阻尺寸
这里使用的 CT 是电流输出型。因此要测量电流,需要将其转换为电压类型。这篇文章,在openenergymonitor网站上,提供了一个关于我们如何做到这一点的好主意,所以我将遵循这篇文章
负载电阻 (ohms) = (AREF * CT TURNS) / (2√2 * 最大初级电流)
在哪里,
AREF = ADS1115 模块的模拟参考电压,设置为 4.096V。
CT TURNS = 次级匝数,我们之前已经计算过。
最大初级电流 = 将流过 CT 的最大初级电流。
笔记!每个 CT 的最大额定电流超过该额定值将导致磁芯饱和并最终导致测量误差的线性误差
笔记!家用电能表的最大额定电流是 30A,所以我选择这个值。
负载电阻(欧姆)= (4.096 * 2500) / (2√2 * 30) = 120.6 Ω
120.6Ω 不是一个常见的值,这就是为什么我要使用三个串联电阻来获得 120Ω 电阻值。将电阻连接到 CT 后,我做了一些测试来计算 CT 的最大输出电压。
测试后,观察到如果1mA电流通过电流互感器的初级,输出为0.0488mV RMS。据此,我们可以计算出如果 30A 电流流过 CT,输出电压将为30000 * 0.0488 = 1.465V。
现在,计算完成后,我已将ADC 增益设置为1x 增益,即+/- 4.096V,这为我们提供了 0.125mV 的满量程分辨率。有了这个,我们将能够计算出可以使用此设置测量的最小电流。结果是3mA,因为 ADC 分辨率设置为 0.125mV。
所需组件
写出所有没有表格的组件
号码 | 部分 | 类型 | 数量 |
1 | 计算机断层扫描 | 窗型 | 1 |
2 | Arduino纳米 | 通用的 | 1 |
3 | AD736 | 我知道了 | 1 |
4 | ADS1115 | 16 位 ADC | 1 |
5 | LMC7660 | 我知道了 | 1 |
6 | 120Ω,1% | 电阻 | 1 |
7 | 10uF | 电容器 | 2 |
8 | 33uF | 电容器 | 1 |
9 | 面包板 | 通用的 | 1 |
10 | 跳线 | 通用的 | 10 |
电路图
下图显示了使用电流互感器进行电流测量的连接指南
这就是电路在面包板上的外观。
电流测量电路结构
在之前的教程中,我向您展示了如何借助 AD736 IC准确测量真有效值电压,以及如何配置从输入正电压产生负电压的开关电容电压转换器电路,在本教程中,我们使用这些教程中的两个 IC。
对于这个演示,电路是在原理图的帮助下构建在无焊面包板上的;此外,直流电压是在 16 位 ADC 的帮助下测量的,以获得更好的精度。当我在面包板上演示电路以减少寄生时,我使用了尽可能多的跨接电缆。
用于电流测量的 Arduino 代码
这里 Arduino 用于将测量值显示到串行监视器窗口。但是只要稍微修改一下代码,就可以很容易地在 16x2 LCD 上显示这些值。在此处了解16x2 LCD 与 Arduino的接口。
可在本节末尾找到电流互感器的完整代码。这里解释了程序的重要部分。
我们首先包含所有必需的库文件。Wire 库用于 Arduino 和 ADS1115 模块之间的通信,Adafruit_ADS1015库帮助我们读取数据和向模块写入指令。
#include <Wire.h>#include <Adafruit_ADS1015.h>
接下来,定义用于从 ADC 值计算当前值的MULTIPLICATION_FACTOR。
#define MULTIPLICATION_FACTOR 0.002734 /* 计算实际当前值的因子 */Adafruit_ADS1115 广告;/* 将此用于 16 位版本 ADS1115 */
16 位 ADC 输出 16 位长整数,因此使用int16_t变量。使用了其他三个变量,一个用于存储 ADC 的 RAW 值,一个用于显示 ADC 引脚中的实际电压,最后一个用于将此电压值显示为当前值。
int16_t adc1_raw_value; /* 存储原始 ADC 值的变量 */浮动测量电压;/* 存储测量电压的变量*/浮动电流;/* 存储计算电流的变量*/
通过启用 9600 波特的串行输出开始代码的设置部分。然后打印设置的ADC的增益;这是因为超过定义值的电压肯定会损坏设备。
现在使用ads.setGain(GAIN_ONE);设置 ADC 增益; 将1位分辨率设置为 0.125mV的方法
之后,调用ADC begin方法,该方法在硬件模块和统计转换中设置所有内容。
无效设置(无效){ Serial.begin(9600); Serial.println("从 AIN0..3 获取单端读数"); //一些调试信息 Serial.println("ADC 范围:+/- 4.096V (1 bit = 2mV/ADS1015, 0.125mV/ADS1115)"); // ADC 输入范围(或增益)可以通过以下方式改变 // 功能,但注意不要超过 VDD +0.3V 最大值,或 // 如果调整输入范围超过上下限! // 错误地设置这些值可能会破坏您的 ADC! // ADS1015 ADS1115 // ------- ------- // ads.setGain(GAIN_TWOTHIRDS); // 2/3x 增益 +/- 6.144V 1 位 = 3mV 0.1875mV(默认) ads.setGain(GAIN_ONE); // 1x 增益 +/- 4.096V 1 位 = 2mV 0.125mV //ads.setGain(GAIN_TWO); // 2x 增益 +/- 2.048V 1 位 = 1mV 0.0625mV // ads.setGain(GAIN_FOUR); // 4x 增益 +/- 1.024V 1 位 = 0.5mV 0.03125mV // ads.setGain(GAIN_EIGHT); // 8x 增益 +/- 0.512V 1 位 = 0.25mV 0.015625mV // ads.setGain(GAIN_SIXTEEN); // 16 倍增益 +/- 0.256V 1 位 = 0.125mV 0.0078125mV ads.begin();}
在循环部分,我读取原始 ADC 值并将其存储到前面提到的变量中以备后用。然后将原始 ADC 值转换为电压值进行测量并计算电流值并将其显示到串行监视器窗口。
无效循环(无效){ adc1_raw_value = ads.readADC_SingleEnded(1); 测量电压 = adc1_raw_value * (4.096 / 32768); 当前 = adc1_raw_value * MULTIPLICATION_FACTOR; Serial.print("ADC 值:"); Serial.println(adc1_raw_value); Serial.print("测量电压:"); Serial.println(measured_voltae);Serial.println("V"); Serial.print("计算电流:"); Serial.print(val,5); Serial.println("A"); Serial.println(" "); 延迟(500);}
笔记!如果您没有 ADS1115 模块的库,则需要在 Arduino IDE 中包含该库,您可以在此GitHub 存储库中找到该库。
完整的Arduino代码如下:
#include <Wire.h>#include <Adafruit_ADS1015.h>#define MULTIPLICATION_FACTOR 0.002734 /* 计算实际当前值的因子 */#define ADC_MAX_VALUE 32768 /* ADC产生的最大值*/#define ADC_GAIN 4.096Adafruit_ADS1115 广告;/* 将此用于 16 位版本 ADS1115 */int16_t adc1_raw_value; /* 存储原始 ADC 值的变量 */浮动测量电压;/* 存储测量电压的变量 */浮动电流;/* 存储计算电流的变量*/无效设置(无效) { Serial.begin(9600); Serial.println("从 AIN0..3 获取单端读数"); //一些调试信息 Serial.println("ADC 范围:+/- 4.096V (1 bit = 2mV/ADS1015, 0.125mV/ADS1115)"); // ADC 输入范围(或增益)可以通过以下方式改变 // 功能,但注意不要超过 VDD +0.3V 最大值,或 // 如果调整输入范围超过上下限! // 错误地设置这些值可能会破坏您的 ADC! // ADS1015 ADS1115 // ------- ------- // ads.setGain(GAIN_TWOTHIRDS); // 2/3x 增益 +/- 6.144V 1 位 = 3mV 0.1875mV(默认) ads.setGain(GAIN_ONE); // 1x 增益 +/- 4.096V 1 位 = 2mV 0.125mV //ads.setGain(GAIN_TWO); // 2x 增益 +/- 2.048V 1 位 = 1mV 0.0625mV // ads.setGain(GAIN_FOUR); // 4x 增益 +/- 1.024V 1 位 = 0.5mV 0.03125mV // ads.setGain(GAIN_EIGHT); // 8x 增益 +/- 0.512V 1 位 = 0.25mV 0.015625mV // ads.setGain(GAIN_SIXTEEN); // 16 倍增益 +/- 0.256V 1 位 = 0.125mV 0.0078125mV ads.begin();}无效循环(无效) { adc1_raw_value = ads.readADC_SingleEnded(1); 测量电压 = adc1_raw_value * (ADC_GAIN / ADC_MAX_VALUE); 当前 = adc1_raw_value * MULTIPLICATION_FACTOR; Serial.print("ADC 值:"); Serial.println(adc1_raw_value); Serial.print("测量电压:"); Serial.print(measured_voltae);Serial.println("V"); Serial.print("计算电流:"); 串行打印(当前,5);Serial.println("A"); Serial.println(" "); 延迟(500);}
测试电路
用于测试电路的工具
2个60W白炽灯泡
Meco 450B+TRMS 万用表
为了测试电路,使用了上述设置。电流从 CT 流向万用表,然后返回主电源线。
如果您想知道 FTDI 板在此设置中的作用,让我告诉您板载 USB 转串口转换器不工作,所以我不得不使用 FTDI 转换器作为 USB 转串口转换器。
进一步增强
您在视频中看到的少数 mA 错误(如下所示)只是因为我在面包板上制作了电路,因此存在许多接地问题。
我希望你喜欢这篇文章并从中学到一些新东西。如果您有任何疑问,可以在下面的评论中提问,也可以使用我们的论坛进行详细讨论。
最新资讯
-
6 段电阻器颜色代码计算器
电阻器通过其带状颜色模式来识别。有 4、5 和 6 波段电阻器。要计算电阻器的电阻,您可以在上述电阻器颜色代码计算器中选择合适的色...
-
什么是泄放电阻器及其使用场所?
什么是泄放电阻器及其使用场所?泄放电阻器是标准的高值电阻器,用于对滤波电路中的电容器进行放电。电容器的放电非常重要,因为...
-
LED电阻计算器的工作原理
每个 LED 都有特定范围的工作电流,超过额定电流水平就会损坏。为了保护或限制电流,我们只需使用与其串联的电阻器。这个LED 电阻计...
-
上拉和下拉电阻
上拉和下拉电阻什么是电阻?电阻器是限流器件,在电子电路 和产品中大量使用 。它是一种无源元件,可在电流流过时提供电阻...
-
具有高精度反馈电压的同步降压 DC/DC 控制器提供最大的设计灵活性
R1260系列同步降压DC/DC控制器理光电子设备公司推出了一款降压 DC/DC 转换器控制器,该控制器可通过驱动外部高/低侧 N-MOSFET 产生 1.0V 至 1...
13510435585
服务热线:13510435585
联系电话:0797-4282799
公司邮箱:sales@tonevee.com
公司地址:江西省赣州市定南县良富工业区电子产业区5栋