電流測定を行う(12)
商用電源の電流測定(8)
実効値の算出
前回のスケッチでは、最初にキーの入力が要求されます。キーが押されると測定を開始します。
void loop()
{
if (inpdata=='m')
{
Serial.println();
Serial.println("Type m serial monitor start");
while (!Serial.available());
inpdata=Serial.read();
Serial.flush();
}
移動平均値の最大値、最小値を求める
測定結果が配列indata[ ]に保存されています。保存されたデータを基に移動平均値 sm15を計算します。最大値を格納する変数maxdataに初期値として十分小さな値を初期値としてセットします。最小値を格納する変数minidataには初期値として十分大きな値をセットしておきます。
正弦波のマイナス側の波形のマイナスのピーク値を検出するのですから、0を初期値としても問題ありません。移動平均の計算は250-15の回数繰り返します。
maxdata=0.0;
mindata=1000.0;
for (int i=0; i<(250-15); i++)
{
sm15=0.0;
移動平均の計算
具体的な移動平均の個々の計算値は次のスケッチで計算されます。
for (int j=0; j<15; j++)
{
sm15=sm15+(((indata[i+j]*5.00/1024)*1000-2500)/185.0);
}
sm15=sm15/15;
最大値、最小値のチェック
求められた移動平均値を最大値と最小値と比較し新しい最大値か最小値があれば置き換えます。
if( maxdata < sm15)
{
maxdata=sm15;
}
if (mindata > sm15)
{
mindata=sm15;
}
}
実効値を求める計算
実効値は次のLCDへの書き込み処理の中で計算し書き出しています。求められた電圧の最大値と最小値をMX=とMN=の見出しをつけてLCDに表示します。次に波形ピーク値を (最大値-最小値)/2 で求め、この電圧値から電流に変換しmAの見出しをつけて表示しています。単位はmAです。この値を1.414で除して実効値を求めています。その計算結果をRSMA=の見出しをつけて表示しています。
lcd.clear();
lcd.print("MX=");
lcd.print(maxdata);
lcd.print("MN=");
float vval=((maxdata-mindata)/2);
lcd.print(mindata);
lcd.setCursor(0,1);
int vval2=1000*vval;
lcd.print("mA=");
lcd.print(vval2);
lcd.print("RSMA=");
lcd.print((vval2-0)/1.414);
delay(500);
測定結果
30Wのはんだゴテに通電したときの電流値の測定結果を示します。Arduino IDEのシリアル・モニタでm以外の文字で答えると以後、0.5秒ごとに測定を繰り返します。
<神崎康宏>
今回利用したスケッチを次に示しておきます。
#include
LiquidCrystal lcd(2,3,4,5,6,7);
int anin055;
int ta=125;
int indata[250];
long intime[250];
long av_indata=0;
long av2_indata=0;
char inpdata='m';
float sm15;
float maxdata=0.0;
float mindata=100.0;
void setup(){
lcd.begin(2,16);
Serial.begin(9800);
}
void loop() {
if (inpdata=='m')
{
Serial.println();
Serial.println("Type m serial monitor start");
while (!Serial.available());
inpdata=Serial.read();
Serial.flush();
}
for (int i=0; i<250; i++){
indata[i]=analogRead(5);
intime[i]=micros();
}
maxdata=0.0;
mindata=1000.0;
for (int i=0; i<(250-15); i++){
sm15=0.0;
for (int j=0; j<15; j++){
sm15=sm15+(((indata[i+j]*5.00/1024)*1000-2500)/185.0);
}
sm15=sm15/15;
if( maxdata < sm15) {
maxdata=sm15;
}
if (mindata > sm15) {
mindata=sm15;
}
}
if (inpdata=='m'){
Serial.print("maxdata=");
Serial.print(maxdata);
Serial.print( " mindata=");
Serial.println(mindata);
for ( int i=0; i<250; i++){
Serial.print("i=,");
Serial.print(i);
Serial.print( ",indata=,");
Serial.print(indata[i]);
Serial.print(", time=,");
Serial.print(intime[i]);
Serial.print( ",V=,");
Serial.print(indata[i]*5.00/1024);
Serial.print(",ampere=,");
Serial.print(((indata[i]*5.00/1024)*1000-2500)/185.0);
Serial.print(", time=,");
Serial.println(intime[i]-intime[0]);
}
Serial.print("av_indata=");
Serial.print(av_indata);
Serial.print(" av2_indata=");
Serial.println(av2_indata);
}
lcd.clear();
lcd.print("MX=");
lcd.print(maxdata);
lcd.print("MN=");
float vval=((maxdata-mindata)/2);
lcd.print(mindata);
lcd.setCursor(0,1);
int vval2=1000*vval;
lcd.print("mA=");
lcd.print(vval2);
lcd.print("RSMA=");
lcd.print((vval2-0)/1.414);
delay(500);
}

アーデュイーノ互換マイコン・ボードを作る
レトロ・ラジオの製作へ誘う本
コメントする