今回は、仮組みした回路に通電して、定数を最適化して行きます。
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」さまに、この場を借りまして御礼申上げます。
0 件のコメント:
コメントを投稿