■デジタルポテンショメータのワイピングポジション制御 |
アンプのゲインコントロールや電圧リファレンスなどの小技で威力を発揮するのがデジタルポテンショメータです。デジタルポテンショメータには、UP/DOWNだけ入力するものもありますが、やはり実際に数値をセットするタイプが使いやすいです。
但し、やはりシリアルでデータセットするタイプがほとんどなので、ちょっと制御が面倒になります。 |
MAX5402のデータシート(MAIXM)
|
|
■動作説明とレジスタ表 |
用意するレジスタを示します。このデジタルポテンショメータはSCLKと同期したタイミングでデータを出すのでSCLKを用意します。カタログデータからSCLKは、10MHz(High40nsec以上)以下ですのでこの間で設定します。
セットするデータのビット数は8bitですので、ワイピングポジションとして、r_dataに8bitとっておきます。
また、CSがLOWで読み込み開始、SCLKの立ち上がりでデータ読み込みですので、次のような動作になります。。
動作は、
@Call_rをたち下げ、デジタルポテンショメータへのデータセットを開始する。
Aデータを8bit入力するまで、SCLK毎にr_dataを1ビットずつセットしていく。。
B8bit書き込みが終わったらCall_rをHIGHにする。
という形で動いています。
注意)デジタルポテンショメータの精度はそんなに高くありません。計測用途などに使用する場合は、使用前の検定が必要でしょう。
|
緒言 |
レジスタ名 |
タイプ名 |
説明 |
入力I/O |
clk: |
in std_logic; |
メインクロックです。ここでは、デジタルポテンショの動作周波数にあわせてます。 |
出力I/O |
sclk: |
out std_logic; |
デジタルポテンショメータとの同期クロックです。 |
r_din: |
out std_logic; |
ワイピングポジションをシリアルで転送する。 |
call_r: |
out std_logic; |
デジタルポテンショメータへのデータ設定を行います。 |
コントロールフラグ |
call_pot: |
std_logic; |
デジタルポテンショメータへのデータ転送処理を呼び出す。 |
busy_r: |
std_logic; |
デジタルポテンショメータ設定中を示す。 |
内部レジスタ |
r_count: |
std_logic_vector(3 downto 0); |
デジタルポテンショメータへのデータ転送ステップを管理する。 |
r_data: |
std_logic_vector(7 downto 0); |
ワイピングポジションを設定する。 |
|
■VHDLソース |
VHDLソース |
entity D_potention is
Port (
CLK: in STD_LOGIC;
SCLK: out STD_LOGIC;
R_DIN: out STD_LOGIC;
CALL_R: out STD_LOGIC
);
end D_potention;
architecture Behavioral of D_potention is
signal busy_R: std_logic;
signal call_pot: std_logic;
signal R_count: std_logic_vector( 3 downto 0);
signal R_DATA: std_logic_vector( 7 downto 0);
begin
SCLK <= not(clk);
------------------------------------------------------
--使用するプロセス内に、ここの部分を入れてください。
------------------------------------------------------
R_DATA<= "8bitの整数:ワイピングポジション";
cls_r <= '1';
if fin_r='0' and busy_r = '1' then
call_pot <= '1';
cls_r <= '0';
end if;
if fin_r='1' then
flag <='1'; -- 逐次的に処理がしたい場合は、
フラッグを使用して処理をとばさないようにする。
end if;
------------------------------------------------------------
-------- デジタルポテンショメータ書き込み ---------
------------------------------------------------------------
process (clk)
begin
if clk'event and clk='1' then
if cls_r = '1' then
fin_r <='0';
end if;
if call_pot='1' then
if busy_r='0' then
busy_r <='1';
end if;
end if;
if busy_r <= '1' then
R_count <= R_count + 1 ;
case R_count is
when "0001" =>
CALL_R <='0';
R_DIN <= R_DATA(7);
when "0010" =>
R_DIN <= R_DATA(6);
when "0011" =>
R_DIN <= R_DATA(5);
when "0100" =>
R_DIN <= R_DATA(4);
when "0101" =>
R_DIN <= R_DATA(3);
when "0110" =>
R_DIN <= R_DATA(2);
when "0111" =>
R_DIN <= R_DATA(1);
when "1000" =>
R_DIN <= R_DATA(0);
when "1001" =>
CALL_R <='1';
R_count <="0000";
fin_r <='1';
busy_r <='0';
when others =>
null;
end case;
end if;
end if;
end if;
end process;
end Behavioral;
|
|
|
Copyright (C) 錬金術師Masa
初版:2004年8月26日
更新:2005年8月07日
http://www.katch.ne.jp/~mh_524-1997/
|