トップページ     電子回路のページのトップ

 電池管ラジオ用AC電源

 以前、別の頁で「ラジオは作るより安い完成品を買った方が得。」と書いた記憶があります。
 しかしながら、最近、真空管ラジオにはまっています。
 真空管ラジオと言っても電池管を使ったポータブルのものだけです。
 完成したラジオは電池を使用するのですが、実験や調整はCVCC電源があると便利ですので製作しました。
 仕様は0〜72V、0〜20mAとしました。


 古いケースを流用

 大分前に「あれば便利な機材」の頁で温度記録計を紹介しましたが、その後作り直したのでケースが残骸となりました。
 不燃ゴミとして出す予定でしたが、もったいないのでケースとして流用することにしました。
 液晶表示器の切り欠き穴があるので、そのままB電源の電圧電流を表示することにしました。


 A電源回路図

 回路図をクリックすると拡大表示されます。
 拡大図から本文に戻るにはブラウザの←戻る釦を使用してください。

A電源回路図

 A電源は電圧固定で電流は短絡保護があるだけです。
 電圧は実測で1.435V、短絡電流は560mAでしたので500mA位、流せます。
 負荷に接続したダイオードは出力電圧が1.6Vになると電流が流れ始めますが無くても良いです。
 平滑コンデンサーが多数並列になっているのは手持ちの関係です。


 B電源回路図

 回路図をクリックすると拡大表示されます。
 拡大図から本文に戻るにはブラウザの←戻る釦を使用してください。

B電源回路図

 B電源は電圧、電流を0から可変するので多少複雑な回路になっています。
 PIC16F1823は電圧、電流の表示のみに使用し、制御には使っていません。
 回路図では液晶表示器以外のコネクタを省略しています。
 部分的には100V程度の電圧が掛かるところがあるので素子の耐圧、耐電力には十分注意します。

 プログラム

 プログラムはソースファイルをそのまま表示します。
 コンパイラはMikoroCですがディレールーチン以外の組み込み関数は使用していません。
 電圧電流の表示だけですのでチップを抜いても電源としては動作するはずです。
 A/D変換部分で電圧、電流を補正していますが、今回製作したハードに合わせ込んであるので再現性はありません。


////////////////////////////////////////////////
//  電池管ラジオAC電源 global.h             //
//  2017/03/06 PIC16F1823  MikroC  Ver 6.0.0  //
////////////////////////////////////////////////

#ifndef _GLOBAL_H
#define _GLOBAL_H

///// 型の短縮名称
typedef unsigned char   uchar;
typedef unsigned int    uint;
typedef unsigned long   ulong;

///// Lcd
#define     lcd_port    LATC
#define     lcd_rs      LATC.B5
#define     lcd_stb     LATC.B4

extern void lcd_data(char);
extern void lcd_cmd(char);
extern void lcd_clear(void);
extern void lcd_str(char *);
extern void lcd_init(void);

///// A/d
typedef union{
    int adw;
    char adb[2];
}ADDATA;
extern ADDATA addata;
extern int adV;
extern int adI;
extern uchar adf;
extern void ad_init(void);
extern void ad_conv(void);

#endif

////////////////////////////////////////////////
//  電池管ラジオAC電源 adconv.c             //
//  2017/03/06 PIC16F1823  MikroC  Ver 6.0.0  //
////////////////////////////////////////////////

#include "global.h"

static uchar ad_cnt;    //A/D変換回数
static long Vbuff;      //電圧変換バッファ
static long Ibuff;      //電流変換バッファ
int adV;                //電圧変換結果(10倍値)
int adI;                //電流変換結果(10倍値)
int deltaV;             //電圧補正値
int deltaI;             //電圧補正値
uchar adf;              //A/D完了

void ad_init(void){
    FVRCON = 0x83;      //A/D REF=4.096V
    ANSELA = 0x3;       //CH0,CH1
    ADCON0 = 0x1;       //AD使用
    ADCON1 = 0x93;      //右詰め、Fosc/8、FVR
    ad_cnt = 0;
    Vbuff = 0;
    Ibuff = 0;
    deltaV = 1020;      //電圧補正(合わせ込み)
    deltaI = 1200;      //電流補正(合わせ込み)
}

void ad_conv(void){
    ADDATA addata;

    ADCON0 = 0x1;               //CH0 ON
    Delay_ms(1);
    ADCON0.GO = 1;              //start
    while(ADCON0.GO);
    addata.adb[0] = ADRESL;
    addata.adb[1] = ADRESH;
    Vbuff += (long)addata.adw;
    ADCON0 = 0x5;               //CH1 ON
    Delay_ms(1);
    ADCON0.GO = 1;              //start
    while(ADCON0.GO);
    addata.adb[0] = ADRESL;
    addata.adb[1] = ADRESH;
    Ibuff += (long)addata.adw;
    ad_cnt++;
    if(ad_cnt == 64){                   //64回の平均
        Vbuff = Vbuff >> 6;             //1/64
        Vbuff = Vbuff * 4L * 29L;       // * 1bit4mV * ゲイン逆数(=電圧mV)
        Vbuff = Vbuff * deltaV / 1000L; //表示合わせ込み
        adV = Vbuff / 100L;             //電圧値の10倍
        Vbuff = 0;
        Ibuff = Ibuff >> 6;             //1/64
        Ibuff = Ibuff * 4L / 10L;       // * 1bit4mV * ゲイン逆数(=電流値の10倍)
        Ibuff -= 30L;                   // オフセットを引く(合わせ込み)
        if (Ibuff < 0) Ibuff = 0;
        Ibuff = Ibuff * deltaI / 1000L; //表示合わせ込み
        adI = (int)Ibuff;
        Ibuff = 0;
        ad_cnt = 0;
        adf = 1;
    }
}

////////////////////////////////////////////
//   LCDLIB4L.C (SC1602,2004  4BIT BUS)   //
//   2017/03/06  MikroC                   //
////////////////////////////////////////////
//指定ポートの下位4ビットに接続
//ピンアサインは global.h に記述

#include "global.h"

//////////                  1文字表示
void lcd_data(char asci){                               //asci: 書き込みデータ
    lcd_rs = 1;                                         //データの書込操作  
    lcd_port = (asci >> 4 & 0x0f) | (lcd_port & 0xf0);  //書込データ上位(ポート上位保存)
    asm NOP;                                            //NOP
    lcd_stb = 1;                                        //ストローブ立ち上げ;
    asm NOP;                                            //NOP
    asm NOP;                                            //NOP
    lcd_stb = 0;                                        //ストローブの立ち下げ
    lcd_port = (asci & 0x0f) | (lcd_port & 0xf0);       //書込データ下位(ポート上位保存)
    asm NOP;                                            //NOP
    lcd_stb = 1;                                        //ストローブ立ち上げ
    asm NOP;                                            //NOP
    asm NOP;                                            //NOP
    lcd_stb = 0;                                        //ストローブの立ち下げ
    Delay_us(40);                                       //40uS
}
//////////                  コマンドの書込
void lcd_cmd(char cmd){                                 //cmd: コマンド
    lcd_rs = 0;                                         //コマンドの書込操作    
    lcd_port = (cmd >> 4 & 0x0f) | (lcd_port & 0xf0);   //書込データ上位(ポート上位保存)
    asm NOP;                                            //NOP
    lcd_stb = 1;                                        //ストローブ立ち上げ;
    asm NOP;                                            //NOP
    asm NOP;                                            //NOP
    lcd_stb = 0;                                        //ストローブの立ち下げ
    lcd_port = (cmd & 0x0f) | (lcd_port & 0xf0);        //書込データ下位(ポート上位保存)
    asm NOP;                                            //NOP
    lcd_stb = 1;                                        //ストローブ立ち上げ
    asm NOP;                                            //NOP
    asm NOP;                                            //NOP
    lcd_stb = 0;                                        //ストローブの立ち下げ
    Delay_us(40);                                       //40uS
}
/////// 全消去関数
void lcd_clear(void){
    lcd_cmd(0x01);              //消去コマンド出力
    Delay_ms(2);                //2mS
}
/////// 文字列出力関数
void lcd_str(char *str){
    while(*str != 0x00)         //文字列の終わり判定
    {
        lcd_data(*str);         //文字列1文字出力
        str++;                  //ポインタ+1
    }
}

/////////                   初期化コマンドの書込
void lcd_incmd(int cmd){                                //cmd: 初期化コマンド
    lcd_rs = 0;                                         //コマンドの書込操作
    lcd_port = (cmd >> 4 & 0x0f) | (lcd_port & 0xf0);   //初期化コマンド(ポート上位保存)
    asm NOP;                                            //NOP
    lcd_stb = 1;                                        //ストローブ立ち上げ
    asm NOP;                                            //NOP
    asm NOP;                                            //NOP
    lcd_stb = 0;                                        //ストローブの立ち下げ
    Delay_ms(5);                                        //5mS
}
/////////                   初期化
void lcd_init(){
    Delay_ms(20);                   //20mS
    lcd_incmd(0x30);                //8bit mode set
    lcd_incmd(0x30);                //8bit mode set
    lcd_incmd(0x30);                //8bit mode set
    lcd_incmd(0x20);                //4bit mode set
    lcd_cmd(0x28);                  //DL=0 4bit mode,5x7dot
    lcd_cmd(0x0c);                  //display on C=D=1 B=0
    lcd_cmd(0x06);                  //entry I/D=1 S=0
    Delay_ms(20);                   //20mS
    Delay_ms(20);                   //20mS
    lcd_cmd(0x1);                   //clear
}

////////////////////////////////////////////////
//  電池管ラジオAC電源 qrad_acp.c           //
//  2017/03/06 PIC16F1823  MikroC  Ver 6.0.0  //
////////////////////////////////////////////////

//CLOCK 4MHz
// _FCMEM_OFF, _IESO_OFF, _BOD_ON, _CPD_OFF, _CP_OFF,
// _MCLEAR_ON, _WDT_OFF, _INTRC_IO,

#include "global.h"

void dispVI(int VI){
    uchar n1,n2,n3;

    n1 = VI / 100;
    VI = VI % 100;
    n2 = VI / 10;
    n3 = VI % 10;
    if(n1) lcd_data(n1 + 0x30);
    else lcd_data(' ');
    lcd_data(n2 + 0x30);
    lcd_data('.');
    lcd_data(n3 + 0x30);
}

void main(void){
    OSCCON = 0x6a;      //INTR 4MHz
    OPTION_REG = 0x7f;
    WDTCON = 0x11;      //256mS ,ENABLE
    asm CLRWDT;         //WDT CLR
    WPUA = 0x34;
    TRISA = 0x3f;
    TRISC = 0;
    ad_init();
    lcd_init();
    Delay_ms(40);
    while(1){
        asm CLRWDT;     //WDT CLR
        ad_conv();
        if (adf){
            lcd_cmd(0x84);      //表示位置
            dispVI(adV);
            lcd_data('V');
            lcd_cmd(0xc4);
            dispVI(adI);
            lcd_str("mA");
            adf = 0;
        }
    }
}


 製作した電源ユニット

A電源基板 B電源基板 装置外観 表示
A電源基板/td>B電源基板装置外観表示


 製作した電源

 最初の写真はA電源基板でB電源基板の下にあります。
 電圧は固定で現状1.435Vです。
 2枚目の写真はB電源基板です。
 手直しを予想して余裕を持った大きさにしています。
 3枚目の写真は装置外観です。
 B電圧、電流の表示器、A電圧、B電圧の出力端子と出力オンオフスイッチ、B電流、電圧の設定ボリュームが 配置されています。
 電源スイッチは背面にあります。
 4枚目の写真は電圧、電流を最大に設定し、約3.3KΩの負荷を接続した時の電圧、電流の表示です。
 短絡電流は25mA程度です。


 製作結果

 基本的な動作は確認しましたが、まだ電源として使い込んだ訳ではありません。
 今後新しい電池管ラジオを製作するとき評価されると思います。
 現状の問題点として、電圧を10V以下に設定すると僅かなリップル(20mVp−p程度)が出ます。
 これくらいなら問題は無いと思いますしB電圧を10V以下に下げることは、まず無いと思います。
 とりあえず完成とします。




 コラム: TL783C

 今回、回路が少々複雑になり、製作が面倒です。
 もう少し、簡単な回路に出来ないかと検討しました。
 そこで頭に浮かんだのがテキサスのTL783Cという3端子レギュレータです。
 LM317という電圧可変の3端子レギュレータが一般的に使われていますが、これの高電圧版です。
 ネットで検索したところ秋月電子で扱っていました。(2017年3月現在)
 「出力段がパワーMOSFETを使用した最新設計。次世代型可変3端子....」と解説されています。
 ところが、手持ちの1983年版テキサスリニアICデータブックに既に記載があるので、実際はかなり古典的な半導体 です。
 出力段は当時からMOSFETになっています。
 最新の半導体は評価が定まっていないので、短期間で消えていくものも多いのですが、古い半導体が未だに販売されている場合、 設計が優れていていて現在でも使われているか、当時、大量に使われていてデッドストックが大量にあるかのいずれかです。

テキサスリニアICデータブック

テキサスリニアICデータブック

 応用回路は以下の様に非常に簡単なります。

テキサスリニアICデータブック

 図の回路定数で0Vは無理ですが1.25Vから約72V程度まで可変出来ます。
 今回、使用を止めたのは「最低負荷電流が15mA」という条件の為です。
 手持ちの電源トランス30V0.1Aを両波倍電圧整流して負荷に供給しているので72V出力では、せいぜい30mA程度 しか取れません。
 無負荷の時、ICの為に15mA流してしまうと残りは15mAとなってしまいます。
 回路図の82Ωに15mA流すとリファレンス電圧に等しくなります。
 出力電圧はボリュームの抵抗値×15mA+1.25V(リファレンス電圧)となります。
 5.9KΩのボリュームは販売されていないので、1KΩの抵抗+5KΩの抵抗としますが、電圧可変範囲が狭くなって、 最低電圧が16V位になってしまいます。
 もう一つ重要な事はボリュームに15mA流れるという事です。
 最低でも2Wのボリュームが必要となります。
 例えば秋月電子で売られている小型のパネル取り付け用ボリュームは1/8Wですので焼けてしまいます。
 モールド型の通信機用ボリュームでも1/4W程度です。
 2Wの巻き線型ポテンショメーターは売られていますが高価です。
 結局、今回は使用を諦めましたが、電圧可変範囲の広くない用途では便利なICだと思います。


トップページ  「電子回路」のトップ