目次

Schumann resonance oscillator

 Schumann resonanceとは、地球の地表と電離層の間に
 存在している極極超長波で、周波数が7.83Hzです。
 1952年、ドイツの物理学者であるWinfried Otto Schumann博士
 が発見しました。

 Schumann resonanceの周波数で、電磁波を生成している場は
 リラックス効果がある空間になると言われています。

 CPLDを利用して、7.83Hzの電磁波を生成する回路を
 インダクタを利用して作ります。



 周波数7.83Hzのクロックを生成して、インダクタに流れる
 電流を制御します。7.83Hzは、10kHzを1277分周して生成
 します。

 インダクタに流す電流は、次のタイミングチャートで
 表現できます。



 電流を流す方向を変えると、磁界の方向が変わります。
 アンペールの右ねじの法則に従って、発生磁界の方向
 が変化します。

 タイミングチャートから、クロックで3進カウンタを
 動かし、デコーダで出力パターンを変更すればよいと
 理解できます。

 3進カウンタとデコーダのVHDLコードは、以下。

  -- counter
  process (nRESET,iSCLK)
  begin
    if ( nRESET = '0' ) then
      iXCNT <= 0 ;
    elsif rising_edge(iSCLK) then
      if ( iXCNT = 2 ) then
        iXCNT <= 0 ;
      else
        iXCNT <= iXCNT + 1 ;
      end if ;
    end if ;
  end process ;

  -- decode
  iLEFT <= "101101" when ( iXCNT = 1 ) else
           "011011" when ( iXCNT = 2 ) else
           "110110" ;

  iRIGHT <= "101101" when ( iXCNT = 1 ) else
            "110110" when ( iXCNT = 2 ) else
            "011011" ;

 回転方向の切替えスイッチを利用し、出力パターンを
 変えられるようにします。

  LOUT <= iLEFT when ( SEL = '1' ) else iRIGHT ;

 CPLDには、XC9536を利用することとし、システムクロック
 を4MHzにしておきます。

 7.83kHzを生成するために、4MHzから10kHzを生成し
 10kHzを1277分周します。



 2つの分周器を利用し、7.83Hzを生成するVHDLコード
 は、以下。

  -- generate 10kHz
  process (nRESET,CLOCK)
  begin
    if ( nRESET = '0' ) then
      iCNT <= 0 ;
    elsif rising_edge(CLOCK) then
      if ( iCNT = CNTMAX ) then
        iCNT <= 0 ;
      else
        iCNT <= iCNT + 1 ;
      end if ;
    end if ;
  end process ;
  iCLK <= '1' when ( iCNT < CNTHALF ) else '0' ;

  -- generate 7.83kHz
  process (iCLK)
  begin
    if rising_edge(iCLK) then
      if ( iSCNT = SCNTMAX ) then
        iSCNT <= 0 ;
      else
        iSCNT <= iSCNT + 1 ;
      end if ;
    end if ;
  end process ;
  iSCLK <= '1' when ( iSCNT < SCNTHALF ) else '0' ;

 全体では、以下となります。

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

entity tstsch is
  port (
    -- system
    nRESET : in  std_logic ;
    CLOCK  : in  std_logic ; -- 4MHz
    -- selector
    SEL    : in  std_logic ;
    -- LED control
    LOUT   : out std_logic_vector(5 downto 0) ;
    -- output
    MOUT   : out std_logic_vector(1 downto 0) -- ;
  );
end tstsch ;

architecture behavioral of tstsch is
  --
  CONSTANT CNTMAX   : integer :=  399 ;
  CONSTANT CNTHALF  : integer :=  200 ;
  CONSTANT SCNTMAX  : integer := 1276 ;
  CONSTANT SCNTHALF : integer :=  638 ;
  -- divider (generate 10kHz)
  signal iCNT : integer range 0 to CNTMAX ;
  signal iCLK : std_logic ;
  -- counter (generate 7.83Hz)
  signal iSCNT : integer range 0 to SCNTMAX ;
  signal iSCLK : std_logic ;
  -- counter
  signal iXCNT : integer range 0 to 2 ;
  -- decode 
  signal iLEFT  : std_logic_vector(5 downto 0);
  signal iRIGHT : std_logic_vector(5 downto 0);
begin
  -- output
  LOUT <= iLEFT when ( SEL = '1' ) else iRIGHT ;

  -- monitor 
  MOUT <= iSCLK & iCLK ;

  -- generate 10kHz
  process (nRESET,CLOCK)
  begin
    if ( nRESET = '0' ) then
      iCNT <= 0 ;
    elsif rising_edge(CLOCK) then
      if ( iCNT = CNTMAX ) then
        iCNT <= 0 ;
      else
        iCNT <= iCNT + 1 ;
      end if ;
    end if ;
  end process ;
  iCLK <= '1' when ( iCNT < CNTHALF ) else '0' ;

  -- generate 7.83kHz
  process (iCLK)
  begin
    if rising_edge(iCLK) then
      if ( iSCNT = SCNTMAX ) then
        iSCNT <= 0 ;
      else
        iSCNT <= iSCNT + 1 ;
      end if ;
    end if ;
  end process ;
  iSCLK <= '1' when ( iSCNT < SCNTHALF ) else '0' ;

  -- counter
  process (nRESET,iSCLK)
  begin
    if ( nRESET = '0' ) then
      iXCNT <= 0 ;
    elsif rising_edge(iSCLK) then
      if ( iXCNT = 2 ) then
        iXCNT <= 0 ;
      else
        iXCNT <= iXCNT + 1 ;
      end if ;
    end if ;
  end process ;

  -- decode
  iLEFT <= "101101" when ( iXCNT = 1 ) else
           "011011" when ( iXCNT = 2 ) else
           "110110" ;

  iRIGHT <= "101101" when ( iXCNT = 1 ) else
            "110110" when ( iXCNT = 2 ) else
            "011011" ;

end behavioral;

 ピンアサインは、以下。

# system
NET "CLOCK"  LOC = "P5"  ;
NET "nRESET" LOC = "P39" ;

# monitor 
NET "MOUT<0>" LOC = "P1" ;
NET "MOUT<1>" LOC = "P2" ;

# selector
NET "SEL" LOC = "P3" ;

# LED control
NET "LOUT<0>" LOC = "P11" ;
NET "LOUT<1>" LOC = "P12" ;
NET "LOUT<2>" LOC = "P13" ;
NET "LOUT<3>" LOC = "P14" ;
NET "LOUT<4>" LOC = "P18" ;
NET "LOUT<5>" LOC = "P19" ;

 ドライブ回路は、次のようにします。



 個別のデジタルICを利用すると、次の
 ように大掛かりになります。



 デコーダにEPROMを使ったので、カウンタ
 だけになっていますが、ディスクリートの
 デジタルICを利用すると、もう少し規模が
 大きくなって基板サイズが必要に。


目次

inserted by FC2 system