2013年12月31日火曜日

Ni-MH充電器の製作(7)


毎回更新が遅れまして申訳ありません。

今回は、出来上がったプログラムが、仕様通りに動作するかテストを行います。
また、コントローラ部基板のパターン検討まで行います。

※ 部品の実装までは、年内に完了しませんでした。重ね々申訳ありません。


7 テスト・デバッグ

7.1 テスト仕様

出来上がったプログラムが、仕様通りに動作するかテストを行い、不具合箇所を修正します。

テストで重要な要素は、実装した機能全てを、漏れなく評価することです。
そのための基準として、前回 6.1項で示したステータス遷移表を使います。

当該図表を、改めて以下に示します。

トリガー
STARTボタン押下
充電完了
電池取り外し
ステータス
「設定中」「充電中」遷移
「充電中」「設定中」遷移「設定中」遷移「設定中」遷移

I/O要素
電流設定キー
電圧設定キー
STARTキー
電流設定LED
電圧設定LED
充電中LED
ステータス
「設定中」設定値をサイクリックに変更設定値をサイクリックに変更(上記通りにより略)設定値の変更に従い、該当LED点灯設定値の変更に従い、該当LED点灯消灯
「充電中」キー無効キー無効(上記通りにより略)該当LED点灯維持該当LED点灯維持一定間隔で点滅

充電実行においては、「電池の種類(充電電流)」・「電池の本数」の全ての組み合わせについて、終止電圧まで充電し、正しく終了するか確認します。
組み合わせを表にしたものを、以下に示します。

本数 \ 充電電流75mA130mA200mA240mA
1本1.38V※
2本2.76V※
4本5.52V※

※(充電電流)で充電を続け、(1.38V × 本数)に達したら、「設定中」ステータスに戻ること。

お詫びと訂正
これまで、充電終止電圧の値が記述ごとに異なっておりました。
仕様上の終止電圧「1.4V」から、今後、誤差や個体差の安全をみた値「1.38V」に定めます。

上記より、「設定中」ステータスにおいては「ステータス遷移表」を使い、「充電中」ステータスについては、上記組み合わせ表を使ってテストを行いました。


7.2 テスト冶具

テストにおいて、いきなり電池を繋ぐのは危険です。
まずは、ダミー抵抗を接続し、その抵抗値を手動で変化させて、充電中~完了状態を再現することにします。
この機能を実現するために、可変抵抗を使ったテスト用冶具を作成しました。

可変抵抗は、スピーカ用のアッテネータ(8Ω二連 = 16Ω)を流用し、以下写真の通り、クリヤケースに実装してみました。


※ 他の端子や穴は、将来、実験用電源を追加実装することを予定して設けたものです。

次に、各条件で必要な抵抗値を算出します。
仮に充電開始電圧を 0.9V とすると、各条件での抵抗の下限値は、

・0.9V × 本数 / 充電電流 ・・・ ①

抵抗の上限値は、終止電圧を用いて、

・1.38V × 本数 / 充電電流 ・・・ ②

①②より、各条件で必要な抵抗値の範囲を以下に示します。

本数 \ 充電電流75mA130mA200mA240mA
1本12Ω ~ 18Ω7Ω ~ 11Ω5Ω ~ 7Ω4Ω ~ 6Ω
2本24Ω ~ 37Ω14Ω ~ 21Ω9Ω ~ 14Ω8Ω ~ 12Ω
4本48Ω ~ 74Ω28Ω ~ 42Ω18Ω ~ 28Ω15Ω ~ 23Ω

※ 抵抗値は、計算結果を四捨五入で整数にしています。
※ アッテネータの抵抗値(16Ω)を超えるケースでは、直列に固定抵抗を繋いで対処します。


7.3 テスト結果

誤動作やフリーズなどの重欠点はありませんでしたが、以下に示す問題があり、それぞれ対処方針を決めました。

① 充電終了後、抵抗値を下限に戻し、充電開始すると、すぐに充電終了する。

抵抗値を下限にもどさなければ( = 満充電状態のまま)、すぐに充電終了するのが正常であり、問題ではありませんが、下限に戻す( = 電池を入れ替える)ならば、本来、充電中に遷移すべきです。

これは、DC-DCコンバータのコイル及び出力コンデンサに電荷が蓄積されたままであることが原因です。
これらの電荷が放電するためには時間がかかりますが、実使用では、電池を入れ替える時間があるので、現状のまま様子見としました。

※ 理論上の時間算出まで、できませんでした。でき次第、追記します。


② 終止電圧に達しない状態で、充電終了する場合がある。

これは、DC-DCコンバータ出力の、リップルとノイズが原因と思われます。
すなわち、ADCによる電圧検出のタイミングと、リップルとノイズのピークが一致すると、その分検出電圧が高く出ますので、直ちに充電終了してしまうものです。

これは、いくつか対処方法があります。

a.DC-DCコンバータ部の性能を上げて、リップルとノイズをさらに減らす。
b.PWMのスイッチングと、ADC読み取りを同期させ、ピークでない位置で読み取る。
c.電圧検出を複数回行い、全て終止電圧を超えていたら充電完了とする。

a と b は模範的ですが、改修規模が大きく、また、性能上も限界であろうとの判断で、安易ではありますが c を採用しました。

上記方針より、10回検出を行うように修正したソースを以下に示します(抜粋)。


//////////////////////////////////////////////////////////////////////////////
// メインループ
//////////////////////////////////////////////////////////////////////////////
int main(void)
{
    uint8_t uOVCount = 0; // OverVoltage Counter

// 途中略

    while(1){

        // --------- Setting Status --------

        if(uSTATUS == STATUS_SETTING){

// 途中略

        // --------- Charge Running Status ---------

        }else if(uSTATUS == STATUS_CHARGING){

// 途中略

            if(uREQUEST == REQUEST_FUNC_C || (uDataB > uVref && ++uOVCount == 10)){

                uOVCount = 0;

                uSTATUS = STATUS_SETTING;
                OCR1A = 0;              // PWM width min
                _CBI(TCCR1A, COM1A1);   // OC1A Non-Invert off
                uREQUEST = REQUEST_IDLE;

            }

// 以下略


③ ②の対策をとっても、終止電圧より僅かに低い状態で、充電終了する場合がある。

1本充電時、1.33V程度で充電終了する状態となっています。
これは、電圧検出抵抗や、ダミー抵抗のばらつきが原因のようです。
対策として、以下箇所の電流設定値を変更すればOKですが、この対応は、次項 基板実装まで終えて、本当の電池を接続して微調整することにします。


// 以下の整数値を微調整する。
const uint16_t arVOLTAGE[] = {
    266,    // 1024 / Vref * 1.38V * 1
    532,    // 1024 / Vref * 1.38V * 2
    1065    // 1024 / Vref * 1.38V * 4
};


8 コントローラ部 基板実装

ようやくプログラムが固まりましたので、マイコン及び周辺回路の基板実装に移ります。
コントローラ部回路の最終版を、以下に示します。


最終版では、DC-DCコンバータ部にあったドライブ用FET(Q11 2SK982)がコントローラ部に移動してQ1となり、電源(+5V)用に三端子レギュレータが追加となりました(忘れてました!すみません)。

また、Q1のソース(PWM-)は、グランドと同電位ですが、この経路にはスイッチング電流が流れるため、ADコンバータが同居するコントローラ部のグランドと共通にはせず、独立端子として引き出しています。


8.1 パターン検討

例によって、ICB-86ユニバーサル基板の使用を前提に検討します。
決定したパターンを以下に示します。



Atmega168は、電源とグランドの足配置に毎回悩みますが、今回止むを得ず、AVCCはジャンパ接続となりました。
また、実機での設定電圧/電流の微調整を考慮して、Atmega168の17~19ピンに、ISPコネクタを追加しました。



今回は、年内に公開することを優先して、ここまでと致します。


次回の予定

コントローラ基板に部品を実装し、動作及び微調整を行う予定です。