CTを使って電力を測る - ②試作と精度の確認

試作

前回の記事
ty-note.hatenablog.com
で大まかに仕様を決めたので、実際に回路を作って実験をしてみます。

ハードウェアは、以前の記事
ty-note.hatenablog.com
と同じ以下とします。

回路構成は以下とします。とりあえずの機能実証と精度確認が目的なので、表示機能は設けず、プログラム書き込みに使うUSB-シリアル変換基板を介してシリアルモニタでデータを受け取ります。Arduino IDEはよく出来ていて便利ですね。

Arduino IDEのサンプルコードは以下の通りです。
setup()でADS1015の初期設定と読み取りレジスタの指定を行った後、loop()で16.66msの間に取れるだけデータを読み取り、二乗平均の平方根を取って値を換算しシリアル通信で出力します。
コメントアウトしているFor文を実行すると、計算に使った全サンプルデータをCSVで吐き出します。

#include <Wire.h>
#define ADS1015_ADRS 0x48 // Device I2C ID

int data_L, data_H; // For receiving data from ADS1015
int i; // Number of samples
long data, buffer;
int measurement[200];
unsigned long t1,t2;
float Vrms, Watt; // For output

void setup() {

  Serial.begin(9600); // Start serial communication, 9600bps
  Wire.begin(); // Start I2C communication
  Wire.setClock(400000); // Set I2C data rate to 400kHz

  Wire.beginTransmission(ADS1015_ADRS);
  Wire.write(0x01); //Set target register, Config register
  Wire.write(B00000110); //Upper byte
  Wire.write(B11100011); //Lower byte
  Wire.endTransmission();

  Wire.beginTransmission(ADS1015_ADRS);
  Wire.write(0x00); // Set target register, Data register
  Wire.endTransmission();

  Serial.println("Init done");

}

void loop() {

  delay(500);
  i = 0;
  data = 0;
  Vrms = 0;
  buffer = 0;
  t1 = micros();

  do {

    Wire.requestFrom(ADS1015_ADRS,2);
    while(Wire.available()){
      data_H = Wire.read();
      data_L = Wire.read();
    }

    data_H = data_H << 8;
    measurement[i] = (data_H + data_L) >> 4;
    buffer = measurement[i];
    data = data + (buffer * buffer);

    i = i+1;
    t2 = micros();

  } while ((t2-t1)<16666);

  Vrms = data;
  Vrms = sqrt(Vrms / i) * 0.5;
  Watt = Vrms * 3;

  Serial.print("i=");
  Serial.print(i);
  Serial.print(",data=");
  Serial.print(data);
  Serial.print(",Vrms=");
  Serial.print(Vrms);
  Serial.print(",Watt=");
  Serial.print(Watt);
  Serial.print(",");

  // for (int j=0; j<i; j++){
  //   Serial.print(measurement[j]);
  //   Serial.print(",");
  // }  

  Serial.println("EndOfData");
}


実行すればシリアルモニタに以下が表示されます。

サンプル数は約140個取れており、ADS1015のサンプルレートを大幅に超えている(無駄に同じ値を読んでいる)ため問題ないと思います。

取得した波形

内部バッファmeasurement[i]に溜めたデータをシリアルモニタで出力し、Excelで波形にした結果が以下です。

スイッチングACアダプタを接続したとき。力率の悪そうな波形になっています。

gootのセラミックヒータ式はんだごてを追加で接続した場合。

一応きっちり1周期分取れているようです。所詮3300サンプル/秒なので、特にスイッチング電源などのピーク電流を取りこぼしている可能性もあり、数回はサンプルを取って平均するような動作がいいでしょう。

精度の確認

都合のいい測定器は持ち合わせていないので、比較対象としてサンワサプライワットチェッカーを使います。
www.sanwa.co.jp
かなり前に購入したものですが、これは皮相電力・有効電力を分けて表示できる(=力率の概念がある)優れものです。

いくつか手元の家電でチェックした結果が以下です。
当たり前ですが力率が高い機器ほど測定値とワットチェッカーの値が近く、力率の悪いスイッチング電源ではかなりの差(50W⇔80W)が出ています。

想定外だったのがエアコンです。インバータ式の2.2kW機で、Panasonicの最廉価グレードです。Panasonicはカタログで力率を書いていない(ダイキンは書いてある)ので仕様はわかりませんが、ワットチェッカーでは力率0.81となっています。ある程度運転が安定した状態で測定しているので、立ち上げ時などフルパワー近くで運転しているときはもう少しましなのかもしれませんが・・。エアコンによる冷暖房費、および同じ仕組みを使っているエコキュートの電気代は季節によっては大きなウエイトを占めるので、これが2割近い誤差を生むのはちょっと困りものです。

測定対象 自作メータ(W & VA) ワットチェッカー(W) ワットチェッカー(VA) 力率
セラミックヒータ・弱 615 643 647 0.99
セラミックヒータ・強 1067 1094 1085 0.99
ドライヤー・弱 600 580 828 0.69
ドライヤー・強 1110 1132 1136 0.99
スイッチングACアダプタ 80 50 91 0.55
エアコン(暖房) 710 578 711 0.81

以下は、それぞれの電流波形です。

セラミックヒータ 弱

セラミックヒータ 強

ドライヤー 弱
半波整流して50%出力にしているんですね・・

ドライヤー 強

ACアダプタ

インバータエアコン 暖房運転 立ち上げ時
思いのほか力率が悪いのは安物だからでしょうか。

まとめ

皮相電力での比較であればワットチェッカーとかなり近い(5%以内)の値が出ており、CTの電圧波形のRMSを測定しての電流換算は計算通り動作しているようです。
電子工作で商用100Vを直接触るのにちょっと抵抗があるので、力率をたとえば0.9で固定するなどして換算するしか手がないように思います。

CTでの電力計測は目途がついたので、次は電力量計算および多チャンネル測定に進みます。