目次

ゼロクロスデバイス利用

 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 ;
}

 回路では、次のようにすれば充分。




目次

inserted by FC2 system