Arduino能量监控器的制作

电子说

1.3w人已加入

描述

第1步:获取所需的硬件

要使所有这些正常工作,您当然需要一些硬件。由于我们正在使用Arduino来测量电流消耗并发送RF命令,因此我们需要一个Arduino来开始。

监控器

必需的硬件:

Arduino (Uno或Pro Mini)

非侵入式电流传感器

要定义电阻

射频发射器和接收器

原型:

面包板

面包板电线

最终版本:

烙铁

焊料

电线

当然,您可以选择不将所有内容都焊接在整齐的包装中。

步骤2:必需的软件

这与原型过程本身有关,而与制作抛光产品无关。开始编程,只是普通的Arduino IDE。由于我们不使用任何库,因此您无需再安装任何东西。

所需的软件:

Arduino IDE

第3步:查找电流传感器值

为获得最佳结果,我们将需要找到最适合电流传感器(CT传感器)的电阻。这是根据CT传感器的规格通过一些计算完成的。

第一步是找到这些值。您通常可以通过在您喜欢的搜索引擎中输入产品类型和品牌来找到它们。对于我来说,这将是我已经拥有的产品“ Talema AC1010”。

我们需要以下条件:

最大一次电流(RMS)

转动 ratio

此外,我们需要知道Arduino的工作电压。对于Arduino Uno,这将是5v。

总而言之,这就是我的值,对于参考非常有用:

最大一次电流: 60A

匝数比: 1000:1

Arduino电压: 5

步骤4:计算理想负载电阻

如果CT传感器是电流输出类型,例如Talema AC1010,则需要转换电流信号带有负载电阻的电压信号。如果是电压输出CT,则可以跳过此步骤,而忽略负载电阻,因为负载电阻已经内置在CT中。现在该开始记住高中的这些基础数学课了。

选择当前要测量的范围。 Talema AC1010的电流范围为0A至60A,因此在此示例中,我们选择60A作为我们的最大电流。

乘以√2将最大RMS电流转换为峰值电流:

Primary peak-current = RMS current × √(2) = 60A × 1.414 = 84.8A

将峰值电流除以CT的匝数即可得到次级线圈中的峰值电流。

Talema AC1010具有1000匝,因此次级峰值电流将是:

Secondary peak-current = Primary peak-current / no. of turns = 84.8A / 1000 = 0.0848A

为最大程度地提高测量分辨率,峰值电流时负载电阻上的电压应为Arduino模拟参考电压(AREF)除以2

使用的是在5V电压下运行的Arduino:AREF/2将为5 V/2 = 2.5 V,因此理想的负载电阻为:

Ideal burden resistance = (AREF/2) / Secondary peak-current = 2.5V / 0.0848A = 29.5Ω

29Ω不是常见的电阻值可以选择22Ω或33Ω。始终选择下一个较小的值,否则最大负载电流将产生高于AREF的电压。我建议使用33Ω±1%。在某些情况下,串联使用2个电阻会更接近理想的负载值。该值离理想值越远,精度将越低。在这种情况下,峰值电流将产生4.7V的模拟值(使用12位ADC进行模数转换后为3822)。

步骤5:开始编码,更多数学运算!

为使测量有效,我们需要计算代码中的某些先前值。这将为我们提供一个校准值。为此,我们需要再次使用Arduino电压,最大RMS,环路并使用负载电阻。确保用于计算的负担是您实际使用的电阻值。

首先,我们需要再次开始计算:

double primaryPeak = sqrt(2) * amps; // Peak RMS value.

double secondaryPeak = primaryPeak / loops; // Minimum RMS value.

_sensorVoltage = voltage; // Voltage at which Arduino is running at.

_sensorCalibration = (primaryPeak / secondaryPeak) / burden; // Calculate calibration value.

首先,我们计算初级和次级峰值。和以前一样我们保存电压供以后计算使用,然后通过将一次峰值除以二次峰值来计算校准值。之后,我们将该结果除以负载电阻值。

因为我的电阻器已经焊接到我使用的板上,所以我的计算结果为:0,078。在先前计算的负载电阻器计算的情况下,结果将为30,03。此值需要稍后重用。

现在是实际零件。忍受我,因为这听起来有点复杂,实际上相当容易。首先,我们需要定义采样率,这是完成测量的次数。好的采样率应该是1480。所有样本都将添加到样本中,然后除以样本数量。这将给我们一个平均值。

for (int i = 0; i 《 samples; i++) {

_sensorValue = analogRead(_sensorPin); // Value of current sensor value, used for calculations.

_calculationOffset = (_calculationOffset + (_sensorValue - _calculationOffset) / 1024); // Calculated offet value from sensor.

_calculationFiltered = _sensorValue - _calculationOffset; // Calculated filtered value from sensor.

_calculationSquare = _calculationFiltered * _calculationFiltered; // Square value from sensor.

_calculationSum += _calculationSquare; // Sumary of all values since last sample reset.

}

_sensorAmperage = _sensorCalibration * (_sensorVoltage / 10) * sqrt(_calculationSum / samples); // Calculated amperage value from sensor.

_calculationSum = 0; // Reset summary so that new sample can be made.

这将给我们带来稳定的安培功耗。您可以手动将此安培值转换为瓦数值。一个简单的方程式:

voltage * amps = wattage

当然,此电压是所连接设备的输入电压,通常为230v或110v。

步骤6:完成

从现在开始,您可以使用此值执行任何操作。以我为例,我正在连接一个射频发射器以发送“开”或“关”命令。

我可以理解,前面的代码解释有点短。为了让您的生活更轻松,我制作了一个Arduino库,制作了所有这些困难的方程式。您可以在我的GitHub上找到代码,具有以下链接:

https://github.com/FricoRico/ArduinoEnergy

责任编辑:wv 

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分