FPGA活用回路&サンプル記述集(2) ―― モータやLEDを駆動するパワー回路
tag: 半導体 電子回路 ディジタル・デザイン
技術解説 2009年3月 9日
事例4.パワー・デバイスをスイッチするためのデッド・タイム生成回路
浅井 剛
- 回路図:図4-1
- 主要部品:IGBT
- VHDL記述:リスト4-1
- 外部入力:なし
- 外部出力:PGATE,NGATE
- 内部入力:RES_n,CLK,DTIME,START,PULSEOUT
- 内部出力:なし
- パラメータ:なし
- 製品に搭載実績のある回路を本誌に抽出.
PWM(Pulse Width Modulation)のパルス信号を用いてIGBT(Insulated Gate Bipolar Transistor)などのパワー・デバイスをスイッチングすることがあります.図4-1に主回路も含めた構成を示します.右側にあるIGBTが交互にON/OFFを繰り返してインバータの出力を生成します.この種のデバイスはターンOFF遅延が大きく,この遅延を考慮しないと上下アームが同時にON状態となって短絡し,デバイスを破壊してしまいます.
図4-1 デッド・タイム生成部と外部ドライバ,IGBTとの接続
これを回避するために,一方が確実にターンOFFするまでもう一方をONさせないように制御する必要があります.この時間をデッド・タイムと呼びます.市販マイコンに搭載している汎用のタイマ・モジュールでも両アームの駆動パルスを一括管理できるものもあります(相補PWMサポート).これは,あくまでもレジスタ設定を間違いなく行った場合の話であり,もしマイコンが暴走したら動作は保証されません.
PWMの指令値(パルス出力信号)からデッド・タイムを付加した上下アームのゲート駆動信号を生成する際は,さまざまな意味でハードウェアの方が安心です.
図4-2にデッド・タイム制御モジュールDEADCTLのステート・マシンを示します.S0~S3を循環するだけのステート・マシンも見かけますが,これは停止中の上下両方のアームをOFFにする制御を外部で行っているものです.今回はその停止中の状態(SIステート)も含めています.
図4-2 デッド・タイム生成部のステート・マシン
リスト4-1にデッド・タイム制御モジュール(DEADCTL)のソース・コードを示します.図4-2で解説したステート・マシンとデッド・タイム確保用のカウンタから構成しています.
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity DEADCTL is
port(RES_n : in std_logic;
-- システム・リセット
CLK : in std_logic;
-- システム・クロック
DTIME : in std_logic_vector(8 downto 0);
-- デッドタイム設定値
START : in std_logic;
-- 動作開始信号
PULSEOUT : in std_logic;
-- パルス入力
PGATE : out std_logic;
-- 上側アーム・ゲート制御信号
NGATE : out std_logic
-- 下側アーム・ゲート制御信号
);
end DEADCTL;
architecture RTL_DEADCTL of DEADCTL is
signal DCOUNT : std_logic_vector(8 downto 0);
signal DCOUNTE, DCLR, DEND : std_logic;
signal CSTATE, NSTATE : std_logic_vector(2 downto 0);
begin
-- デッド・タイム・カウンタ本体
process(CLK, DCOUNTE, DCLR, DCOUNT)
begin
if CLK'event and CLK = '1' then
if DCLR = '1' then
DCOUNT <= "000000000";
else
if DCOUNTE = '1' then
DCOUNT <= DCOUNT + "000000001";
end if;
end if;
end if;
end process;
-- デッド・タイム・カウント終了フラグ生成
-- コンカレント文でも記述可能
process(DCOUNT, DTIME)
begin
if DCOUNT >= DTIME then
DEND <= '1';
else
DEND <= '0';
end if;
end process;
-- デッド・タイム制御ステート・マシン本体
USM:
process(RES_n, CLK, NSTATE)
begin
if RES_n = '0' then
CSTATE <= "000";
else
if CLK'event and CLK = '1' then
CSTATE <= NSTATE;
end if;
end if;
end process;
-- 次ステートのエンコーディング+ゲート制御出力生成
process(CSTATE, START, PULSEOUT, DEND)
begin
case CSTATE is
when "101" => -- S1(DeadToP)
DCLR <= '0'; DCOUNTE <= '1'; PGATE <= '0'; NGATE <= '0';
if DEND = '0' then
NSTATE <= "101"; -- S1(DeadToP)
else
NSTATE <= "111"; -- S2(Pon)
end if;
when "111" => -- S2(Pon)
DCLR <= '1'; DCOUNTE <= '0'; PGATE <= '1'; NGATE <= '0';
if PULSEOUT = '1' then
NSTATE <= "111"; -- S2(Pon)
else
NSTATE <= "110"; -- S3(DeadToN)
end if;
when "110" => -- S3(DeadToN)
DCLR <= '0'; DCOUNTE <= '1'; PGATE <= '0'; NGATE <= '0';
if DEND = '0' then
NSTATE <= "110"; -- S1(DeadToN)
else
NSTATE <= "100"; -- S0(Non)
end if;
when "100" => -- S0(Non)
DCLR <= '1'; DCOUNTE <= '0'; PGATE <= '0'; NGATE <= '1';
if PULSEOUT = '0' then
if START = '0' then
NSTATE <= "000"; -- SI(Idle)
else
NSTATE <= "100"; -- S0(Non)
end if;
else
NSTATE <= "101"; -- S1(DeadToP)
end if;
when others => -- SI(Idle)
DCLR <= '1'; DCOUNTE <= '0'; PGATE <= '0'; NGATE <= '0';
if START = '0' or PULSEOUT = '0' then
NSTATE <= "000"; -- SI(Idle)
else
NSTATE <= "101"; -- S1(DeadToP)
end if;
end case;
end process;
end RTL_DEADCTL;
リスト4-1 DEADCTLのソース・コード
あさい・たけし
(株)ネクスト・ディメンション
tag: FPGA