シールバッテリの放電実験
投稿日 2011/05/29
シールバッテリの放電実験をやってみました。
バッテリは秋月で購入したWP8-12(LONG) 12V 8Ahです。
シールバッテリの充電で書いたように、
シールバッテリのおよその残量はVout x 70 - 800で計算できます。
この計算で行くと、
11.43V 0%
12.00V 40%
12.86V 100%
となります。これを信じれば12.86Vくらいに充電して12.00Vで使用を止めたら、容量の60%が使用可能で、寿命も長くなるのではないかと考えました。
容量の60%ということは8Ah x 0.6 = 4.8Ahですので、4.8Ahのバッテリとして扱うことになります。
今回は実験のためmbedで簡単な回路を組んでみました。
あらかじめシールバッテリの充電その2で書いたように、フル充電しておきました。
負荷抵抗は手持ちの18Ω+10Ωの28Ω。放電電流は12 / 28 = 0.429 約430mA流します。
負荷抵抗は熱くなるので、シリコングリスでアルミの板に張り付けました。
バッテリの端子電圧を8.2KΩと2.7KΩで分圧しmbedのAnalogInで観測し係数を掛けて端子電圧を計算します。AnalogInはMAX3.3Vです。分圧は3V付近になるように抵抗を選びます。12E系でいくつか考えられますが、高抵抗を選ぶと不安定になるので、8.2KΩ/2.7KΩ位が適当のようです。
バッテリの端子電圧が12V以下になったとき、リレーをOFFしてバッテリを解放します。
ただし1回検出しただけで止めると不安定ですので、10回連続して12V以下を検出したら解放するようにしました。
室温はLM60でを観測します。
以上を1秒毎(ちょっと細かいですが)に繰り返し観測し、SDにCSV形式で記録します。
SDにはカウント(開始からの経過時間)、端子電圧、室温を記録します。
24時間計測したら止まるようになっています。
LCDの表示は、上段にバッテリの端子電圧、残量%、室温
下段にカウンタ(経過時間)、電圧ローカウンタ、分圧抵抗2.7KΩの両端電圧
を表示します。電圧ローカウンタとは、連続10回、12V以下になったかどうかを表示します。
室温と端子電圧の変化は、SDメモリに.csv形式で保存します。終了したらパソコンのエクセルで読み込んでグラフ化します。
放電開始時の端子電圧:13.09V
放電電流:約430mA
12.0Vを下回った時点で放電終了としました。
放電終了時の端子電圧: 11.98V
放電開始から終了までの時間:約10時間
端子電圧が12V以下になった時点で放電終了ですので、容量の約60%を使用したことになります。
WP8-12は0.4A/20時間ですので、0.43A放電で60%使用すると約11時間使える計算になりますが、
今回は約10時間でした。ほぼ仕様通りと考えてよいと思います。
ちなみに11.98Vで放電を終了しましたが、24時間無負荷放置で12.04Vとなりました。
mbedは5900円もしますので、固定用途にはもったいないですね。そのうち8Pin PICで作ってみようかと思っています。
プログラムは以下のようになっています。
#include "mbed.h"
#include "TextLCD.h"
#include "SDFileSystem.h"
#define K 4.09 //Battery Out/AnalogIn
#define INTERVAL 1 //Sec
SDFileSystem sd(p5, p6, p7, p8, "sd" ); // mosi, miso, sclk, cs, name
DigitalOut Batt_sw(p15);
AnalogIn Batt_Sens(p16);
AnalogIn LM60(p17);
TextLCD lcd(p24, p26, p27, p28, p29, p30);
DigitalOut Batt_ok(LED1);
DigitalOut Batt_low(LED2);
Ticker sampling;
float batt_value, batt_volt, batt_life, temp;
int count, int_flag, low_count;
long count_stop;
void timer_int()
{
int_flag = 1;
temp = ((LM60.read() * 3.3) - 0.424) / 0.00625;
batt_value = (Batt_Sens.read() * 3.3) + 0.05;
batt_value = floor(batt_value * 100);
batt_value = batt_value / 100;
batt_volt = batt_value * K;
batt_life = 70.0 * batt_volt - 800;
if (batt_volt <= 12.0) { //12V or low?
if (++low_count > 10) { //Over 10 Counts
Batt_low = 1;
Batt_ok = 0;
return;
}
}
else {
Batt_ok = 1;
if (low_count > 0) low_count--;
count++;
}
}
int main() {
Batt_sw = 0;
Batt_ok = 0;
Batt_low = 0;
FILE *fp = fopen("/sd/wp8_12.csv", "w" );
if(fp == NULL) {
error("Could not open file for write\n" );
}
lcd.cls();
lcd.locate(0,0);
lcd.printf("Battery Checker" );
lcd.locate(0,1);
lcd.printf("430mA Load Test" );
wait(2.0);
lcd.cls();
count = 0;
count_stop = 86400; //24h
int_flag = 0;
low_count = 0;
fprintf(fp, "Count#,Temperature(c),Battery Out(v)\n" );
sampling.attach(&timer_int,INTERVAL);
Batt_sw = 1;
while(count <= count_stop)
{
if (int_flag == 1) {
lcd.locate(0,0);
lcd.printf("%5.2fv %2.0f%% %4.1fc", batt_volt, batt_life, temp);
lcd.locate(0,1);
lcd.printf("%5ds %2d %4.2fv", count, low_count, batt_value);
fprintf(fp,"%d,%4.1f,%6.3f\n", count, temp, batt_volt);
int_flag = 0;
if (Batt_ok == 0) goto __END;
}
}
__END:
Batt_sw = 0;
fclose(fp);
}
(JF1VRR)