目次
前
次
SSR(Solid State Relay)制御
SSR(Solid State Relay)は、AC100Vのオンオフを
制御できるデバイスです。
SSRは、論理レベルの'1'を与えると、通電し
'0'を与えると切断します。
ディスクリートの回路は、以下。
上の場合、2チャネル分のSSRを制御できます。
SSRを3個制御する場面が発生したので、スイッチを使い
個別の通電を1個のPLDで処理します。
1個のSSRの制御回路は、次のブロック図で対応します。
T型フリップフロップで、状態を遷移させることから
2ビットのカウンタで状態を更新させます。
2ビットのカウンタは、バイナリカウンタで2進数では
00→01→10→11→00→01→...と変化するので、LSBだけ
をみると、0→1→0→1→...と更新されていきます。
スイッチを押すたびに、状態を遷移させるのと
2ビットのバイナリカウンタのLSB変化が等価
であることを利用。
カウンタは、edge detector(エッジ検出器)から
出力されるトリガーで、インクリメントするように
構成します。
process ( nRESET , CLOCK )
begin
if ( nRESET = '0' ) then
iCNTA <= "00" ;
elsif rising_edge( CLOCK ) then
if ( iATRG = '1' ) then
iCNTA <= iCNTA + '1' ;
end if ;
end if ;
end process ;
カウンタの2ビットを出力し、LSBだけを
SSRに接続すれば、制御可能に。
edge detector(エッジ検出器)は、2ビットの
シフトレジスタを利用して構成します。
process ( nRESET , CLOCK )
begin
if ( nRESET = '0' ) then
iASFT <= "00" ;
elsif rising_edge( CLOCK ) then
iASFT <= iASFT(0) & iDin(0) ;
end if ;
end process ;
iATRG <= '1' when ( iASFT = "01" ) else '0' ;
スイッチは、負論理で動く仕様ならば
入力してから内部で反転すればよいはず。
iDin <= not Din ;
3スイッチを利用する仕様から、VHDLコードにまとめます。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity rbox is
port (
-- system
nRESET : in std_logic ;
CLOCK : in std_logic ;
-- trigger
Din : in std_logic_vector(2 downto 0) ;
-- control out
ASW : out std_logic_vector(1 downto 0) ;
BSW : out std_logic_vector(1 downto 0) ;
CSW : out std_logic_vector(1 downto 0) --;
) ;
end rbox;
architecture Behavioral of rbox is
-- trigger input
signal iDin : std_logic_vector(2 downto 0) ;
-- internal trigger
signal iATRG : std_logic ;
signal iBTRG : std_logic ;
signal iCTRG : std_logic ;
-- internal shift register
signal iASFT : std_logic_vector(1 downto 0) ;
signal iBSFT : std_logic_vector(1 downto 0) ;
signal iCSFT : std_logic_vector(1 downto 0) ;
-- counter
signal iCNTA : std_logic_vector(1 downto 0) ;
signal iCNTB : std_logic_vector(1 downto 0) ;
signal iCNTC : std_logic_vector(1 downto 0) ;
begin
-- input
iDin <= not Din ;
-- output
ASW <= iCNTA ;
BSW <= iCNTB ;
CSW <= iCNTC ;
-- synchronizer
process ( nRESET , CLOCK )
begin
if ( nRESET = '0' ) then
iASFT <= "00" ;
iBSFT <= "00" ;
iCSFT <= "00" ;
elsif rising_edge( CLOCK ) then
iASFT <= iASFT(0) & iDin(0) ;
iBSFT <= iBSFT(0) & iDin(1) ;
iCSFT <= iCSFT(0) & iDin(2) ;
end if ;
end process ;
iATRG <= '1' when ( iASFT = "01" ) else '0' ;
iBTRG <= '1' when ( iBSFT = "01" ) else '0' ;
iCTRG <= '1' when ( iCSFT = "01" ) else '0' ;
-- counter
process ( nRESET , CLOCK )
begin
if ( nRESET = '0' ) then
iCNTA <= "00" ;
iCNTB <= "00" ;
iCNTC <= "00" ;
elsif rising_edge( CLOCK ) then
if ( iATRG = '1' ) then
iCNTA <= iCNTA + '1' ;
end if ;
if ( iBTRG = '1' ) then
iCNTB <= iCNTB + '1' ;
end if ;
if ( iCTRG = '1' ) then
iCNTC <= iCNTC + '1' ;
end if ;
end if ;
end process ;
end Behavioral;
XC9536に入れるために、ピンアサインを決定します。
# system
NET "CLOCK" LOC = "P5" ;
NET "nRESET" LOC = "P39" ;
# data in (B)
NET "Din<0>" LOC = "P1" ;
NET "Din<1>" LOC = "P2" ;
NET "Din<2>" LOC = "P3" ;
# ssr output
NET "ASW<0>" LOC = "P11" ;
NET "BSW<0>" LOC = "P12" ;
NET "CSW<0>" LOC = "P13" ;
NET "ASW<1>" LOC = "P14" ;
NET "BSW<1>" LOC = "P18" ;
NET "CSW<1>" LOC = "P19" ;
利用するスイッチは、次のようなモノです。
SSRとスイッチを使って動かすAC100Vの通電装置は、以下を想定。
写真の装置では、2チャネル分のAC100Vの通電が可能ですが
ゲート数の多いCPLDを使えば4チャネル、5チャネルとACの
アウトレット数を増やすことが可能に。
SSRを制御する1チャネル分のVHDLコードを作成し
component記述で指定しておけば、必要なチャネル
数を確保できるようになります。
目次
前
次