FPGA活用回路&サンプル記述集(1) ―― アナログ信号入出力回路

石谷 真

● センサの電圧を読み取る方法

 図1-3にA-Dコンバータへセンサの電圧を入力する回路を示します.±10V,8チャネルのセンサ出力に対応するため,アナログ・マルチプレクサ「DG408」(米国Maxim Integrated Products社)を使用しました.アナログ・マルチプレクサの信号セレクト入力は,CMOSレベルで直接FPGAからの制御が可能です.またアナログ入力は±10Vまで対応可能です.

zu01_03.gif
図1-3 複数のアナログ入力から一つのチャネルだけを選択する回路

 A-Dコンバータの入力は0?3Vなので,±10Vを0?3Vに変換するための反転増幅OPアンプを配置しました.また,マルチプレクサからの入力が0Vのとき,A-Dコンバータへの入力電圧が1.5Vになるようにオフセット電圧発生用OPアンプを配置しています.それぞれ可変抵抗を配置し,調整できるようにしています.
  出力電圧Vout=-Rout(Vin/Rin+Voff/Roff)
となります.リスト1-2に制御例を示します.


module dg408cnt(ck,res,adbusy,adrs,adtrg);
input ck;
input res;
input adbusy;
output adtrg;//ad trg
output [2:0]adrs;//MPX adrs
//wtimer (2us)
reg [1:0] wtimer;
reg adtrg;
reg ads;
reg [2:0] adrs;
wire adrsup;
wire snoend;
assign snoend = (wtimer == 2'd3); ←※3
 
assign adrsup = (~adbusy && ads); ←セレクト信号の切り替えトリガ信号
always @(posedge ck)begin
    if (res) wtimer <= 2'b0;
    else if (adbusy) wtimer <= 2'b0;
    else if (~snoend) wtimer <= wtimer + 2'b1;
end
//adtrg
always @(negedge ck)begin
    if (res) adtrg <= 1'b0;
    else if (adbusy) adtrg <= 1'b0; ←A-Dコンバータ変換開始トリガ信号生成
    else if (snoend) adtrg <= 1'b1;
end
//ads : adbusy delay
always @(posedge ck)begin
    if (res) ads <= 1'b0;
    else if (~adbusy) ads <= 1'b0;
    else ads <= 1'b1;
end
//adrs
always @(negedge ck)begin
    if (res) adrs <= 3'b0;
    else if (adrsup)
        if (adrs == 3'd7) adrs <= 3'b0; ←※4
        else adrs <= adrs + 3'b1;
end
endmodule


リスト1-2 アナログ入力信号をマルチプレクサ制御するためのVerilog HDL記述

注3;A-D変換完了後の待ちサイクル設定(A-D変換完了時3サイクル待ってセレクタを切り替え)
注4;アナログ・マルチプレクサ・セレクト信号生成.0から7まで順次カウントアップを繰り返し

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日