目次

インバータ実現

 インバータは、直流を交流に変換する装置の総称です。

 インバータの反対の操作である、交流から直流に変換する
 装置の総称が、コンバータです。

 +12V電池からAC100Vを生成する電源回路もインバータです。
 このインバータは非常に簡単で、次のブロック図と回路図に
 なります。



 電池、発振部分、波形生成器があれば、インバータは実現できます。

 発振部分をマイクロコンピュータで実現するのは、
 後で、いろいろとカラクリを入れられるからです。

 このインバータで出力できるAC100Vの波形は、矩形波です。

 マイコン出力波形と波形生成器のタイミングチャートは
 次のようになります。



 マイコンからパルスを出力するファームウエアは、簡単で
 使ったファームウエアのソースコードは、以下です。

#include <avr/io.h>
#include <avr/interrupt.h>

#define OFF 0
#define ON  OFF+1

#define MASK3F 0x3F
#define MASK01 0x01
#define MASK03 0x03
#define MASK40 0x40

#define CNT50 198
#define CNT60 165

typedef unsigned char  UBYTE ;
typedef unsigned short UWORD ;
typedef   signed char  SBYTE ;
typedef   signed short SWORD ;

volatile UBYTE tflag ;

volatile UBYTE state ;
volatile UBYTE bport ;
volatile UBYTE cntx  ;

volatile UBYTE tmp ;

/*--------------------------------*/
/* Insert user functions protoype */
/*--------------------------------*/
void  user_initialize(void);

/*------*/
/* main */
/*------*/
int main(void)
{
  /* initialize port and variables */
  user_initialize();
  /* enable interrupt */
  sei();
  /* endless loop */
  while ( ON ) {
    /* select frequency ? 50Hz / 60 Hz */
    tmp = PIND ;
    /* handling */
    if ( tflag ) {
      /* clear flag */
      tflag = OFF ;
      /* state control */
      switch ( state ) {
        case 0 : /* impress pulse */
                 bport ^= MASK03 ;
                 PORTB = bport ;
                 /* select frequency */
                 cntx = CNT50 ;
                 if ( tmp & MASK40 ) { cntx = CNT60 ; }
                 state = 1 ;
                 break ;
        case 1 : /* sustine */
                 if ( cntx == 0 ) { state = 3 ; }
                 else             { cntx-- ;    }
                 break ;
        case 3 : /* dead time */
                 PORTB = 0x00 ;
                 state = 2 ;
                 break ;
        case 2 : /* return first state */
                 state = 0 ;
                 break ;
        default :
                 state = 0 ;
                 break ;
      }
    }
  }
  /* dummy */
  return 0 ;
}

/*-----------------------*/
/* Insert user functions */
/*-----------------------*/
void user_initialize(void)
{
  /* PORT B */
  PORTB = 0b00000000 ; /* 00000000 */
  DDRB  = 0b11111111 ; /* oooooooo */
  /* PORT D */
  PORTD = 0b11111111 ; /* 11111111 */
  DDRD  = 0b00000000 ; /* iiiiiiii */
  /* clear flags */
  tflag = OFF ;
  /* clear counters */
  state = 0 ;
  cntx  = 0 ;
  bport = MASK01 ;
  /* initialize timer1 */
  {
    /* clear counter */
    TCNT1 = 0 ;
    /* initialize counter */
    OCR1A = 24 ;
    OCR1B = 99 ;
    /* set prescaler (/8) */
    /* select clock and prescaler (generate 20kHz) */
    TCCR1B = (1 << WGM12) | (1 << CS11) ;
    /* Enable interrupt */
    TIMSK = (1 << OCIE1A) ;
  }
}

/* Timer1 interrupt */
ISR(TIMER1_COMPA_vect)
{
  tflag = ON ;
}

 ファームウエアでは、シーケンサを利用しています。

 タイマー割込みでシーケンサを動かすタイミングを
 決めています。シーケンサは次の動作を繰返します。

  0ステート パルス幅用カウンタ設定
        ピン出力を01か10に設定
        1ステートに遷移

  1ステート パルス幅用カウンタが0なら、3ステートに遷移
        パルス幅用カウンタを減らす

  3ステート ピン出力を00に設定
        2ステートに遷移

  2ステート 0ステートに戻す

 ファームウエアは単純なので、次のようなカラクリを入れる
 余地があります。

 矩形波から正弦波にするには、マイコンからカウント値を
 出力してROMに与えます。ROMから正弦波を出力します。



 ファームウエアで発振器を実現する以外に、デジタル回路を
 利用することもできます。

 ファームウエアで実現している内容を、CPLDに入れる場合
 HDLを利用します。VHDLで、ファームウエアと同じ内容を
 実現する場合、次のように記述します。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity pwmcon is
  generic (
    TOPX : integer := 10 ; 
    RMAX : integer := 588 --;
  ) ;
  port(
    -- system
    nRESET  : in  std_logic ;
    CLOCK   : in  std_logic ;
    -- input
    SEL60Hz : in  std_logic ;
    -- output
    POUT    : out std_logic_vector(1 downto 0) --;
  );
end pwmcon;

architecture Behavioral of pwmcon is
  -- clock generator
  component clkgenx is
    generic (
      TOPX : integer ; 
      RMAX : integer --;
    );
    port (
      -- system
      nRESET : in  std_logic ;
      CLOCK  : in  std_logic ;
      -- output
      CLKOUT : out std_logic -- ;
    );
  end component;
  -- clock
  signal iPCLK  : std_logic ;
  --
  signal iSTATE : std_logic_vector(1 downto 0) ;
  signal iCNT   : integer range 0 to 100 ;
  signal iPOUT  : std_logic_vector(1 downto 0) ;

begin
  -- clock generator
  CLKX : clkgenx generic map (TOPX,RMAX) port map (nRESET,CLOCK,iPCLK) ;

  -- output
  POUT <= "00" when ( iSTATE(1) = '1' ) else iPOUT ;

  -- sequencer
  process (nRESET,iPCLK)
  begin
    if ( nRESET = '0' ) then
      iPOUT  <= "01" ;
      iSTATE <= "00" ;
      iCNT   <= 0 ;
    elsif rising_edge( iPCLK ) then
      case conv_integer(iSTATE) is
          -- impress pulse ("01" or "10")
          when 0 => iPOUT  <= iPOUT xor "11" ;
                    iSTATE <= "01" ;
                    if ( SEL60Hz = '1' ) then
                      iCNT <= 82 ;
                    else
                      iCNT <= 96 ;
                    end if ;
          -- delay
          when 1 => if ( iCNT = 0 ) then
                      iSTATE <= "11" ;
                    else
                      iCNT <= iCNT - 1 ;
                    end if ;
          -- impress "00"
          when 3 => iSTATE <= "10" ;
          -- return first state
          when 2 => iSTATE <= "00" ;
          when others =>
                    iSTATE <= "00" ;
      end case ;
    end if ;
  end process ;

end Behavioral;

 マイコン、CPLDで実現するインバータの電力変換
 回路の一例は、次の写真のようになります。



 大電流を流せるように、表面実装にしてあります。
 左側からパルスを入力し、右の2本のワイヤーを
 トランスに接続します。

 +12Vの電源から、パルス生成器であるマイコンに
 電源を供給するための+5V電圧レギュレータを用意
 しています。



 マイコンは、手持ちのATtiny2313ボードを利用しました。



 インバータの原理を理解すると、電圧、電流、周波数を
 思い通りに制御できるようになります。

 周波数について見ると、PLLを適用すると分周比を可変に
 することで発振周波数を可変にできます。

 電圧は、アンプ利用で振幅を可変とすれば、ある程度の範囲
 制限はありますが、可変にできます。

 電流は、I-V変換で電圧から電流に変換できるので、電圧
 可変にする操作ができれば、電流可変となります。
 電圧から電流に変換するには、極端なことを言えば、抵抗1本
 で実現可能です。

 このページで紹介した、直流を交流に変換する電源が
 インバータの基本です。

 電源の負荷に、熱交換器と誘導電動機を接続すると
 エアコンディショナになります。


目次

inserted by FC2 system