放電器の作製の続きで(時間も少なく)進みは悪いが改良や苦労してる点など記録
シャント抵抗とオペアンプの組み合わせは楽ではない
平日は少し古い充電池で放電テストを行いながら調整していたら,正常そうな放電容量とならない事(例えば1600mAhの物が2000mAhとかになることがある)が判り,どこに問題があるのか悩むことに・・・
- プログラムの問題はない
- リファレンス電圧は問題なくバッテリー電圧値は正常
- 時間カウントも正常(1時間経過で誤差1秒未満だった)
- オペアンプのオフセット電圧も問題ではないようだ
となると,電流の測定が問題かと,そしてブレッドボードに置いたシャント抵抗が怪しい
さすがに0.01Ωのシャント抵抗をブレッドボードで使うと誤差が出るのだろう
別のボードでシャント抵抗とオペアンプを含む電流電圧回路を組み込みブレッドボードで使えるようにすることも考えたが,低抵抗だと電圧が乗らないので算出した電流値の変動が大きいこともあってシャント抵抗値を0.1Ωに変更することにして,手持ちの小さい(表面実装)0.1Ωのシャント抵抗をブレッドボードで使えるように加工する
ピンの間に半田付けした
0.1Ω(左),0.01Ω(右)
(しばらく確認した)結果,放電容量は若干の調整は必要だが大きな誤差は無くなった
だが使用した0.1Ωのシャント抵抗は0.2Wなので最大1.4Aが限界となり予定の仕様を超えるため0.15Ωの金属被膜抵抗を並列にして0.75Ωを作る
また正確な抵抗値を出しておきたいので4端子法で計測(低抵抗測定器が欲しいな)
そこでまた問題が・・・なんか値がおかしい,そう抵抗値が4倍以上も大きいのだ
0.075Ωのはずが,24.7(mV) ÷ 50.0(mA)= 0.494
0.01Ωのはずが,2.4(mV) ÷ 50.0(mA) = 0.048
放電容量の誤差は気にならない程少ないので4倍にもなることはない
原因が特定できず仕方なく再度確認してみたら,なんと!使用したブレッドボード(緑)の接触抵抗が酷かったことが分かった(これは注意)
上の緑のミニブレッドボードが異常なほど接触抵抗が酷い,下の(見え難いが)スケルトンのミニブレッドボードで再度計測したら正常に測定できた
(0.075Ω:0.078Ω,0.1Ω:0.112Ω,0.01Ω:0.012Ωという満足できる結果となる)
この緑のミニブレッドボードはaitendoで購入したプロトタイプシールドに付属していたボードで色がいまいちだったので使用せず手持ちのミニブレッドボード(白)と交換して空いていた物
現在実装しているブレッドボードは大丈夫だろうかとチェックしたら問題なくてほっとした
余談だがブレッドボードは白系がパーツを載せる時(載った時も)一番見易くてよい(スケルトンとか恰好は良いがピンとか観難い)
電池ボックスに注意
放電テストを行っていると正常な充電池の場合,表示している電流や電圧の変動が少ない事が判ってきた
また正常な放電流が表示できるようになってからだが,どんなに頑張っても1Aも放電できないこともあり,そんなはずはないのだけどな?っと充電池が劣化すると内部抵抗が悪くなるって記憶があるので内部抵抗測定を追加することを考えた
電池の内部抵抗測定とかかなり昔にやったことあるがもうやり方を覚えていない・・・で,調べてみて実験回路を作成して試験する
仕組みは充電池に抵抗器に繋いで電流を流した状態と流してない状態の電圧差で計算
①充電池の電圧をE(V)
②抵抗器の抵抗値をR(Ω)
③抵抗器に充電池を繋いで電流を流した状態の充電池の電圧をV(V)
④内部抵抗をr(Ω)として
r = R( E / V - 1) = R(E - V)/ V
試験できたので本体に組み込み
上は946mΩで合ってそうだが,下は4.91Ωで異常そう
最小は充電池が終わっていると思って放電試験してみたら正規の放電量だったので再度内部抵抗を計測すると正常
すったもんだの挙句,充電池をボックスで動かしたら内部抵抗が変動することをつきとめた
つまり電池ボックスの接触抵抗で正常な内部抵抗が測定できていない
そこで(どこかの記事で観た)端子に(銅)線を巻く対応を施したら劇的に改善することに(素晴らしい)
接触抵抗が1Ωもあれば1A放電できないし,充電池が電池ボックスに正常にセットされているか判断できるようになり,内部抵抗測定を実装したのは正解のようだ
現在の回路図
前回からの変更点
・放電用のトランジスタをFETからバイポーラに交換
PWMの±1に対する抵抗値の変動が大きいので変更
ON・OFFを繰り返すため電流測定に難ありなのでLPFは外していない
・充電部のLPFは必要ないので外す
ON・OFFで単位当たりの充電量を調整する
・R12の1Mの抵抗を追加
バッテリが無い時0Vになるようにプルダウン
・内部抵抗測定部を追加
・オペアンプのオフセット電圧取得ため入力を短絡(回路図にない)
モード選択画面でボタンを長押しで実行
充電回路の試験
別ボードで組み込み試験完了している
充電シーケンスは19秒充電し1秒待機で電圧確認を繰り返す(今後いろんなパターンを計画)
充電終了条件(以下のいずれか)
- 終止電圧になった場合
- 充電中に限界上限電圧を超えた場合
- 充電しても電圧が上がらなくなった場合
/* 充電プログラム(後に充放電器として統合)
*/
#define PIN_CHRGER 11 //充電コントロールピン
#define PIN_LED 13 //LEDピン
#define PIN_BTV A0 //バッテリー電圧測定
#define CHG_VOLT 1450 //充電終止電圧mV(25℃時)
#define CHG_UPPER 1600 //充電中最大限界電圧mV
//25℃程度の室温において充電終止電圧1.45V
//ニッケル水素電池電圧は温度が1℃上がるごとに約3mV低下(温度係数-3mV/℃)
#define CHG_ON_TIME 19000 //充電ON時間(ms)
#define CHG_OFF_TIME 1000 //充電OFF時間(ms)
#define CHG_MON_TIME 1000 //充電監視時間間隔
#define RDC_ANALOG 10 //analogReadの平均化カウント
#define REF_VOLT 5000 //mV
//電圧測定Pinから読込み(*1000のmV)
static int readVolt() {
int val = 0;
for(int i = 0; i < RDC_ANALOG; i++) {
val += analogRead(PIN_BTV);
}
val /= RDC_ANALOG;
return(map(val, 0, 1023, 0, REF_VOLT));
}
void setup() {
Serial.begin(9600); //Serial設定9600bps
pinMode(PIN_CHRGER, OUTPUT);
pinMode(PIN_LED, OUTPUT);
analogReference(DEFAULT);
pinMode(PIN_BTV, INPUT);
}
void loop() {
int volt = readVolt();
Serial.print("Volt: "); Serial.print(volt); Serial.print("mV ");
if(volt >= CHG_VOLT) {
//終了
Serial.println(" End.");
for(;;);
}
//充電
digitalWrite(PIN_CHRGER, HIGH); digitalWrite(PIN_LED, HIGH);
//監視
int n = 0;
do {
delay(CHG_MON_TIME);
Serial.print(">");
volt = readVolt();
} while(++n < (CHG_ON_TIME/CHG_MON_TIME) && volt < CHG_UPPER);
Serial.print(" Voltage after charging: "); Serial.print(volt); Serial.println("mV");
//
digitalWrite(PIN_CHRGER, LOW); digitalWrite(PIN_LED, LOW);
delay(CHG_OFF_TIME);
}
本回路で充電した充電池を放電して放電量も問題なし
今後の予定
単なる放電器を超えて充電池チェッカーツールになった
今後もしばらくは試行を続け,更に自動化した充電池チェッカープログラムを検討する予定
ニッケル水素充電池の放電時の挙動(追加)
放電テストなどで気付いた点など列挙しておく
- 新しい充電池は電圧,電流ともに安定して放電される
- 古い充電池で大容量(500mA以上)は放電できないがある程度の電流(400mA前後)なら長く放電できる
- 最初は少なめの放電流だが次第に放電流が増えていく古い充電池がある(定電圧放電使用で確認)