目次
前
次
ゼロクロスデバイス利用
AC100Vを利用する場合、位相を使って電力制御する
ことがあります。
電力のオン、オフする場合は、ゼロクロスが
可能なデバイスを利用。
手持ちのゼロクロスデバイスは、100V20Aまで
対応できるので、AC100Vの通電制御に利用しました。
2チャネルのAC100Vアウトレットで使える装置に
組み込んでみました。
前面
裏面
回路は、以下。
この回路は、Solid State Relayと呼ばれます。
トライアックで通電、切電を制御でき、ドリルのような
インダクタを使った装置にも対応可能。
交流の通電を、DC5V程度の電圧で制御できるので
最近の電子機器では、使われることが多くなって
きてました。
電子機器の中に、部品としてワンチップマイコンが
使われるようになってきたのがゼロクロスデバイス
を普及させた原因でしょう。
写真の通電装置は、次の回路で制御。
スイッチが押されるたびに、電圧レベルを変化させます。
トグル動作を実現する回路です。
ファームウエアは、以下。
/* redefine data type */
typedef unsigned char UBYTE ;
#define OFF 0
#define ON OFF+1
#define AOUT PORTA.F0
#define BOUT PORTA.F1
#define XPOUT PORTA.F2
#define ITMR 6
#define MASK30 0x30
#define MASK03 0x03
#define MASK33 0x33
volatile UBYTE tflag ;
volatile UBYTE atmp ;
volatile UBYTE btmp ;
volatile UBYTE sft ;
volatile UBYTE astate ;
volatile UBYTE bstate ;
volatile UBYTE inp ;
volatile UBYTE xcnt ;
/* function prototype */
void init_usr(void);
/* interrupt handler */
void interrupt(void)
{
/* generate 1ms */
if ( INTCON.TMR0IF == ON ) {
/* clear flag */
INTCON.TMR0IF = OFF ;
/* 256 - 250 = 6 */
TMR0 = ITMR ;
/* set flag */
tflag = ON ;
/* increment */
xcnt++ ;
/* monitor */
XPOUT = 0 ;
if ( xcnt & ON ) { XPOUT = 1 ; }
}
}
void main(void)
{
/* initialize */
init_usr();
/* endless loop */
while ( ON ) {
/* timer handling (1ms) */
if ( tflag == ON ) {
/* clear flag */
tflag = OFF ;
/* get switch state */
inp = PORTA ;
inp &= MASK30 ;
/* set current switch state */
atmp = inp & 0x20 ;
btmp = inp & 0x10 ;
/* shift register */
sft <<= 1 ;
/* mask */
sft &= MASK33 ;
/* update */
if ( atmp == 0 ) { sft |= 0x01 ; }
if ( btmp == 0 ) { sft |= 0x10 ; }
/* get current state */
atmp = sft & MASK03 ;
btmp = sft & MASK30 ;
/* judge */
if ( atmp == 0x01 ) {
astate++ ;
astate &= ON ;
}
if ( btmp == 0x10 ) {
bstate++ ;
bstate &= ON ;
}
}
/* state handling */
{
AOUT = astate & ON ;
BOUT = bstate & ON ;
}
}
}
/* define function body */
void init_usr(void)
{
/* select 4MHz */
OSCCON = (0x0d << 3) | 0x03 ;
/* disable A/D converter */
ADCON0.ADON = OFF ;
ADCON2 = 0 ;
ANSELA = 0 ;
/* disable D/A converter */
DACCON0 = 0 ;
DACCON1 = 0 ;
/* disable compare module */
CM1CON0.C1ON = OFF ;
CM1CON0.C1OE = OFF ;
/* I/O state */
PORTA = 0x00 ;
LATA = 0x00 ;
/* I/O directions */
TRISA = 0x38 ; /* bit0,1,2 as output , others as input */
/* pull up */
WPUA = 0x30 ;
/* initialize timer 0 */
{
/*
4MHz (Fosc)
Fosc/4 = 1MHz
1MHz/4 = 250kHz prescaler = 1:4
*/
OPTION_REG = 0x01 ;
/* 256 - 250 = 6 */
TMR0 = ITMR ;
/* enable timer0 overflow interrupt (1kHz) */
INTCON.TMR0IE = ON ;
}
/* enable general interrupt */
INTCON.GIE = ON ;
/* clear */
tflag = 0 ;
/* initialize variables */
sft = 0 ;
atmp = 0 ;
btmp = 0 ;
astate = 0 ;
bstate = 0 ;
xcnt = 0 ;
}
回路では、次のようにすれば充分。
目次
前
次