2013年5月2日木曜日

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


今回は、仮組みした回路に通電して、定数を最適化して行きます。


4 実験及びカット&トライ


前回、仮決定した回路を再度、以下に示します。



前回の予告画像の通り、ブレッドボード(このような試作用の治具)に回路を組み、AVRにADコンバータとPWM制御のプログラムのみ実装し、実験を行います。


4.1 実験プログラム

PWM制御は、ADコンバータ値で制御せず、まず最低幅(OCR1A = 0)を出力するようにします。これは、実験の目的が、無負荷時の検証と、スイッチング特性(特にカットオフ速度)の確認にあるためです。

PWMにTimer1を使っているのは、将来、分解能を上げる(クロックを外付け16MHzにすれば、9ビットまでは可能)ことを考慮したものです。

上記目的で作成したプログラム(抜粋)を、以下に示します。


//////////////////////////////////////////////////////////////////////////////
//
// Programmed by (c)ota957
//
//////////////////////////////////////////////////////////////////////////////
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define _SBI(p, q) ((p) |= _BV(q))
#define _CBI(p, q) ((p) &= ~_BV(q))

//////////////////////////////////////////////////////////////////////////////
// 各関数
//////////////////////////////////////////////////////////////////////////////
// ---------------------------------------------------------------------------
// 10ビットバーLED表示(実験用)
// ---------------------------------------------------------------------------
void DispBarLED(uint16_t uData)
{
    PORTD = (uint8_t)(uData & 0xff);

    if(uData & 0b0100000000)
        _SBI(PORTB, PB6);
    else
        _CBI(PORTB, PB6);

    if(uData & 0b1000000000)
        _SBI(PORTB, PB7);
    else
        _CBI(PORTB, PB7);

}

// ---------------------------------------------------------------------------
// ADC 入力選択
// ---------------------------------------------------------------------------
void ADC_Select(uint8_t uChannel)
{
    uint8_t uTemp = ADMUX;

    ADMUX = (uTemp & 0xf0) | (uChannel & 0x0f);
}

// ---------------------------------------------------------------------------
// ADC 変換スタート
// ---------------------------------------------------------------------------
uint16_t ADC_Start(void)
{
    _SBI(ADCSRA, ADIF);
    _SBI(ADCSRA, ADSC);

    loop_until_bit_is_set(ADCSRA, ADIF);

    return ADCW;
}

//////////////////////////////////////////////////////////////////////////////
// メインループ
//////////////////////////////////////////////////////////////////////////////
int main(void)
{
    // I/O(Bar-LED for Test) Setting
    _SBI(DDRD, DDD0);
    _SBI(DDRD, DDD1);
    _SBI(DDRD, DDD2);
    _SBI(DDRD, DDD3);
    _SBI(DDRD, DDD4);
    _SBI(DDRD, DDD5);
    _SBI(DDRD, DDD6);
    _SBI(DDRD, DDD7);

    _SBI(DDRB, DDB6);
    _SBI(DDRB, DDB7);

    // Timer1 Setting
    _SBI(DDRB, DDB1);    // OC1A(PB1) output

    _SBI(TCCR1A, COM1A1);    // OC1A Non-Invert

    _SBI(TCCR1A, WGM10);    // 8Bit Highspeed PWM
    _SBI(TCCR1B, WGM12);    // ↑

    _SBI(TCCR1B, CS10);    // ck = 1/1


    OCR1A = 1;

    // ADC Setting
    _SBI(ADMUX, REFS0);    // Vref = internal

    _SBI(ADCSRA, ADPS2);    // ck = 1/64
    _SBI(ADCSRA, ADPS1);    // ↑

    _SBI(ADCSRA, ADEN);    // ADC Enable


   
    uint16_t uData = 0;
    uint16_t uRef = 0x0020;

    OCR1A = 0;


    while(1){

        ADC_Select(5);    // ADC5
//      ADC_Select(8);    // ondo sensor

        uData = ADC_Start();

        DispBarLED(uData);

        _delay_ms(100);

    }

}

//////////////////////////////////////////////////////////////////////////////


4.2 スイッチング特性の追い込み

上記プログラムを書き込んで、動作させてみたQ13のゲートおよびドレインの波形が以下の通りです。


オシロスコープは、秋月電子で販売している、「Picoscope2205」を使用しています。


このときのPWM幅は、(1 / 32kHz) / 256 = 122nsec

赤が、Q13のゲート、黄が、ドレインの波形です。
時間軸は、ひとマスが500nsecです。

ゲート波形の幅は、理論通りで問題なさそうですが、少しリンギングがあります。
一方ドレイン波形ですが、トリガ点から約800nsecほど遅延しており、これはさすがに遅すぎます。

※800nsec~1800ns の部分は、不連続モードによる減衰振動波形のため、これは論点から外します。

R13が過大のため、Q12が十分に機能していないものと思われます。
そこで、R13を、4.7kΩ ⇒ 1kΩに、R14を 10Ω ⇒ 47Ω にしてみたのが以下の波形です。


リンギングは無くなり、遅延もトリガ点から400nsec程度に改善しましたが、オン時のドレイン電圧が、入力電圧8.4Vに対して大きく低下してしまいました。
これは、ゲート抵抗R14が過大のため、Q13が完全にオンできていない由です。

せっかくリンギング無しになったのに残念ですが、R14を半分の22Ωにしてみます。


オン電圧は、ほぼ回復しました。またリンギングはゼロではありませんが、R14 = 10Ω 時に比べて小さく抑えられているため、妥当な値とみられます。

なお、R13をさらに小さくしてみましたが、大きな変化はなく、単に電流がもったいないので、不採用としました。よって、R13とR14の値はこれで決定とします。

∴R13 = 1kΩ
∴R14 = 22Ω


4.3 ブリーダ(兼電圧検出)抵抗

前回検討の通り、充電中は「連続モード」をおおよそ維持できることは確認できましたが、無負荷時に「不連続モード」に移行してしまうことは止むを得ないことです。

※無負荷時も「連続モード」を維持することは、ブリーダ電流を通常負荷並みに流さなければならないので、一般的ではありません。

「不連続モード」のときの出力電圧と電流(負荷)の関係を、前回同様、ABCDEFGさまの動作モードに関するサイトを参考にして検討します。


上記サイトの式(13)によれば、

・Vo = Vi^2 × Ton^2 / (Vi × Ton^2 + 2 × L × Io × Tpwm)

※ 「^2」 は、二乗の意です。

上記の通り、単にTonとTpwmの比とならず、LやIoの値が影響することが判ります。
今回は、無負荷(= 電池を繋いでいない)時に、出力電圧を特定値に制御することまでは求めていませんので、まず、PWM値を最小まで絞っても、出力電圧が制御不能な値にならないかを調べます。

上記式に、To = 500nsec(実測値)、Io = 1V / (1kΩ + 470Ω)(ブリーダ抵抗に流れる、想定の最悪値)を代入して計算すると、

・Vo = 8.4V^2 × 500nsec^2 / (8.4V × 500nsec^2 + 2 × 470uH × 0.68mA × 31.25usec)
 = 0.8V

この値は、Vref = 2.1V を超えておらず、負荷(= 充電池)を繋げば、制御状態に移行できる値と考えられます。
次に、実際にどの位の電圧が出力されているか確認します。
確認は、以下のようにADコンバータの出力10ビットを、バーLEDで直読しました。


直読値は、0010010110 なので、

・Vo = (0010010110b / 1111111111b) × 2.1V × ((1kΩ+470Ω) / 470Ω) = 0.96V

計算値とおおよそ一致していますので、電圧検出抵抗の値を、そのまま採用することにします。

∴R15 = 1kΩ
∴R16 = 470Ω


最後に、比較実験のため、ドライバトランジスタQ11を、FET(2SK982)から、バイポーラトランジスタ(2SC1815)に変更して、スイッチング特性を観察してみます。
ベース抵抗(R11、R12)は、ドライブ能力が確保できるように、1kΩにしてあります。


オフ特性は、FETとほぼ変わりませんが、オン特性にやや遅れがあります。また、思いの外、出力側が下がり切らず、ドライブ能力が高くありません。

この状態では、負荷が重くなったときにオンできなくなる恐れも考えられるので、当初予定通り、Q11は2SK982を使用することにします。


これにて、DC-DCコンバータ部の定数は全て決まりました。
決定した回路を、以下に示します。


今回も、計算ばかりで申訳ありませんでした。


次回の予定

PWM制御の本検討を行いたいと思いますが、DC-DCコンバータ部がバラック状態では特性・安全性で不安なので、この部分だけ、基板に実装することも考えます。

※前回・今回とも、DC-DCコンバータの検討において参考にさせて頂きました「ABCDEFG」さまに、この場を借りまして御礼申上げます。