この記事は2012年4月にUPしましたが、最近(2014年2月〜3月)、プログラムの変更を思いつきました。
しかしながら当時の試作基板が残っていなかったので、再度試作し、データを取り直しました。
その為、大きな変更はありませんが、全面的に差し替えます。
電池で動作する機器で負電圧が必要になる事があります。
例えば両電源のOPアンプを加えたい場合等です。
今回はOPアンプ1〜2個を追加する場合の負電源を考えてみました。
電流は5mAもあれば足ります。
PIC12F1822のハーフブリッジ出力からPWM波形を出力し、倍電圧整流します。
出力電圧をフィードバックし、PWMのデューティーを変えて定電圧制御します。
この場合、基準電圧は+5Vとなります。
従って、+側電圧が変動すると−側電圧も変動します。
基準電圧を基準電圧ダイオード等を使って安定化すれば+側電源の影響を受けなくなります。
PIC12F1822の6PIN(コンパレータ)端子が0Vになるように制御されます。
ただし、0Vで比較出来るか分からなかったので実際は+側に僅かにシフトしています。
この比較電圧はDAコンバーターで設定(最低値)しています。
出力電圧は半固定抵抗で微調整出来ます。
回路図では−5V近辺に電圧を調整出来る定数になっていますが、定数を変えれば最大−9.3V程度(ただし無負荷)まで
出ます。
デューティーを変化させる方法ですが、前回はデューティーそのものを変化させていました。
今回はサイクルタイム20uS、デューティー50%固定です。
PIC12F1822のPWMでは波形にディレー時間を設定することが出来ます。
ディレー時間を設定すると波形の立ち上がりが遅れ、等価的にデューティーが下がります。
この機能を使ってデューティーを0〜50%に変化させています。
性能に変わりはありませんが、動作が判りやすくなります。
ソフトウエアはMikroCで作成しました。
短い簡単なプログラムですが、レジスタの設定ヶ所が結構多く、作成後、慎重に見直します。
毎回言いますが、MikroCはコンフィギュレーションをファイルに書けないので、プロジェクトに設定するのですが、
誤操作で消してしまうことがあります。
従って、コメントとして残しておきます。
デホルトのままで良いところも書いておくと良いと思います。
今回のソースファイルを下に示します。
レジスタの設定を沢山行うので面倒ですが、あとは基準電圧と出力電圧の中点が0Vとなるように制御しているだけです。
ポートRA3端子を接地するとCPUは出力を遮断してスリープするようになっています。
/////////////////////////////////////////////// // −5V小電流安定化電源 reg_n5v2.c // // 2014/02/24 PIC12F1822 MikroC Ver4.60 // /////////////////////////////////////////////// // CLOCK 8MHz // Oscillator INTOSC, Watchdog controlled by SWDTEN bit, Power-up Timer ON, // MCLR Pin OFF, Code Protection OFF, Data Protection OFF, // Brown-out Reset ON, Clock Out OFF, Int/Ext Switchover OFF, // Fail-safe Clock Monitor OFF, F-Memory Self W-protection OFF, Pll OFF // Stack Of/Uf Reset ON, Brown-out Reset 2.5V, Debug OFF, LVP OFF unsigned char _delay; void main(){ OSCCON = 0x72; //内部 8MHz OPTION_REG = 0xf; //タイマー0関連ダミー APFCON = 0x3; //ALTERNATE CCP ANSELA = 0x2; //AN1 FVRCON = 0x84; //DACREF=1.024V DACCON0 = 0x88; //DAC ON FVR2 DACCON1 = 0x1; //DAC Level LATA = 0x0; //出力 OFF TRISA = 0xf; //RA5,RA4 = OUTPUT CM1CON0 = 0x94; //Comparator Enable,higher speed,hysteresis disabled CM1CON1 = 0x10; //DAC VOLTAGE Reference WPUA = 0xd; //PULL UP WDTCON = 0xf; //ウオッチドッグ128mS asm CLRWDT; //WDT CLR CCP1CON = 0x8c; //PWM ACTIVE H PR2 = 39; //サイクルタイム(39+1) x 0.5u = 20uS CCPR1L = 20; //デューティー 20 x 0.5uS をセット PWM1CON = 18; //DELAY T2CON = 0x4; //T2 ON プリスケーラー無し while(1){ asm CLRWDT; //WDT CLR if(CM1CON0.B6){ //出力電圧が低い時 if(_delay > 0) _delay--; //ディレーを減らす } else { //出力電圧が高い時 if(_delay < 20) _delay++; //ディレーを増やす } PWM1CON = _delay; //ディレーをセット Delay_us(40); //40uS待つ if(!PORTA.B3){ LATA = 0x0; //出力 OFF break; //遮断信号で終了 } } TRISA = 0xf; //ALL INPUT T2CON = 0; WDTCON = 0; asm SLEEP; //スリープ asm NOP; }
上に計測データ及び負荷電流対出力電圧のグラフを示します。
数値とグラフは見易いように極性を反転してありますが実際は負の値です。
負荷電流−5.5mA程度まで定電圧制御されています。
ポートの駆動能力が低いので使えるのは−5mA少々ですが用途によっては実用になります。
以下にデューティー50%の時の動作波形と、25%の時の動作波形を示します。
波形のCh1がポートRA5(PIN2)、CH2がポートRA4(PIN3)です。
ディレー時間を強制的に固定して撮影しました。
この回路はさらに高電圧、微少電流を目的とした回路で、例えば液晶の負バイアス電源等に使えます。
上記の回路で、半固定抵抗を調整することにより、−6.6Vから−11.6Vまで調整出来ました。
抵抗値を変更すれば−13V以下の電圧(ただし無負荷)を出せます。
電圧を上げる程、電流は流せなくなり、−12Vで−1mA程度と予想します。
尚、ソフトウエアは倍電圧整流回路と全く同じ物が使えます。
出力電圧を−7Vに設定したとき約−4mA、−11Vに設定したとき−2mA程度流せることが判ります。
2016年1月現在、PIC12F1822は1個100円、PIC12F1501は1個70円で秋月にて販売されてい
ます。
単なる実験ですので30円の値段差に意味は無いですが今回はPIC12F1501で試してみました。
(3倍圧整流のみです。)
回路は全く同じでCPUを差し替えただけですが内部構造が異なる為、プログラムは変更の必要があります。
PWMで波形を作るのは同じですが前回はデューティー50%固定で立ち上がりのディレー時間を変えて定電圧制御して
いました。
PIC12F1501の場合、ディレーを大きく変えることが出来ないのでデューティーを変えて制御しています。
デューティーの可変範囲は0〜50%としています。
電圧検出にはコンパレータを使用し、基準電圧にはDACを使って電源電圧の1/32を与えています。
PWM出力はCWGユニットに入れてコンプリメンタリー波形を生成しています。
以下にソースファイルを置きます。
タイトルを「液晶用負電源」としていますが、他の用途に使用しても構いません。
/////////////////////////////////////////////// // 液晶用負電源 glcd_nv1.c // // 2015/01/19 PIC12F1501 MikroC Ver4.60 // /////////////////////////////////////////////// // CLOCK 8MHz // Oscillator INTOSC, Watchdog Watchdog controlled by SWDTEN bit, // Power-up Timer ON, // MCLR Pin OFF, Code Protection OFF, // Brown-out Reset OFF, Clock Out OFF, // F-Memory Self W-protection OFF, Stack Of/Uf Reset ON, // Low Power Brown Out Reset OFF, LVP OFF unsigned char duty; void main(){ OSCCON = 0x70; //内部 8MHz OPTION_REG = 0; // APFCON = 0xc8; //CWG1B:RA4, CWG1A:RA5 ANSELA = 0x2; //AN1 DACCON0 = 0x80; //DAC ON V+ DACCON1 = 0x1; //DAC Level LATA = 0x0; //出力 OFF TRISA = 0xf; //RA5,RA4 = OUTPUT CM1CON0 = 0x94; //Comparator Enable,higher speed,hysteresis disabled CM1CON1 = 0x10; //DAC VOLTAGE Reference WPUA = 0xd; //PULL UP PWM1CON = 0x80; //PWM ACTIVE H duty = 1; //デューティーをセット x0.5uS PWM1DCH = duty; PWM1DCL = 0; PR2 = 39; //サイクルタイム(39+1) x 0.5u = 20uS T2CON = 0x4; //T2 ON プリスケーラー無し CWG1CON0 = 0xe0; //コンプリメンタリー出力 CWG1CON1 = 0x02; //シャットダウン時出力トライステート(ダミー) CWG1CON2 = 0; //シャットダウンしない CWG1DBR = 1; //立ち上がりデッドバンド幅 CWG1DBF = 1; //立ち下がりデッドバンド幅 WDTCON = 0xf; //ウオッチドッグ128mS asm CLRWDT; //WDT CLR while(1){ asm CLRWDT; //WDT CLR if(CM1CON0.B6){ //出力電圧が低い時(負電圧が足りない) if(duty < 20) duty++; //デューティーを増やす } else { //出力電圧が高い時 if(duty > 0) duty--; //デューティーを減らす } PWM1DCH = duty; //デューティーをセット Delay_us(40); //40uS待つ } }
実験結果はPIC12F1822の時と大差ありません。
動作波形はPIC12F1822の時と異なります。
以下にデューティーが大きい時の動作波形と、小さい時の動作波形を示します。
波形のCh1がポートRA5(PIN2)、CH2がポートRA4(PIN3)です。
デューティーを強制的に固定して撮影しました。
実際にはデューティーは絶えず変動しているので綺麗な波形は撮れません。