====== 簡易AC電力制御(波数調整) ======
===== 概要 =====
以前に製作した、AC電力制御V2の部品点数を減らした、簡易版を製作しました。
<仕様>
* 出力波数の比率を、0%、50%、60%、70%、80%、100%の7段階に調整できます。
* 60Hz、50Hzの商用電源に対応します。
* 比率及び商用電源のモードを、内蔵のEEPROMに記憶し、起動毎の調整作業を不要としました。
* 波形のON/OFF制御は、ゼロクロス方式を採用し、ノイズの発生を防ぎます。
===== 動作原理(ハードウェア) =====
以前に製作した、AC電力制御V2では、精度を上げるために、商用電源(AC100V)の波形に同期させる方式としましたが、今回は、若干精度は落ちますが、非同期方式を採用し、部品点数を少なくしました。
◎出力波形
{{:imgpaste:202004:htmikan-20200429-142404.png?500}}
|<500px>|
^ | 0% | 50% | 60% | 70% | 80% | 90% | 100% |
| ON:OFFの比率 | 0:1 | 1:1 | 3:2 | 7:3 | 4:1 | 9:1 | 1:0 |
◎比率(%)の表示
LEDを6個使用して、表示します。
|<500px>|
| | 0% | 50% | 60% | 70% | 80% | 90% | 100% |
| LED1 | 〇 | ● | 〇 | 〇 | 〇 | 〇 | 〇 |
| LED2 | 〇 | 〇 | ● | 〇 | 〇 | 〇 | 〇 |
| LED3 | 〇 | 〇 | 〇 | ● | 〇 | 〇 | 〇 |
| LED4 | 〇 | 〇 | 〇 | 〇 | ● | 〇 | 〇 |
| LED5 | 〇 | 〇 | 〇 | 〇 | 〇 | ● | 〇 |
| LED6 | 〇 | 〇 | 〇 | 〇 | 〇 | 〇 | ● |
◎商用電源(100V)のON/OFF
秋月電子で販売している、ゼロクロスタイプの「ソリッド・ステート・リレー(SSR)キット」を使用します。
===== 動作原理(ソフトウェア) =====
◎メイン処理
* 起動時にスイッチ(SW1)が、ONであれば、商用電源モード設定処理を呼び出します。
* EEPROMに書き込まれている、商用電源モード(60Hzまたは50Hz)の値を読み込みます。(cycle)
* EEPROMに書き込まれている、波数比率の値を読み込みます。(ratio)
* 割り込み処理を発生させるための、タイマーを起動します。
* スイッチ(SW1)が押下されるのを待ちます。
* 波数比率の値をインクリメントします。\\ 0%→50%→60%→70%→80%→100%→0%→・・・・・・・・・・
* 波数比率の値をEEPROMに書き込みます。
◎商用電源モード設定処理
* 既定値は、60Hzです。
* スイッチ(SW1)が押下される毎に、50Hz(LED7点灯)、60Hz(LED7消灯)を繰り返します。
* 商用電源モードの値をEEPROMに書き込みます。
* 再起動で、通常の処理に戻ります。
◎LED点灯処理
* 3個のポートを使用して、6個のLEDを点灯させます。
* 仕組みについては、簡易レベルメータ(LED×12個)を参照してください。
◎割り込み処理
* CCPとTIMER1を使用して、割り込みを発生させます。(init_ccp_compare関数)\\ 商用電源が、60Hzの場合には、16.7msecの割り込み周期に設定します。\\ 商用電源が、50Hzの場合には、20.0msecの割り込み周期に設定します。
* 設定された波数(比率)に応じて、SSRをON/OFFさせます。
* 1秒周期で、LED7を点滅させます。
===== 回路図 =====
{{:imgpaste:202004:htmikan-20200429-143241.png}}
===== ソースコード =====
//**********************************************************************
/*
<簡易AC電力制御(波数調整)>
*/
//**********************************************************************
//SWITCH
sbit SW at GPIO.B3;
sbit SSR at GPIO.B5;
sbit LED at GPIO.B4;
//LED
#define LED_OFF 0
#define LED1 1
#define LED2 2
#define LED3 3
#define LED4 4
#define LED5 5
#define LED6 6
//OTHER
#define CYCLE_60HZ 0
#define CYCLE_50HZ 1
#define BYTE unsigned short
#define WORD unsigned int
//波形パターン
WORD ratio_pattern[] = {
0b0000000000000000, // 0%
0b0000001010101010, // 50%
0b0000001110011100, // 60%
0b0000001111111000, // 70%
0b0000001111011110, // 80%
0b0000001111111110, // 90%
0b0000001111111111 //100%
};
//**********************************************************************
extern void main();
extern void init_ccp_compare();
extern void interrupt();
extern void led_cntl(short num);
extern void switch_on_check();
extern void set_mode();
extern void opening_demonstration();
//**********************************************************************
//■■■メイン関数■■■
BYTE ratio;
BYTE cycle;
void main()
{
OSCCON = 0b01110000;
CMCON0 = 0b00000111;
ANSEL = 0b00000000;
TRISIO = 0b00001000;
//
SSR = 0;
LED = 0;
//
opening_demonstration();
//
if (SW == 0) {
while (Button(&GPIO, 3, 1, 1) == 0)
;
//
set_mode();
}
//周波数の読み込み
cycle = EEPROM_Read(0);
if (cycle >= 2) {
cycle = CYCLE_60HZ;
}
//波形パターンの読み込み
ratio = EEPROM_Read(1);
if (ratio >= 7) {
ratio = 0;
}
led_cntl(ratio);
//
init_ccp_compare();
// 割り込みを許可します。
INTCON.PEIE = 1;
INTCON.GIE = 1;
//
while (1) {
switch_on_check();
ratio++;
if (ratio == 7) {
ratio = 0;
}
EEPROM_Write(1, ratio);
led_cntl(ratio);
}
}
//**********************************************************************
void opening_demonstration()
{
short cnt1, cnt2;
//
for (cnt1 = 0; cnt1 < 5; cnt1++) {
for (cnt2 = 0; cnt2 < 7; cnt2++) {
LED_cntl(cnt2);
Delay_ms(30);
}
for (cnt2 = 0; cnt2 < 7; cnt2++) {
LED_cntl(6 - cnt2);
Delay_ms(30);
}
}
led_cntl(LED_OFF);
}
//**********************************************************************
void set_mode()
{
short cnt;
//
for (cnt = 0; cnt < 5; cnt++) {
LED = 1;
Delay_ms(100);
LED = 0;
Delay_ms(100);
}
//60Hz(既定値)
EEPROM_Write(0, CYCLE_60HZ);
while (1) {
//50Hz
switch_on_check();
EEPROM_Write(0, CYCLE_50HZ);
LED = 1;
//60Hz
switch_on_check();
EEPROM_Write(0, CYCLE_60HZ);
LED = 0;
}
}
//**********************************************************************
void led_cntl(short num)
{
switch (num) {
case LED_OFF:
TRISIO.B0 = 1;
TRISIO.B1 = 1;
TRISIO.B2 = 1;
break;
case LED1:
TRISIO.B0 = 0;
TRISIO.B1 = 0;
TRISIO.B2 = 1;
GPIO.B0 = 1;
GPIO.B1 = 0;
break;
case LED2:
TRISIO.B0 = 0;
TRISIO.B1 = 0;
TRISIO.B2 = 1;
GPIO.B0 = 0;
GPIO.B1 = 1;
break;
case LED3:
TRISIO.B0 = 0;
TRISIO.B1 = 1;
TRISIO.B2 = 0;
GPIO.B0 = 1;
GPIO.B2 = 0;
break;
case LED4:
TRISIO.B0 = 0;
TRISIO.B1 = 1;
TRISIO.B2 = 0;
GPIO.B0 = 0;
GPIO.B2 = 1;
break;
case LED5:
TRISIO.B0 = 1;
TRISIO.B1 = 0;
TRISIO.B2 = 0;
GPIO.B1 = 1;
GPIO.B2 = 0;
break;
case LED6:
TRISIO.B0 = 1;
TRISIO.B1 = 0;
TRISIO.B2 = 0;
GPIO.B1 = 0;
GPIO.B2 = 1;
break;
}
}
//**********************************************************************
void switch_on_check()
{
while (Button(&GPIO, 3, 1, 0) == 0)
;
while (Button(&GPIO, 3, 1, 1) == 0)
;
}
//**********************************************************************
void init_ccp_compare()
{
// CCPの設定
PIE1.CCP1IE = 1;
PIR1.CCP1IF = 0;
CCP1CON = 0b00001011;
if (cycle == CYCLE_60HZ) {
CCPR1L = 0x35; // 60Hz...(1÷8000000)*4*33333
CCPR1H = 0x82;
} else {
CCPR1L = 0x40; // 50Hz...(1÷8000000)*4*40000
CCPR1H = 0x9C;
}
// TIMER1の設定
PIE1.TMR1IE = 0;
PIR1.TMR1IF = 0;
TMR1L = 0;
TMR1H = 0;
T1CON.T1CKPS0 = 0;
T1CON.T1CKPS1 = 0;
T1CON.TMR1ON = 1;
}
//**********************************************************************
short cnt = 0;
short cnt2 = 0;
void interrupt()
{
WORD tmp;
//
if (PIR1.CCP1IF == 1) {
PIR1.CCP1IF = 0;
//
tmp = ratio_pattern[ratio];
if (((tmp >> cnt) & 0x0001) == 1) {
SSR = 1;
} else {
SSR = 0;
}
cnt++;
if (cnt == 10) {
cnt = 0;
}
//
cnt2++;
if (cnt2 == 30) {
cnt2 = 0;
LED = ~LED;
}
}
}
//**********************************************************************
===== 動作確認 =====
{{:imgpaste:202004:htmikan-20200429-143343.png?500}}
比率(0%)の時のLED(全て消灯)と波形です。
波形の黄色は、SSRのON/OFF制御波形です。
波形の青色は、商用電源の出力波形です。
{{:imgpaste:202004:htmikan-20200429-143417.png}}{{:imgpaste:202004:htmikan-20200429-143421.png}}
比率(50%)の時のLED1(点灯)と波形です。
{{:imgpaste:202004:htmikan-20200429-143429.png}}{{:imgpaste:202004:htmikan-20200429-143434.png}}
比率(60%)の時のLED2(点灯)と波形です。
{{:imgpaste:202004:htmikan-20200429-143439.png}}{{:imgpaste:202004:htmikan-20200429-143443.png}}
比率(70%)の時のLED3(点灯)と波形です。
{{:imgpaste:202004:htmikan-20200429-143448.png}}{{:imgpaste:202004:htmikan-20200429-143452.png}}
比率(80%)の時のLED4(点灯)と波形です。
{{:imgpaste:202004:htmikan-20200429-143456.png}}{{:imgpaste:202004:htmikan-20200429-143459.png}}
比率(90%)の時のLED5(点灯)と波形です。
{{:imgpaste:202004:htmikan-20200429-143504.png}}{{:imgpaste:202004:htmikan-20200429-143507.png}}
比率(100%)の時のLED6(点灯)と波形です。
{{:imgpaste:202004:htmikan-20200429-143512.png}}{{:imgpaste:202004:htmikan-20200429-143515.png}}
電球を接続してみました。
{{:imgpaste:202004:htmikan-20200429-143521.png}}{{:imgpaste:202004:htmikan-20200429-143524.png}}
如何ですか?
商用電源(AC100V)の波数を調整するため、電球などに使用するとチラツキが発生しますが、半田ごての温度調整などには、ノイズも発生しないので、丁度良いのではと思います。^_^
このページは稲崎様の閉鎖したHPのコピーで、著作権は稲崎様にあります。[[elechobby:picdic:picdic|詳細]]
This page is a copy of Mr. Inasaki's closed website, and the copyright is held by him.[[elechobby:picdic:picdic|Details]]