AC電力制御V2
概要
商用電圧(AC100V)を制御するユニットは、以前にも製作しました。AC電力制御
今回は制御する方式を変えてみました。
動作原理
AC100Vを制御する方式はいろいろと考えられます。
- 図A電圧そのものを変化させる方式です。通常スライダック(SLIDAC)を使用します。
取り出せる電流容量が大きくなると高価(2万円前後)になります。(接点寿命有り) - 図B電圧の波形を変化させる方式です。通常トライアック+ダイアックを使用します。
電圧が急激に立ち上がる(最大では0V→140V)のでノイズが発生します。(接点寿命無し) - 図C電圧の波形の数を変化させる方式です。
波形の数を減らせていくと照明器具などではチラツキが発生します。(接点寿命無し)
今回は、図Cの電圧の波形の数を変化させる方式を採用してみました。
AC電圧の波形の開始タイミングは、次のようにして得ることが出来ます。
- 5V~10VくらいのAC電圧をダイオードで半波電圧とします。
- その電圧をフォトカプラに入力します。
- その出力をPICの割り込み信号とします。
AC電圧のON/OFFには、ゼロクロスタイプのソリッドステートリレー(Solid State Relay)を使用します。
通常のリレーは電磁石と接点からなるスイッチを構成しますが、これはその動作を半導体によって実現させた電子部品です。
入力段(電磁石相当部)にLED等の光半導体を用い、出力段(接点部)にトランジスタやトライアック等の半導体制御回路を用いるため、高速応答が可能で、かつ、接点寿命が無いという特徴を持っています。
回路図
ソースコード
- acControl3.c
//********************************************************************** /* 『AC電力制御ユニット』 */ //********************************************************************** static unsigned char FLAG; void interrupt(){ if (INTCON.INTF == 1) { INTCON.INTF = 0; FLAG = 1; } } //********************************************************************** void main() { static unsigned char buf[6], cnt, onCnt, offCnt; // OSCCON = 0b01110000; // クロックは8Mhz CMCON = 0b00000111; // コンパレータは使用しない。 // A/D変換を使用する。 ANSEL = 0b00000010; // ポートを初期化する。 TRISA = 0b00111010; TRISB = 0b00001111; // 入力割り込みの設定 INTCON.INTE = 1; INTCON.INTF = 0; OPTION_REG.INTEDG = 1; // LCDを初期化する。 Lcd_Custom_Config(&PORTB,4,5,6,7,&PORTA,0,7,6); Lcd_Custom_Cmd(LCD_CURSOR_OFF); Lcd_Custom_Cmd(LCD_CLEAR); Lcd_Custom_Out(1, 1, "AC-controller V3"); Delay_ms(500); // Lcd_Custom_Cmd(LCD_CLEAR); // INTCON.PEIE = 1; // これ以降の処理で割り込みを許可する。 INTCON.GIE = 1; // これ以降の処理で割り込みを許可する。 // PORTA.F2 = 0; FLAG = 0; onCnt = 5; offCnt = 5; // WordToStr(onCnt * 10, buf); Lcd_Custom_Out(2, 1, buf); Lcd_Custom_Out(2, 6, "%"); while (1) { for (cnt = 0; cnt < onCnt; cnt++) { while (FLAG == 0) ; FLAG = 0; PORTA.F2 = 1; } for (cnt = 0; cnt < offCnt; cnt++) { while (FLAG == 0) ; FLAG = 0; PORTA.F2 = 0; } // if (PORTA.F5 == 0) { while (PORTA.F5 == 0) Delay_ms(1); onCnt++; if (onCnt > 10) onCnt = 0; offCnt = 10 - onCnt; // WordToStr(onCnt * 10, buf); Lcd_Custom_Out(2, 1, buf); Lcd_Custom_Out(2, 6, "%"); } } } //**********************************************************************



























