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

 AC電力制御U

 画像をクリックすると拡大表示されます。
 拡大画像からはブラウザの「←戻る」ボタンで戻ってください。


作り直し

 前回、位相制御をソフトウエアで実行しようとして失敗しました。
 抵抗負荷なら制御できるのですが、誘導負荷で制御に失敗します。
 今回は昔から実績のあるハードウエアによる制御にしました。
 マイコンは押しボタン又はタイマーによる出力のオンオフのみに使っています。


ハードウエア

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

 マイコンの役割は簡単な内容ですので、最近、出番が無くなり、在庫になっていたPIC12F675を使いました。
 出力のオンオフはトリガコンデンサーの充電電流をフォトモスリレーでオンオフすることにより行っています。
 トリガ素子はダイアックより低電圧でブレークするSBSを使いました。
 位相制御のタイミングは500KΩのVRと0.2UFのコンデンサーの時定数で決まりますが、電源周波数(50Hzか 60Hz)、トリガ素子のブレークオーバー電圧の影響を受けます。
 VR、コンデンサー自体の誤差も大きいです。
 時定数が小さいと出力を0に絞れなくなります。
 逆に大き過ぎると、VRを、ある程度回して、やっと出力が立ち上がるようになります。
 従って、VRかコンデンサーの値を調整して、合わせ込む必要があります。
 今回はVRは国産の通信工業用を使いました。
 1個数百円しますので、簡単に交換出来ず、コンデンサーの方で調整しました。
 トリガコンデンサーの値を0.2UFで回路図を書きましたが0.18UF程度に合わせ込んでいます。
 制御回路電源はトランスレスですので動作確認には若干、注意が必要です。


ソフトウエア

 肝心な部分はハードウエアで行っているのでソフトウエアは簡単です。
 1個の押し釦による出力のオンオフとタイマーによるオフを行います。
 タイマーはVRで電源電圧を分圧し、AD変換する大雑把なもので、最大で8時間です。
 時間計数は1mS割り込みをカウントするもので、内部発振器の精度に依存します。
 今回はクロックスピードが4%程度早かったので補正して、8時間に対する誤差を1〜2分程度にしています。
 チップが異なれば補正値は下記のソースとは異なるものになります。
 もっとも、時間設定はVRによる大雑把なものですので、補正の必要は無いです。
 タイマーと連続動作の切り換えスイッチを付けました。
 電源表示灯は電源投入時に点滅し、スタートで連続点灯になり、停止釦かタイムアップで点滅に戻ります。

//////////////////////////////////////
//  AC電力制御  (acpwctl2.c)      //
//   2014/7/22     PIC12F675        //
//   MikroC Pro for PIC Ver 6.0.0   //
//////////////////////////////////////

// PIC12F675 4MHz INTERNAL
// INTOSC GP4 GP5 = IO, WDT ON, PupTimer ON,
// GP3 = MCLR, BROWN_OUT = ON, CODE_PROTECT OFF,
// DATA CODE PROTECT OFF

typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;

#define POW_OUT GPIO.B1     //制御出力
#define TIM_MOD GPIO.B2     //タイマー/連続 切換SW入力
#define POW_LED GPIO.B4     //電源表示LED
#define RUN_STP GPIO.B5     //運転/停止 押釦入力

#define READY           0
#define READYtoRUN      1
#define RUN             2
#define RUNtoREADY      3

volatile uchar state;   //ステート
volatile uint m_tics;   //ミリSカウンタ
volatile uint minutes;  //分カウンタ
volatile uchar in_sw;   //チャッタ取りカウンタ
volatile uint led_brk;  //LEDブリンクカウンタ
ulong set_time;         //設定時間

union{                  //A/D変換値格納
    int adw;
    char adb[2];
}addata;

void ad_init(void){     //A/D初期化
    ADCON0 = 0x81;      //右詰、VREF=VDD, CH0,
    ANSEL = 0x11;       //Fosc/8, AN0
}

int ad_conv(void){      //A/D変換(16回の平均)
    int i,buff;
    
    buff = 0;
    for(i = 0; i < 16; i++){
        ADCON0.GO = 1;
        while(ADCON0.GO);
        addata.adb[0] = ADRESL;
        addata.adb[1] = ADRESH;
        buff += addata.adw;
        Delay_ms(2);
    }
    buff = buff >> 4;       //1/16
    return buff;
}

void main(void){
    CMCON = 0x7;            //コンパレータを使わない
    OPTION_REG = 0xcf;      //Pull-up off WDT 1/128
    asm CLRWDT;             //ウオッチドッグクリア
    GPIO = 0;               //全ての出力オフ
    TRISIO = 0x2d;          //入出力設定 
    WPU = 0;                //内蔵プルアップをしない
    TMR1L = 0;
    //TMR1H = 0xfc;           //Timer1 初期値
    //TMR1L = 0x17;           //(1000カウント)
    TMR1H = 0xfb;           //補正値(1043カウント)
    TMR1L = 0xec;
    T1CON = 1;              //タイマー1設定
    PIE1.TMR1IE = 1;        //Timer1 割り込み可
    INTCON.PEIE = 1;        //周辺割り込み可
    INTCON.GIE = 1;         //全割り込み可
    ad_init();
    state = READY;
    in_sw = 0;
    while(1){
        asm CLRWDT;
        switch(state){
            case READY:             //待機
                POW_OUT = 0;        //出力オフ
                minutes = 0;
                if(255 == in_sw) state = READYtoRUN;
                break;
            case READYtoRUN:
                if(in_sw)break;
                set_time = (ulong)ad_conv()*60L*8L/1024L;  //MAX 8H(480分)
                //set_time = (ulong)ad_conv()*8L/1024L;  //MAX 8分(デバッグ)
                m_tics = 0;
                state = RUN;
                break;
            case RUN:               //タイムカウント
                POW_OUT = 1;        //出力オン
                POW_LED = 1;        //電源表示
                if(minutes > set_time){
                    state = RUNtoREADY;
                    break;
                }
                if(255 == in_sw){
                    state = RUNtoREADY;
                    break;
                }
                break;
            case RUNtoREADY:
                if(in_sw)break;
                state = READY;
                break;
        }
    }
}

void interrupt(){               //1mS割り込み
    PIR1.TMR1IF = 0;            //割り込みフラグクリア
    TMR1L = 0;
    //TMR1H = 0xfc;               //Timer1 初期値
    //TMR1L = 0x17;               //(1000カウント)
    TMR1H = 0xfb;               //補正値(1043カウント)
    TMR1L = 0xec;
    if(state == RUN && GPIO.B2) m_tics ++;
    if(m_tics > 59999){
        minutes ++;
        m_tics = 0;
    }
    if(state == READY) led_brk++;
    if(led_brk > 500){
        led_brk = 0;
        POW_LED = ~POW_LED;     //LED点滅
    }
    if(!RUN_STP && in_sw < 255) in_sw ++;    //スイッチONチャッタ取り
    if(RUN_STP && in_sw > 0) in_sw --;       //スイッチOFFチャッタ取り
}

製作した装置

装置前面 装置後部 装置内部
装置前面装置後部装置内部

 装置前面にはタイマー設定VR、出力設定VR、オン/オフ押し釦、タイマー/連続 切り換えSW、電源表示灯、出力表示灯 があります。
 装置背面には出力コンセント、ヒューズ、電源SWがあります。
 出力は前面の押し釦でオンオフ出来るので、電源SWは省くことも出来ます。
 ただし、1W程度の待機電力が発生しますので使用しないときは電源プラグを抜くようにします。
 ヒューズは省けません。
 電源コードは1.25sqのものを使います。
 パーツとして一般的に売られている0.75sqの電源コードは7アンペアしか流せません。


動作確認

電流波形(電球) 電流波形(扇風機)
電流波形(電球)電流波形(扇風機)

 動作確認は扇風機と電球で行いましたが、どちらも良好でした。
 波形はカレントトランスによる電流波形です。


不具合事項

1 出力表示ランプ
 出力表示灯は電源をACコンセントから直接取っています。
 出力の絞り具合で明るさが変化する事を狙ったものです。
 特に抵抗負荷の場合は、明るさの変化がよく判ります。
 誘導負荷の場合は変化が少なくなります。
 単純なオンオフのタイミングだけなら電源表示灯の点滅→連続点灯→点滅で判るので出力表示灯は不要です。
 問題は負荷が未接続の時にスタート前でも漏れ電流で出力表示灯が点灯してしまうことです。
 出力コンセントに負荷が装着されればインピーダンスが下がって消えます。
 漏れ電流の経路は
・ スナバ回路
・ タイミングコンデンサーの放電回路(ヒステリシス軽減回路)
・ ラジオノイズ防止フィルター
 3つのルートがあります。
 これに関しては対策が面倒ですので、このままにします。
 電源を投入しただけで(スタート前に)出力表示が点灯したら負荷が接続されていないと判断すれば良いことにします。
 いずれにせよ表示だけの問題で動作に支障はなく、実際に動作させる場合は負荷が接続されているので、表示自体も 正常になります。

2 発熱部品
 最大負荷は1.2KW程度のヒーターを目標にしています。
 800Wの電気ストーブがあったので出力を最大にして30分程度、動作させ、回路部品の温度を測定してみました。
 真夏にストーブを焚いたので、室温は30℃になりました。
 まずトライアックですが、小型の放熱器に固定し、さらに、これをアルミケースに固定しています。
 という事で、ケース全体で放熱することになります。
 ケース全体が暖かくなりますが、放熱器の温度は60℃以下でした。
 一つだけ75℃くらいに発熱する部品がありました。
 それはラジオノイズ防止目的で入れたインダクタです。
 ジャンクの電源から外したもので、トロイダルコアに1.2φ程度のウレタン銅線が巻いてあります。
 巻き線の焼ける特有の臭いはしていないので、この時点では大丈夫と思いますが、これ以上負荷を重くした場合、どうなるか 分かりません。
 機会を見て、もう少し大きいコア、太い巻き線に交換する予定です。


追記

インダクタ交換

 ノイズフィルタ用のインダクタが発熱していたので交換しました。
 コアはFT140#43で2sqのVSFを10回巻き、100uHにしています。
 これで発熱はなくなりましたが、新たに発熱する部品を発見しました。
 出力コンセントが接触抵抗で発熱していました。
 年代物の中古品を新品に交換して発熱は無くなりました。
 室温25℃の時、800Wのヒーターを接続すると放熱器の温度が52℃程度になります。


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