目次

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記述で指定しておけば、必要なチャネル
 数を確保できるようになります。


目次

inserted by FC2 system