画像をクリックすると拡大表示されます。
拡大画像からはブラウザの「←戻る」ボタンで戻ってください。
内容はトライアックを使用した交流電力制御(位相制御)の実験です。
結果が良ければケースに収めて実用品として使用するのですが、現状では問題があり、中断状態になっています。
成功した機器は現物もドキュメントも残るのですが、失敗した場合、現物は部品取りされ、ドキュメントは廃棄され、何も残
りません。
したがって、後々、同じ失敗を繰り返す可能性があります。
此処に記載した内容は自分向けの失敗の記録ですので、このまま製作しても結果は出ません。
製作した機器は交流機器の電力を制御するものですが、電球やヒーター等の抵抗負荷の場合は問題なく動作します。
問題はモーター負荷の場合、トライアックのトリガに失敗する領域があるということです。
(最大出力付近:ゼロクロスポイント直後のトリガ)
位相のずれか、トリガ方法が悪いかのどちらかとは思いますが、解決していません。
![]() |
![]() |
![]() |
![]() |
|---|---|---|---|
| 調光器 | 内部 | 制御素子 | 昔のパッケージ |
調光器は何十年も前に製作したものがあり、現役です。
当時のSCRやトライアックは金属パッケージで高価でした。
400V10Aのトライアックは当時の金額で1000円以上しました。
10A以上のものは入手が困難で金額も、かなりアップしました。
現在はプラスチックパッケージのものが安く入手出来、TO−220パッケージで40A流せたりします。
この調光器は10Aのトライアックを使用しているので600W程度しか制御出来ません。
・ 1.2KWまで制御したい。
・ タイマーを内蔵したい。
以上、二つの理由で新しく作ることにしました。
参考書を見ながら回路を考えてみました。
製作し、動作を確認したところ大きな誤りがありました。
回路図をクリックすると拡大表示されます。
拡大図から本文に戻るにはブラウザの←戻る釦を使用してください。

制御にはPIC16F1823を使用しました。
0クロスポイントを検出し、トリガするタイミングをタイマーで設定します。
全波整流波形を内蔵コンパレータに入力し、0Vから立ち上がった瞬間(コンパレータでは出力の立ち下がり)に割り込みを
かけます。
割り込みルーチンではタイマー1に遅れ時間を設定して起動します。
タイマー1の割り込みルーチンではトライアックのトリガパルスを短時間出力します。
当地では60Hzですので1秒間に120回の0クロスポイントがあり、割り込み周期は8.33mSとなります。
一連の動作は0クロスの割り込み周期内に完結しなければなりません。
多少、余裕を持って、8mSを最大の遅れ時間としています。
出力調整の分解能は8ビット(256ステップ)としますが、0xF以下は0、0xF0以上は100%としています。
8000uSを256で割ると31.25uSが1ステップの遅れ時間となります。
PICは16MHzの内部発振で動作していますのでタイマー1のクロック周期は0.25uSとなります。
31.25÷0.25=125が1ステップのカウント数となります。
トリガタイミングは電源電圧をVRで分圧しAD変換しています。
AD変換値を8bitに丸めて256ステップとしています。
習慣で10bitのAD変換値を2bit右シフトしましたが左詰して高位側レジスタを読めば簡単でした。
トライアックのトリガはフォトトライアックを使えば簡単ですが、手持ちに無いのでパルストランスを使いました。
パルストランスは何十年も前に購入したジャンク基板から取り外したSF2Aを使いました。
パルストランスは使い方がよく判らないのですがPWMモジュールで5KHzを常に発振させ、ゲートタイミングを
PNPトランジスタで作っています。
使用時間タイマーは0クロス割り込みの回数をカウントしています。
設定はVRの分圧電圧をAD変換しています。
変換値を16ステップに丸め、最短30分、最長8時間にしています。(30分ステップ)
スタート/ストップは1つの押し釦で行います。
AC側の電源スイッチを入れると電源表示LEDが点滅するので押し釦を押すと制御が開始し、電源表示灯は連続点灯と
なります。
使用時間タイマー設定VRはスター時の値を読み込み、スタート後は変更を受付ません。
出力調整VRは動作中の変更を常に受け付けます。
出力表示灯は出力設定により明るさが変化します。
ジャンパーピンはタイマーを殺すものと50Hz60Hzを切り換えるものです。
ただし、当地では50Hzは動作を確認出来ません。
失敗した理由は電源トランスをケチった事にありました。
0クロスポイントはトランスレスの制御電源を全波整流していますが、コンデンサーで電圧を落としているため主電源から
位相がずれています。
最初、トライアックを接続せず制御回路だけで動作確認していたので主電源との位相のずれに気が付きませんでした。
制御回路の動作だけを見ていると正常に動作しているように見えます。
トライアックと負荷を接続して気が付きました。
制御回路のトランスレスを止めてトランスを使いました。
トランスの2次側の電圧波形が若干、歪むような気がしたので、0クロスの検出をフォトカプラにしました。
フォトカプラにするならトランスレスのままでも良かったような気がします。
回路図をクリックすると拡大表示されます。
拡大図から本文に戻るにはブラウザの←戻る釦を使用してください。

フォトカプラを使ってAC入力電圧の0クロスポイントを検出していますが動作は同じで、同じプログラムを使っています。
//////////////////////////////////////
// AC電力制御(acpwctl1.c) //
// 2014/06/13 PIC16F1823 //
// MikroC Pro for PIC Ver 6.0.0 //
//////////////////////////////////////
//OSC=INTOSC, Watchdog controlled by SWDTEN bit, PowerUpTimer=ON, MCLR=ON, Code Protection=OFF,
//Data Protection=OFF,Brown-out Reset=ON, Clock out=OFF, I/E Switch over=off,
//Fail-Safe Clock Monitor Enable=OFF,Flash Memory Self Write Protection=OFF, PLL=OFF,
//Stack OF/UF Reset=ON, Brown-out=H-Volt,Incircuit Debug=OFF, LVP=OFF
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
typedef union{
uint da16;
uchar da8[2];
}WDATA;
WDATA addata; //A/D変換値
WDATA t1set; //タイマー1設定値
volatile long remain; //残り時間カウンタ
uint t_set30; //30分単位の設定値
uint hz; //周波数
uint p_rate; //分解能あたりのカウント数
volatile uint p_out; //位相差
uint adconv(){ //A/D変換(16回の平均)
int i;
uint adbuff;
adbuff = 0;
for(i=0; i<16; i++){
ADCON0.GO = 1;
while(ADCON0.GO);
addata.da8[0] = ADRESL;
addata.da8[1] = ADRESH;
adbuff += addata.da16;
}
adbuff += 8; //割る数の1/2を加える
adbuff = adbuff >> 4; // /16;
return adbuff;
}
void main() { //メインルーチン
int temp;
OSCCON = 0x7a; //内部 16MHz
FVRCON = 0x84; //DACREF=1.024V
DACCON0 = 0x88; //DAC ON FVR2
DACCON1 = 0x7; //DAC Level
TRISA = 0x3f; //all input
ANSELA = 0x3; //AN0,AN1
WPUA = 0; //PULL UP Disable
LATC = 0x10; //Output Level
TRISC = 0x2; //C1 input
ANSELC = 0; //all Digital
WPUC = 0; //PULL UP Disable
WDTCON = 0x15; //ウオッチドッグ1S
asm CLRWDT; //WDT CLR
if(PORTA.B2){
hz = 60; //60Hz
p_rate = 125;
}
else {
hz = 50; //50Hz
p_rate = 150;
}
while(1){
asm CLRWDT;
LATC.B2 = ~LATC.B2; //電源表示点滅
if(!PORTA.B5) temp = 1; //ON/OFF釦
else temp = 0;
Delay_ms(200);
if(temp && !PORTA.B5) break;
else temp = 0;
}
while(1){ //押釦OFF確認
asm CLRWDT;
if(PORTA.B5) temp = 1;
else temp = 0;
Delay_ms(50);
if(temp && PORTA.B5) break;
else temp = 0;
}
CCP1CON = 0x0c; //PWM P1A ACTIVE H
PR2 = 49; //サイクルタイム(49+1) x 0.0625 x 4uS x 16 = 200uS
CCPR1L = 25; //デューティー 25 x 0.0625uS x 4 x 16 をセット
T2CON = 0x6; //T2 ON プリスケーラー1/16
T1CON = 0x1; //T1 ON
CM1CON0 = 0x86; //Comparator Enable,higher speed,hysteresis enable
CM1CON1 = 0x51; //INT -,DAC VOLTAGE Reference,C12in1
ADCON0 = 0x01; //CH0 AD ON
ADCON1 = 0xa0; //右詰め、Fosc/32 REFF=V+
asm CLRWDT;
t_set30 = 1 + (adconv() >> 6); //時間設定(16ステップ)
remain = (long)hz*60L*60L*(long)t_set30; //残り時間を計算
ADCON0 = 0x05; //CH1 AD ON
p_out = 0xff - (adconv() >> 2); //位相遅れ(256ステップ)
t1set.da16 = 0xffff - p_out*p_rate; //タイマー1設定値
TMR1L = 0;
TMR1H = t1set.da8[1];
TMR1L = t1set.da8[0];
INTCON = 0xc0; //グローバル割り込み、周辺割り込み許可
PIE2.C1IE = 1; //コンパレータ割り込み許可
LATC.B2 = 1; //電源表示
while(1){
asm CLRWDT;
if(!PORTA.B5) temp = 1; //ON/OFF釦
else temp = 0;
p_out = 0xff - (adconv() >> 2); //位相遅れ(256ステップ)
PIE2.C1IE = 0;
t1set.da16 = 0xffff - p_out*p_rate; //タイマー1設定値
PIE2.C1IE = 1;
Delay_ms(50);
if(remain < 1)break; //タイムアップ
if(!PORTA.B5 && temp) break; //強制終了
else temp = 0;
}
while(1){ //押釦OFF確認
asm CLRWDT;
if(remain < 1) break;
if(PORTA.B5) temp = 1;
else temp = 0;
Delay_ms(50);
if(temp && PORTA.B5) break;
else temp = 0;
}
INTCON = 0; //終了処理
T1CON = 0;
T2CON = 0;
LATC = 0x10;
while(1); //WDTでリセット
}
void interrupt(){
if(PIR2.C1IF){ //C1割り込み
PIR2.C1IF = 0; //割り込みフラグクリア
if(remain > 0 && PORTA.B4)remain--; //残り時間を−
TMR1L = 0;
TMR1H = t1set.da8[1]; //タイマー値セット
TMR1L = t1set.da8[0];
if(p_out < 0x10)LATC.B3 = 1; //位相遅れが小さい時、出力表示ON
else LATC.B3 = 0; //それ以外は出力表示OFF
PIE1.TMR1IE = 1; //T1割り込み許可
}
if(PIR1.TMR1IF){ //T1割り込み
PIR1.TMR1IF = 0; //割り込みフラグクリア
PIE1.TMR1IE = 0; //T1割り込み禁止
if(p_out > 0xf0); //位相遅れが大きい時は何もしない
else{
LATC.B3 = 1; //出力表示ON
LATC.B4 = 0; //ゲートパルスON
Delay_us(200); //ゲート時間
}
if(p_out < 0x10); //位相遅れが小さいときは何もしない
else LATC.B4 = 1; //ゲートパルスOFF
}
}
![]() |
![]() |
![]() |
|---|---|---|
| 実験回路 | 0クロス波形 | 負荷電流 |
動作試験を行いましたが、前述したように完璧ではありません。
波形は電球を負荷にした時のもので、抵抗負荷の場合は問題ありません。
0クロス波形はPIC内蔵のコンパレータに入力して割り込みタイミングを作ります。
負荷電流は電源ラインに通したカレントトランスの負荷抵抗の端子電圧を表示しています。
(電流計測用のカレントトランスは回路図には記入されていません。)
オシロが年代物のポンコツですので最初の調光器を製作した時代の写真と思われそうですが、最新の実験です。
(当時はデジタルカメラが無かったので気軽に波形写真は撮れません。)
とりあえずトリガ方法を変えてみます。
現在、秋月にフォトトライアックを注文中です。
それでもダメならDIACやSBSによるトリガに戻し、タイマーのみPICで制御します。
とにかく、安定に動作し、実際に使える物を作るのが目的です。
ケースに収納して使い易くすることも大切です。
![]() |
![]() |
|---|---|
| 参考書1 | 参考書2 |

注文したフォトトライアックが入ったので回路を修正してみました。
とりあえずプログラムは以前のままで試してみました。
PWMも以前のまま動作していますが、回路が外されてしまったので無駄に動作しています。
結果として全体の動作は全く前と変わりませんでした。
電球のような抵抗負荷ではスムーズに動作するのですが、モーター負荷では、動作する筈の領域の一部で止まって
しまいます。
電流波形を観察すると交流の片側の半周期でトリガに失敗しているようですが、原因が判りません。
プログラムを修正したりしても改善しませんでした。
モーター負荷としては扇風機を使いました。
以前製作した調光器では扇風機の回転数を変速出来ていました。
扇風機はモーターとメカニカルスイッチだけのものしか使えません。
最近の高級な扇風機は電子回路が組み込まれているので駄目です。