gnuplot

2020年10月28日 (水)

データロガーのサンプリング日時出力形式

Arduino-UNO 12bit×4chアナログ データロガーほぼ完成
記しましたが、データをサンプルした日時の出力をどうした
ものかと悩んでおりました。
GNUPLOTに食わせるんで食わせやすい書式で、1日を越えた
記録でも扱いやすくというのが要求仕様。

GNUPLOTをあれこれ触ってみて、なんとかなりそうなんで、
単純にこうしておきます。
 『 d H:M:S data1 data2 data3 data4』
先頭のdは1から始まる経過日
H:M:Sは時分秒。
最初のデータは「 1 00:00:00 data1~」からスタート。

GNUPLOTに食わせるサンプルデータ。

1 00:00:00  0.00
1 06:00:00 0.20
1 12:00:00 0.40
1 18:00:00 0.60
2 00:00:00 0.80
2 06:00:00 1.00
2 12:00:00 0.80
2 18:00:00 0.60
3 00:00:00 0.40
3 06:00:00 0.20
3 12:00:00 0.00
3 18:00:00 -0.20
4 00:00:00 -0.40
4 06:00:00 -0.60
4 12:00:00 -0.80
4 18:00:00 -1.00
5 00:00:00 -0.80
5 06:00:00 -0.60
5 12:00:00 -0.40
5 18:00:00 -0.20

まず、GNUPLOTの「set xdata time」での処理。
こんなスクリプト。

set grid
set xdata time
set timefmt "%j %H:%M:%S" # 「%j」の範囲が1~366
set xrange [0:"6T0:0:0"] # この「T」で日を指定
set xtics 3600*12
set xlabel "\nDate/Time"
set format x "%1dday\n%H:%M"
set yrange [ -2:+2]
set ytics format "%4.2f"
set ytics 0.5
set key right top
plot "L1.txt" using 1:3 with lines lw 2 ti "Test"

結果のグラフ。 X軸の目盛が日と時分に。

Cap001

次が「time」を使わずに、plotコマンドに書式指定を
導入して、日、時、分、秒に分けて、秒数を計算します。
日は1から始まるんで「-1」してゼロスタートに。
それがこれ。
X軸を「時間」にしています。

#秒で読んでから時間に直してみる
# 1 12:00:00 1.000
# $1 $2 $3 $4 $5
set grid
set xrange [0:120]
set xtics 12
set yrange [ -2:2]
set ytics format "%4.2f"
set ytics 0.5
set key right top
plot "L1.txt" using (((($1-1)*3600*24)+($2*3600)+
($3*60)+($4))/3600):($5) '%lf %lf:%lf:%lf %lf'
with lines lw 2 ti "Test"

「plot」のところの「'%lf~」が入力文の書式指定。
$1が日、$2~$4が時分秒。
$5からデータ部を続けます。
「%lf」は小数点付の数値指定。
そのグラフ。 X軸の単位は「時」に。
Cap002
これで、まぁ、なんとかなりそうです。

※追記 10/30
gnuplotで文字列変数に入れてある文をコマンドとして差し込む方法(@を変数名の前に付ける)
を見ますと、長ったらしいし式を略して記せるとのこと。
しかし現用しているgnuplot4.6にはまだ搭載されてませんでした。
で、新しいgnuplotをダウンロード。
ちょっとテスト。
データ列をもう一つ増やして・・・

Yデータが一つだと。
  plot "L1.txt" using (((($1-1)*3600*24)+($2*3600)+($3*60)+($4))/3600):($5) '%lf %lf:%lf:%lf %lf' with lines lw 2 ti "Test"
二つになると、
  plot "L1.txt" using (((($1-1)*3600*24)+($2*3600)+($3*60)+($4))/3600):($5) '%lf %lf:%lf:%lf %lf %lf' with lines lw 2 ti "Test1" ,\
     "L1.txt" using (((($1-1)*3600*24)+($2*3600)+($3*60)+($4))/3600):($6) '%lf %lf:%lf:%lf %lf %lf' with lines lw 2 ti "Test2"
長い。
($6)に変わるのと%lfが増える。
それを、
  cc = "(((($1-1)*3600*24)+($2*3600)+($3*60)+($4))/3600)"
  cs = "'%lf %lf:%lf:%lf %lf %lf'"
として、プロット実行で
  plot "L1.txt" using @cc:($5) @cs with lines lw 2 ti "Test1",\
     "L1.txt" using @cc:($6) @cs with lines lw 2 ti "Test2"
と。
短くなります。

・・・ところが・・・
想定してる電文、
  1 00:00:00 1.084 0.262 0.000 0.000
  $1 $2 $3 $4 $5 $6 $7 $8
これだと、$nは1~8まで。

8つのデータを取り出してグラフにしようとすると、
gnuplotがこんなエラーメッセージで拒否。
 『format must have 1-7 conversions of type double (%lf)』
1~7の7コまでやで! 8コはあかん。っと。

※例
JIS C8708充放電中の電池電圧とLM35による温度出力。
取り込むとこんなデータが出てきます。

  経過時間 電圧 温度:LM35(10mV/度)
1 00:00:00 1.084 0.262 0.000 0.000
1 00:00:10 1.084 0.262 0.000 0.000
1 00:00:20 1.083 0.262 0.000 0.000
  :
1 04:06:00 1.479 0.269 0.000 0.000
1 04:06:10 1.479 0.268 0.000 0.000
1 04:06:20 1.479 0.268 0.000 0.000

10秒サイクルで取り込んで4時間あまり放置。
それをこんなgnuplotスクリプトでグラフ化。
~~~~~~~~~~~~~~~~~~~~~~~~~~~
#秒で読んでから分に直す
# 1 00:00:00 1.084 0.262 0.000 0.000
# $1 $2 $3 $4 $5 $6 $7 $8
set term wxt 0
set grid
set xrange [0:250]
set xtics 30
set yrange [0.8:1.8]
set ytics format "%4.2f"
set ytics 0.1
set y2range [10.0:60.0]
set y2tics format "%.1f"
set y2tics 10.0
set xlabel "経過時間(分)"
set ylabel "電圧(V)"
set y2label "温度(℃)"
set key right bottom
cc = "(((($1-1)*3600*24)+($2*3600)+($3*60)+($4))/60)" # 経過時間:分
cs = "'%lf %lf:%lf:%lf %lf %lf %lf'"
# $1 $2 $3 $4 $5 $6 $7 ($8がダメ)
plot "M10.txt" using @cc:($5) @cs with lines lw 2 ti "電圧",\
"M10.txt" using @cc:($6 * 100) @cs with lines lw 2 ti "温度" axes x1y2
~~~~~~~~~~~~~~~~~~~~~~~~~~~

出てきたグラフ。
21_20201030161301
  新しいgnuplot、これまでのと色がチョイ違います。

充放電電圧変化と電池側面の温度変化が2サイクル分。
-Δ検出の様子やその時の電池温度上昇が分かります。

チャートレコーダーのようにリアルタイムでは見られません。
けど、こまかいところを見ようとしたとき、データですんで
手があります。

※『set xdata time』だとこんなスクリプトに。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 1 00:00:00 1.084 0.262 0.000 0.000 memo...
# 1 2 3 4 5 6 7
set term wxt 0
set grid
set xdata time
set timefmt "%j %H:%M:%S"
set xrange [0:15000]
set xtics 1800
set format x "%H:%M"
set yrange [0.8:1.8]
set ytics format "%4.2f"
set ytics 0.1
set y2range [10.0:60.0]
set y2tics format "%.1f"
set y2tics 10.0
set xlabel "経過時間(時)"
set ylabel "電圧(V)"
set y2label "温度(℃)"
set key right bottom
plot "M10.txt" using 1:3 with lines lw 2 ti "電圧" ,\
"M10.txt" using 1:($4 * 100) with lines lw 2 ti "温度" axes x1y2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

短縮するための「@cc」や「@cs」は不要。
普通に書けます。
出てくるグラフはこんなの。
Cap001_20201031100601
「波」は同じですが、X軸の目盛が異なり「時:分」の
表現になっています。

とりあえず備忘録ということで。


| | コメント (0)

2020年3月12日 (木)

定電流回路の電流検出抵抗を試す

2020年2月17日:定電流回路の電流検出抵抗 で、電池の
充放電試験用定電流回路用電流検出抵抗の温度変化について
書きました。

その後・・・
「0.1Ω」の抵抗7種について、電流2Aと3Aを流した時の
抵抗値変化を調べてみました。
0.1Ωに2Aだと0.4W。
3Aにすると0.9W。
この電力で抵抗が発熱するわけです。

その熱で抵抗値が変化。 (たいていは値が大きくなる)
それが駆動電流の変化につながります。
変動の小さなものが理想ですが、抵抗の形状や材料により
その変動が変わります。
それを確かめてみました。

使ったのは「流し出し型の定電流回路」。
この「0.1Ω電流検出抵抗」を取り替えて、時間経過による
電流値変化を観察。
抵抗両端の電圧と出力電流から抵抗値を算出。
その変動10分間をグラフにしました。

使ったのは三和のテスター「PC700」を2台。
アダプタを使えばUSBでPCにつながります。
「光」で結合してるのでPCおよび各テスター間は
絶縁できるという仕掛けです。

実験中の様子
A2_20200312101201

右上の黒いのがFETのヒートシンク。
その下が出力負荷抵抗。
中央緑のが作った回路。
左に2台のテスター。

回路の拡大
A3_20200312101301

OP-AMPはMCP6072 。 入出力Rail-to-Rail。
こんな回路になってます。

A1_20200312101601
右上のR9が電流検出抵抗。
これをとっかえひっかえてテスト。
電流値はVR1で設定。
OP-AMPの電源がその基準になるので、その配線に注意です。
3A流すと、けっこう電圧ドロップしますんで。

これが調べた抵抗7種類。
C11j

5Wセメントと酸金のはパーツ箱のストックから。

RWM4X10 は昔々にデジキーで買った「ホウロウ巻線型」の3W。
カタログでは「Enamelled Wirewound Power Resistors」と。
温度係数が「+75 ppm/°C」とプラスであると明記されてます。
   普通は「±xx ppm/℃」っと表記

SMW5MPC74 は秋月で買いました。
MSR5 は先日の記事に出てきた「コの字状抵抗」。

さてその結果・・・ まずは電流2Aから。
Cap023
5Wセメント抵抗は10分経過してもまだ落ち着きません。

そして3A。 電流1.5倍で電力は2.25倍の0.9W。

Cap024

これを見ると、秋月で買ったMPC74がむちゃエエ。
この抵抗、全部で5つ買ったんで、個別の違いがあるか見てみます。

三和のテスター2台からこんなデータ列(CSV)が1秒ごとに得られます。
  (三和の専用ソフトが必要・・・ちょっと不便)
#セメント 5W 3A
00:00:04,3.018,DCA,,,300.2,DCmV,,
00:00:05,3.014,DCA,,,300.2,DCmV,,
00:00:06,3.011,DCA,,,300.2,DCmV,,
00:00:07,3.009,DCA,,,300.2,DCmV,,
00:00:08,3.007,DCA,,,300.2,DCmV,,
00:00:09,3.005,DCA,,,300.2,DCmV,,
00:00:10,3.004,DCA,,,300.2,DCmV,,

左端が測定開始からの経過秒数。時:分:秒。
電流値と測定レンジ、電圧値とレンジが続きます。

「GNUPLOT」のスクリプトがこんな具合。
「set datafile separator ","」で「CSV」に対応させます。

set title "電流を3A流した時の0.1Ω抵抗の抵抗値変化 (消費電力=0.9W)"
r1 = 300.2 / 3.018 # セメント5W (mV/A)
r2 = 300.3 / 2.958 # RWM4X10
r3 = 300.0 / 2.920 # SMW5
r4 = 300.3 / 2.985 # 酸金3W
r5 = 300.4 / 2.948 # 酸金5W
r6 = 300.3 / 3.011 # MSR5
r7 = 300.1 / 2.954 # MPC74
set term wxt 0
set datafile separator ","
set xrange [0:10]
set yrange [-0.5:2.0]
set xlabel "経過時間(分)"
set ylabel "抵抗値変化(%)"
set grid
set xtics 1
set ytics 0.5
set ytics format "%+3.1f"
set key right bottom
plot "3A_cmt5W.txt" using ($0/60):(100*((($6/$2)-r1)/r1)) with lines lw 2 smooth bezier ti "セメント5W",\
"3A_RWM4X10.txt" using ($0/60):(100*((($6/$2)-r2)/r2)) with lines lw 2 smooth bezier ti "RWM4X10",\
"3A_SMW5.txt" using ($0/60):(100*((($6/$2)-r3)/r3)) with lines lw 2 smooth bezier ti "SMW5",\
"3A_sk3W.txt" using ($0/60):(100*((($6/$2)-r4)/r4)) with lines lw 2 smooth bezier ti "酸金3W",\
"3A_sk5W.txt" using ($0/60):(100*((($6/$2)-r5)/r5)) with lines lw 2 smooth bezier ti "酸金5W",\
"3A_MSR5.txt" using ($0/60):(100*((($6/$2)-r6)/r6)) with lines lw 2 smooth bezier ti "MSR5",\
"3A_MPC74.txt" using ($0/60):(100*((($6/$2)-r7)/r7)) with lines lw 2 smooth bezier ti "MPC74"

いちばん最初の電圧電流から初期抵抗値を求めて、この値からの
変動を「%」で得ます。

「$0」はデータ列の順番。1行1秒なので1/60して分に。
「$6」「$2」はCSVのデータ順で、「$6」が電圧(mV)で
「$2」が電流(A)。


※追記
5つある「MPC74 0.1Ω」、これを「3A」で試してみました。
結果
Cap025_20200312141201

通電を開始して最初の5分間だけの変動ですが、むちゃイイ。
こうなると、「これの他の抵抗値はどうや?」を調べたくなります。
あと、通電後の表面温度変化も。
応答が良い温度センサーとなると熱電対なんですが、手持ちのは
表示だけしかできません。
シリアルで数値出力、あるいはアナログ出力できる熱電対対応
温度計を作らなあかんかなぁ。

※追記
MPC74・0.1Ω、1つ割ってみました。
11_20200313162401
板状の抵抗体になっていました。

一般的なセメント抵抗の中身はこちらを↓
2006年12月11日:壮絶死#2 5W51Ωと1Ω
2009年07月02日:壮絶死#6 10W10Ω
2009年07月07日:壮絶死#8 10W10Ω
2014年11月28日:壮絶死:裸になったセメント抵抗



| | コメント (1)