試作
前回の記事
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アダプタ
インバータエアコン 暖房運転 立ち上げ時
思いのほか力率が悪いのは安物だからでしょうか。