目次
前
次
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を利用すると、もう少し規模が
大きくなって基板サイズが必要に。
目次
前
次