目次
前
次
インバータ実現
インバータは、直流を交流に変換する装置の総称です。
インバータの反対の操作である、交流から直流に変換する
装置の総称が、コンバータです。
+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本
で実現可能です。
このページで紹介した、直流を交流に変換する電源が
インバータの基本です。
電源の負荷に、熱交換器と誘導電動機を接続すると
エアコンディショナになります。
目次
前
次