このリポジトリには、Arduino用のTruerms C ++ライブラリが含まれています。このライブラリを使用すると、ADC入力信号の平均値とRMS (ルート平均平方)または有効な値を計算することができます。このライブラリは、電圧と電流信号の両方からの実質的で見かけのパワーと力率を計算します。バージョン1.3から、エネルギー計量がプロジェクトに追加されました。
電流の電圧と電圧表現は、ADCの0-5V準拠電圧範囲内に測定量をスケーリングするために適切な入力回路を使用することにより、ArduinoのADCで測定できます。提供されたソリューションは、測定量をスケーリングするための簡単な方法を使用します。ユーザーは、AC入力電圧と電流のフルスケールのピーク間値を定義するだけです。測定された量の単位がボルトとアンペアで定義されると、計算された電力はWATTとWS(Joules)のエネルギーにあります。このライブラリは、他のプラットフォームに簡単に移植可能です。
次のライブラリクラスが実装されています。
AverageRmsRms2PowerPower2平均は、ADCからの多くの入力サンプル(通常)からの平均値を計算します。 RMSまたはRMS2は、信号とPOWER2のルート平均平方値を計算することを目的としています。
RMS2とPower2は、サンプルタイムスロットの処理負担を広めることにより、割り込みサービスルーチンで使用するとパフォーマンスが向上します。 1回のRMS取得実行(スキャン)のサンプルの数は、ウィンドウとして定義されます。 RMS2とPower2は、自動ベースライン復元オプションがオン(BLR_ON)にあるときに、1つの追加のサンプルタイムスロット(ウィンドウ長+1)を占有します。
次の方法が存在します:
begin()start()stop()update()update1()update2()publish() クイックスタートのために、ライブラリに付属のArduinoスケッチの例を確認してください。
これらは、実装を成功させるために従うべき手順です。
begin()で上記で定義されたクラスのインスタンスを初期化します。この方法は初期化のためであり、測定単位のスケーリング、サンプリングウィンドウのサイズ、使用されているADC(または入力信号)のビット数、および取得モード(連続スキャン/シングルスキャン)を設定するための入力が必要です。start()を呼び出して、取得を開始します。Power2のupdate() (またはupdate1() + update2() )を一定の速度で繰り返し呼び出します。publish()を呼び出して結果を取得します。 Power2クラスのupdate()はupdate1()とupdate2()に分割されます。 update1()最初に呼び出して、入力電圧とupdate2()からサンプルを処理して、入力電流またはVICA VERSA(電圧電流)からサンプルを処理する必要があります。サンプリング電圧と電流は通常、多重化されたADCの場合に順番に発生します。
クラスの平均使用の場合:
void begin(float range, unsigned char window, unsigned char nob, bool mode);
と:
range 、AC入力信号の最大予想フルスイング(ピーク間値)です。windowサンプルウィンドウの長さは、全部のサンプルで表されます。nobは、入力信号(ADCビット深度)のビット解像度です。事前定義された定数を使用します: ADC_8BIT 、 ADC_10BIT 、またはADC_12BIT 。mode 、モードを連続スキャンまたはシングルスキャンに設定します。既存の定数CNT_SCANまたはSGL_SCANを使用します。 void start(void);この方法は、連続スキャンおよびシングルスキャンモードの取得を開始します。
void stop(void);この方法は、買収を停止します。
void update(int instVal);現在のサンプル値を割り当てます。
void publish(void);最後の完了した取得の実行から結果を公開します。結果は、次に定義されている出力変数にあります。
公共の定義された変数は次のとおりです。
int instVal最後に取得したサンプルの値
float average - 平均値の結果
bool acquire - ステータスビット、スキャンが保留中の場合は真です。
クラスRMSまたはRMS2の使用:
void begin(float range, unsigned char window, unsigned char nob, bool blr, bool mode);
と:
range 、ACシグナルの最大予想フルスイング(ピーク間値)です。windowサンプルウィンドウの長さは、総数のサンプルで表されます。nobは入力信号のビット解像度です。通常、これはADCビット深度です。事前定義された定数を使用します: ADC_8BIT 、 ADC_10BIT 、またはADC_12BIT 。blr 、自動的にベースラインの復元機能をオンまたはオフに設定します。既存の定数BLR_ONまたはBLR_OFFを使用します。mode 、モードを連続スキャンまたはシングルスキャンに設定します。既存の定数CNT_SCANまたはSGL_SCANを使用します。 void start(void);この方法は、連続スキャンおよびシングルスキャンモードの取得を開始します。
void stop(void);この方法は、買収を停止します。
void update(int instVal);現在のサンプル値を割り当てます。
void publish(void);最後の完了した取得の実行から結果を公開します。結果は、次に定義されている出力変数にあります。
公共の定義された変数は次のとおりです。
int instVal blr_onのときにベースラインに復元された最後に取得したサンプルの値
float rmsVal RMS値の結果
int dcBias -ADCユニットのDCBIAS値。 BLR_ONの場合にのみ関連性があります
bool acquireステータスビット、スキャンが保留中の場合は真実
クラスの電力使用の場合:
void begin(float range1, float range2, unsigned char window, unsigned char nob, bool blr, bool mode);
と:
range1, range2電圧と電流のACシグナル(ピーク間値)の最大予想フルスイングです。windowサンプルウィンドウの長さは、総数のサンプルで表されます。nobは入力信号のビット解像度です。通常、これはADCビット深度です。既存の定数( ADC_8BIT 、 ADC_10BIT 、またはADC_12BITを使用します。blr 、自動的にベースラインの復元機能をオンまたはオフに設定します。既存の定数BLR_ONまたはBLR_OFFを使用します。mode 、モードを連続スキャンまたはシングルスキャンに設定します。既存の定数CNT_SCANまたはSGL_SCANを使用します。 void start(void);この方法は、連続スキャンおよびシングルスキャンモードの取得を開始します。
void stop(void);この方法は、買収を停止します。
void update(int instVal1, int instVal2);現在のサンプル値(電圧や電流など)を一度に割り当てます。
void publish(void);最後の完了した取得の実行から結果を公開します。結果は、次に定義されている出力変数にあります。
公共の定義された変数は次のとおりです。
int instVal1 blr_onのときにベースラインに復元された最後に取得したサンプル(電圧)の値
int instVal2 blr_onのときにベースラインに復元された最後に取得したサンプル(電流)の値
float rmsVal1 -rms value1(電圧)
float rmsVal2 -rms value2(current)
int dcBias1 -ADCユニットのDCBIAS1値。 BLR_ONの場合にのみ関連性があります
int dcBias2 -ADCユニットのDCBIAS2値。 BLR_ONの場合にのみ関連性があります
float apparentPwr見かけのパワー
float realPwrリアルパワー
float pf力率
float energy - ネットエネルギー
bool acquireステータスビット、スキャンが保留中の場合は真実
クラスPower2の使用:
void begin(float range1, float range2, unsigned char window, unsigned char nob, bool blr, bool mode);
と:
range1, range2電圧と電流のACシグナル(ピーク間値)の最大予想フルスイングです。windowサンプルウィンドウの長さは、総数のサンプルで表されます。nobは入力信号のビット解像度です。通常、これはADCビット深度です。既存の定数( ADC_8BIT 、 ADC_10BIT 、またはADC_12BITを使用します。blr 、自動的にベースラインの復元機能をオンまたはオフに設定します。既存の定数BLR_ONまたはBLR_OFFを使用します。mode 、モードを連続スキャンまたはシングルスキャンに設定します。既存の定数CNT_SCANまたはSGL_SCANを使用します。 void start(void);この方法は、連続スキャンおよびシングルスキャンモードの取得を開始します。
void stop(void);この方法は、買収を停止します。
void update1(int instVal);電圧に現在のサンプル値を割り当てます。
void update2(int instVal);現在のサンプル値を現在のサンプル値を割り当てます。サンプリングループでupdate1()とupdate2()交互に呼び出します。
void publish(void);最後の完了した取得の実行から結果を公開します。結果は、次に定義されている出力変数から入手できます。
公共の定義された変数は次のとおりです。
int instVal1 blr_onのときにベースラインに復元された最後に取得したサンプル(電圧)の値
int instVal2 blr_onのときにベースラインに復元された最後に取得したサンプル(電流)の値
float rmsVal1 -rms value1(電圧)
float rmsVal2 -rms value2(current)
int dcBias1 -ADCユニットのDCBIAS1値。 BLR_ONの場合にのみ関連性があります
int dcBias2 -ADCユニットのDCBIAS2値。 BLR_ONの場合にのみ関連性があります
float apparentPwr 、見かけの力
float realPwrリアルパワー
float pf力率
float energy - ネットエネルギー
bool acquireステータスビット、スキャンが保留中の場合は真実
Rms gridVolt;
void setup() {
...
gridVolt.begin(700, 40, ADC_10BIT, BLR_ON, CNT_SCAN);`
...
}
議論は意味します:
完全なADC範囲(0〜5Volts)は、700Vの信号ピーク間値を表します。これは、正弦波で350Vまたは247.5VRMの信号振幅に等しくなります。
RMSウィンドウは40のサンプルです。つまり、サンプリングレートが1000サンプル/秒で選択された場合、ウィンドウが2つの50Hzサイクルを覆うことを意味します。
ADCビット解像度は10ビット(Arduino UNO)です。
BLR_ONは、ベースラインの復元がオンになっていることを意味します。 ADCを使用してACシグナルをキャプチャするには、ADC入力回路にDCオフセット電圧を追加することにより、信号のゼロ値をADC-rangeのミッドポイントにシフトする必要があります。このオフセットは、取得したADC値から一定の値を差し引くことにより、その後ソフトウェアで修正する必要があります。この修正はBLR_ONで自動的に実行でき、キャリブレーションは必要ありません。図1では、青い線は、5Vの電圧スイングと2.5Vでバイアスされた最大スケーリングされた入力信号を示しています。緑色の線は、1Vの振幅を持つ入力信号を示し、1V/SQRT(2)= 0.71VRMSを測定します。

オプションCNT_SCANを使用すると、取得は連続モードに設定されます。取得は、最後のスキャンを完了した後に自動的に再起動します。
gridVolt.update(adcVal);メインループからまたは割り込みサービスルーチン(ISR)から。ループが一定の速度で繰り返されることを確認してください。
gridVolt.publish()で結果を取得し、rms値を取得します: float Voltage = gridVolt.rmsVal;
void loop() { // loop must run at 1kHz
...
adcValue = analogRead(AN0); // read the ADC.
gridVolt.update(adcValue);
counter++;
if(counter >= 500) { // publish every 0.5s
gridVolt.publish();
Voltage = gridVolt.rmsVal;
counter = 0;
}
...
while(loop_timer_not_expired) {1}
...
}
Measure_avg.inoこの例は、ADCで測定された信号の平均値を計算する方法を示しています。
Measure_rms.inoこの例では、ADC入力電圧のRMS値が決定されます。
AC_powermeter.inoこの例は、完全なAC電力測定アプリケーションを示しています。 2つのADCチャネルへの入力としての電流の電圧表現、電圧表現の両方が必要です。電圧と電流のRMS値、見かけの出力、実質力、力率を計算します。
AC_powermeter_advanced.inoこの例は、完全なAC電力測定アプリケーションも示しています。安定した測定値をより良くするために中断ベースで実行されます。電圧と電流は両方とも3kHzでサンプリングされます。 Arduino LEDが点灯すると、ADCクリップ(入力ピーク電圧が高すぎる)またはDCが範囲外にバイアスします。
Energy_metering.ino 、whの電圧、電流、実際の電力、および正味エネルギーを表示します。
Arduino ADCとAC高電圧をインターフェースする最も簡単な方法は、たとえばLEM USA IncのLV 25-p電圧トランスデューサーなど、電圧トランスデューサーを使用することです。現在のセンシングの場合、 LEMは電圧トランスデューサーと同じ利点を持つLEM_LA55-Pも製造しています。
個別のコンポーネントから入力スケーリング回路を構築することを好む場合、テキサスインスツルメンツの電圧ソースインバーターリファレンスデザインに属するアプリケーションノートtiduay6c.pdfに詳細な設計の説明が記載されています。警告に注意してください!提案された回路は、Arduinoの0〜5V範囲に簡単に適合させることができます。
常に、安全のために分離トランスを使用してください!
3相電力測定。
代替のArduino-Ide Sloeberを使用して、このライブラリの開発に多くの時間が節約されました。 Sloeberは、Eclipseの素晴らしいArduinoプラグインです。 Jantjeと彼の貢献者に感謝します!