DC→DCコンバーター(最適周波数自動設定)V2
概要
真空管を使用した製作物では、高圧(200V~400V)の電圧が必要となります。
今回製作した、DC→DCコンバータは、入力電圧(数V~数十V)を、出力電圧(数百V)に変換するものです。
以前にも、『DC→DCコンバータ(最適周波数自動設定)』を製作しましたが、ハードおよびソフトの両面を見直し、機能強化、精度向上を図ってみました。
動作原理
基本的な、動作原理は、『DC→DCコンバータ(最適周波数自動設定)』を参照してください。
<ハード見直し>
- DCモータ用フルブリッジドライバIC、パワーMOS-FETの単一ドライブのどちらでも可能とする。
- 出力電圧の変化に追従するために、2系統の平滑回路方式を採用する。
電圧検出用の平滑回路(平滑用のコンデンサの容量を小さくする)
電圧利用用の平滑回路(平滑用のコンデンサの容量を大きくする)
<ソフト見直し>
- CCPモジュールによるPWM(周波数変化型)方式を採用する。
- 周波数範囲を、500Hz~50kHzまでに拡張する。
CCPモジュールを、PWMで使用し、その周波数を変化させる。(ソフト負荷を減らす)
500Hz~2kHzまでは、100Hz単位で変化させる。
2kHz~50kHzまでは、1kHz単位で変化させる。 - A/D変換での取り込み回数を多く(平均化)し、安定度を向上させる。
出力電圧の高低判定の安定化を図るために、A/D変換を50回行い、その平均値で判断する。 - 最適値を見つける(ロック状態)とLEDを点灯し、その状態を維持する。
- 繰り返し処理(再測定)を可能とする。(SW1の押下による)
回路図
回路図の点線箇所は、どちらでも可能です。
- 効率重視の場合には、上図の回路を採用してください。
- より簡易な方法で実現したいのであれば、下図を採用してください。
SW1を押下することにより、繰り返し処理(再測定)をさせることが出来ます。
ダイオード(D1、D2)は、高速タイプを使用してください。
ソースコード
- dc2dc_v3_2.c
//******************************************************************************** /* <DC→DCコンバータ(最適周波数自動設定)V3> */ //******************************************************************************** #define SW &GPIO, 3 #define LED GPIO.F1 #define ON 1 #define OFF 0 //********************************************************************** void Pwm_Change_DutyEx(unsigned int duty_ratio) { CCPR1L = duty_ratio >> 2; CCP1CON.DC1B0 = (duty_ratio & 0b0000000000000001) == 0 ? 0 : 1; CCP1CON.DC1B1 = (duty_ratio & 0b0000000000000010) == 0 ? 0 : 1; } //********************************************************************** static unsigned short pr2_tmp; unsigned int measurement(double clock, unsigned long start, unsigned long stop, unsigned int step) { static unsigned int max, ad; static unsigned long freq, tmp; static unsigned short cnt; // max = 0; for (freq = start; freq <= stop; freq += step) { tmp = ((1.0 / freq) / clock) * 10.0; if ((tmp % 10) >= 5) { PR2 = (tmp / 10) + 1; } else { PR2 = (tmp / 10); } Pwm_Change_DutyEx((PR2 * 4) / 2); // LED = ON; Delay_ms(25); LED = OFF; Delay_ms(25); // ad = 0; for (cnt = 0; cnt < 50; cnt++) { ad += Adc_Read(0); Delay_ms(1); } ad = ad / 50; if (ad > max) { max = ad; pr2_tmp = PR2; } } return (max); } //********************************************************************** void main() { static unsigned int max1, max2, max3, max, ad, tmp; static unsigned short pr2_tmp1, pr2_tmp2, pr2_tmp3; // OSCCON = 0b01110000; //クロックを8Mhzに設定 CMCON0 = 0b00000111; //コンパレータは使用しない。 ANSEL = 0b00000001; //A/D変換はAN3を使用する。 TRISIO = 0b00111001; //入出力ポートを設定する。 //PWMの初期化 Pwm_Init(1000); Pwm_Change_DutyEx((PR2 * 4) / 2); Pwm_Start(); // while (1) { //125kHz T2CON.T2CKPS1 = 1; T2CON.T2CKPS0 = 0; max1 = measurement(0.000008, 500, 1900, 100); //500Hz~1.9kHzを100Hz単位で測定する。 pr2_tmp1 = pr2_tmp; //500kHz T2CON.T2CKPS1 = 0; T2CON.T2CKPS0 = 1; max2 = measurement(0.000002, 2000, 7000, 1000); //2kHz~7kHzを1kHz単位で測定する。 pr2_tmp2 = pr2_tmp; //2Mhz T2CON.T2CKPS1 = 0; T2CON.T2CKPS0 = 0; max3 = measurement(0.0000005, 8000, 50000, 1000); //8kHz~50kHzを1kHz単位で測定する。 pr2_tmp3 = pr2_tmp; // max = max(max1, max2); max = max(max, max3); if (max == max1) { PR2 = pr2_tmp1; T2CON.T2CKPS1 = 1; T2CON.T2CKPS0 = 0; } if (max == max2) { PR2 = pr2_tmp2; T2CON.T2CKPS1 = 0; T2CON.T2CKPS0 = 1; } if (max == max3) { PR2 = pr2_tmp3; T2CON.T2CKPS1 = 0; T2CON.T2CKPS0 = 0; } Pwm_Change_DutyEx((PR2 * 4) / 2); LED = ON; //スイッチが押されると再度繰り返す。 while (Button(SW, 1, 0) == 0) ; while (Button(SW, 1, 1) == 0) ; } } //********************************************************************************
動作確認

左側:PIC12F683、2SC1815、TA7291です。
右側:平滑回路です。

手持ちの電源トランスで動作させて見ました。
約49kHzで最大電圧52Vを取り出すことが出来ます。


手持ちの電源トランスで動作させて見ました。
3kHzで最大電圧140Vを取り出すことが出来ます。


手持ちの電源トランスで動作させて見ました。
23kHzで最大電圧72Vを取り出すことが出来ます。


手持ちの電源トランスで動作させて見ました。
35kHzで最大電圧38Vを取り出すことが出来ます。


如何ですか?
トランスのドライブに使用したTA7291Pは、ロジック側電源(7ピン)と出力側電源(8ピン)を別々に設定できますが、今回は同一(+5Vのみ)としました。
出力側電源は規格上で最大20Vまでいけますので、今回の回路構成で20Vにすると、更に高い電圧を得ることが出来ます。