如何使用电流互感器和Arduino进行交流电流测量

如何使用电流互感器和Arduino进行交流电流测量,第1张

  电流互感器是一种专门设计用于在其次级绕组中变换交流电的互感器,其产生的电流量与初级绕组中的电流成正比。这种类型的电流互感器旨在以不可见的方式测量来自高压子系统或大量电流流经系统的电流。电流互感器的工作是将大量电流转换为可通过微控制器或模拟仪表轻松测量的较低电流量。在这里,我们将详细学习这种电流传感技术,并在Arduino的帮助下连接一个电流互感器来测量交流电流

  电流互感器

如何使用电流互感器和Arduino进行交流电流测量,poYBAGL6AOOACO_lAARNWPzjyIQ093.png,第2张

  正如我之前提到的,电流互感器是一种用于测量电流的变压器。上面显示的我目前拥有的两个变压器称为窗式电流互感器或俗称的铁心平衡变压器r。

  电流互感器如何工作?

  电流互感器的基本原理与电压互感器相同,与电压互感器一样,电流互感器也由初级绕组和次级绕组组成。当交流电流通过变压器的初级绕组时,会产生交变磁通量,此时会在次级绕组中感应出交流电,如果您认为这就是区别,您可以说它与电压互感器几乎相同。

  通常,电流互感器在负载电阻的帮助下始终处于短路状态, 而且流过次级绕组的电流仅取决于流过导体的初级电流。

  电流互感器结构

如何使用电流互感器和Arduino进行交流电流测量,pYYBAGL6AN-AYUgdAAZF8sQ03So027.png,第3张

  为了让您更好地理解,我已经拆除了我的一个电流互感器,您可以在上图中看到。

  从图中可以看出,一根很细的电线缠绕在一个环形铁芯材料上,一组电线从变压器中出来。初级绕组只是与负载串联连接并承载流过负载的大电流的单根导线。

  电流互感器比率

如何使用电流互感器和Arduino进行交流电流测量,pYYBAGL6ANuAZK01AARbCP8TP9I135.png,第4张

  通过在电流互感器的窗口内放置一根导线,我们可以形成一个单回路,匝数比变为 1:N。

  与任何其他变压器一样,电流互感器必须满足如下所示的安匝比方程。

  TR = Np / Ns = Is / Ip

  在哪里,

  TR =传输比率

  Np = 初级匝数

  Ns = 次级匝数

  Ip = 初级绕组中的电流

  Is = 次级绕组中的电流

  要找到次级电流,请将等式重新排列为

  是 = Ip x (Np/NS)

  如上图所示,变压器的初级绕组由一个绕组组成,变压器的次级绕组由数千个绕组组成。如果我们假设100A的电流流过初级绕组,则次级电流将为5A 。 因此,初级与次级之间的比率变为 100A 到 5A 或 20:1。因此,可以说初级电流是次级电流的20倍。

  笔记!请注意,电流比与匝数比不同。

  现在所有的基本理论都结束了,我们可以将注意力转移到计算手头电流互感器的匝数比上。

  电流互感器错误

  每个电路都有一些错误。电流互感器也不例外。电流互感器存在各种错误。其中一些描述如下

  电流互感器的比率误差

  电流互感器的初级电流并不完全等于次级电流乘以匝数比。一部分电流被变压器的铁芯消耗以使其进入励磁状态。

  电流互感器的相角误差

  对于理想的 CT,初级和次级电流矢量为零。但在实际的电流互感器中,总会存在差异,因为初级必须向磁芯提供励磁电流,并且会有很小的相位差。

  如何减少电流互感器的误差?

  始终有必要减少系统中的错误以实现更好的性能。因此,通过以下步骤,可以实现

  使用具有高磁导率的磁芯和低磁滞磁性材料。

  负载电阻值必须非常接近计算值。

  可以降低次级的内部阻抗

  反向计算电流互感器的匝数比​

如何使用电流互感器和Arduino进行交流电流测量,poYBAGL6ANaAdaymAAW4uV2JuoU786.png,第5张

  上图显示了测试设置,我用它来计算匝数比。

  正如我之前提到的,我拥有的电流互感器 (CT) 没有任何规格或部件号,只是因为我是从损坏的家用电表中抢救出来的。所以,此时,我们需要知道匝数比才能正确设置Burden Resistor的值,否则系统会引入各种问题,我将在本文后面详细讨论。

  在欧姆定律的帮助下,匝数比可以很容易地计算出来,但在此之前,我需要测量作为电路负载的 10W、1K 大电阻,我还需要得到一个任意的负载电阻找出匝数比。

  负载电阻

如何使用电流互感器和Arduino进行交流电流测量,pYYBAGL6ANKAGnYHAAR7foo-2Og151.png,第6张

  负担电阻

如何使用电流互感器和Arduino进行交流电流测量,poYBAGL6AM-AUpzdAAU6z8QvUQY841.png,第7张

如何使用电流互感器和Arduino进行交流电流测量,pYYBAGL6AMuAKhUlAAYrRBZkuIA219.png,第8张

  测试期间所有组件值的汇总

  输入电压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,所以我选择这个值。

  负载电阻 (ohms) = (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。

  所需组件

  写所有没有表格的组件

如何使用电流互感器和Arduino进行交流电流测量,poYBAGL6AMWAE_qjAAAkyfdHTAA642.png,第9张

  电路原理图

  下面的示意图显示了使用电流互感器进行电流测量的连接指南

如何使用电流互感器和Arduino进行交流电流测量,poYBAGL6AMKAWmbZAAEa7ZpdAR8182.png,第10张

  这就是电路在面包板上的外观。

如何使用电流互感器和Arduino进行交流电流测量,pYYBAGL6AL6AHDPPAAT3g6A2KJ4965.png,第11张

  电流测量电路结构

  在之前的教程中,我向您展示了如何借助 AD736 IC 准确测量真有效值电压,以及如何配置开关电容电压转换器电路,该电路从输入正电压产生负电压,在本教程中,我们使用这些教程中的两个 IC。

  在此演示中,电路在原理图的帮助下构建在无焊面包板上;此外,直流电压是在 16 位 ADC 的帮助下测量的,以获得更好的精度。当我在面包板上演示电路以减少寄生时,我使用了尽可能多的跨接电缆。

用于电流测量的 Arduino 代码

这里 Arduino 用于将测量值显示到串行监视器窗口。但是只要对代码稍加修改,就可以很容易地在 16x2 LCD 上显示这些值。在此处了解16x2 LCD 与 Arduino 的接口

电流互感器的完整代码可在本节末尾找到。这里解释了程序的重要部分。

我们首先包含所有必需的库文件。Wire 库用于 Arduino 和 ADS1115 模块之间的通信,Adafruit_ADS1015库帮助我们读取数据并将指令写入模块。

 

#include 
#include 

 

接下来,定义用于从 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开始方法,该方法设置硬件模块中的所有内容并进行统计转换。

 

无效设置(无效)
{
  序列号.开始(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); // 16x 增益 +/- 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("计算电流:"); 序列号.print(val,5); Serial.println("A");
  序列号.println(" ");
  延迟(500);
}

 

笔记!如果您没有 ADS1115 模块的库,则需要在 Arduino IDE 中包含该库,您可以在此GitHub 存储库中找到该库。

完整的Arduino代码如下:

 

#include 
#include 
#define MULTIPLICATION_FACTOR 0.002734 /* 计算实际电流值的因子 */
#define ADC_MAX_VALUE 32768 /* ADC 产生的最大值*/
#define ADC_GAIN 4.096
Adafruit_ADS1115 广告;/* 将此用于 16 位版本的 ADS1115 */
int16_t adc1_raw_value; /* 存储原始 ADC 值的变量*/
浮动测量电压;/* 存储测量电压的变量*/
浮动电流;/* 存储计算电流的变量*/
无效设置(无效)
{
  序列号.开始(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); // 16x 增益 +/- 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("计算电流:"); Serial.print(current,5); Serial.println("A");
  序列号.println(" ");
  延迟(500);
}

 

  测试电路

如何使用电流互感器和Arduino进行交流电流测量,pYYBAGL6ALaAPawXAAYFRTFCR7k776.png,第12张

  用于测试电路的工具

  2个60W白炽灯泡

  Meco 450B+TRMS 万用表

  为了测试电路,使用了上述设置。电流从 CT 流向万用表,然后返回主电源线。

  如果您想知道 FTDI 板在此设置中的作用,让我告诉您板载 USB 到串行转换器不工作,所以我不得不使用 FTDI 转换器作为 USB 到串行转换器。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/dianzi/3001548.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-27
下一篇 2022-09-27

发表评论

登录后才能评论

评论列表(0条)

保存