秋月ファンクラブ掲示板 過去ログ

AD変換を数式で - pinokio

2014/07/27 (Sun) 03:30

あるアナログ値をデジタル変換、つまりAD変換したいのです。
LTSPICEでその命令を作りたいのですが、(数式で)
そのような命令はありますか?

例えば8bit変換はどうですか?

Re: AD変換を数式で - inara1

2014/07/27 (Sun) 10:05

8個の電源を準備して、その出力電圧をif文で場合分けすればできます。

添付図がその結果です。
V1が入力信号、B1~B8がADコンバータの出力です。V(input)が入力電圧、V(b0)~V(b7)が出力電圧になります。出力電圧はLレベルが0V、Hレベルが1Vになっています。基準電圧は.param vref=2.048Vで定義しています。

B9はDAコンバータで、V(b0)~V(b7)から元の波形を変換したものです。波形のV(dac)がその出力波形です。波形の一番上は入力V(input)とDAC出力V(dac)の差です(8bit精度で一致しています)。

B1~B8はビヘイビア電圧源で、メニューの Edit → Component → bv で選べます。その記号のそばのV=F(...)を右クリックして、添付図のように書き換えることで、出力電圧を式で定義できます。ビヘイビア電圧源で使える関数の中に、条件によって値の異なるif関数があります。その形式は
if(x,y,z)
で、x>0.5のときの値がy、そうでないときは値がzと意味です。B1~B8の式の中に+0.5という項目があるのは、if関数のx=0.5が境界になっているからです。

Re: AD変換を数式で - inara1

2014/07/27 (Sun) 10:16

字が細かくて見えないかもしれません。

以下の文章をコピーして、NotePadなどのテキスト編集ソフトに貼り付け、テキスト形式で保存し、後でファイル名の拡張子をasc(ファイル名.asc)とすれば、LTspiceでそのまま読み込めます。

Version 4
SHEET 1 2728 1204
WIRE -592 -736 -592 -784
WIRE -1120 -656 -1120 -720
WIRE -592 -624 -592 -656
WIRE -1120 -528 -1120 -576
WIRE -592 -480 -592 -528
WIRE -592 -368 -592 -400
WIRE -592 -224 -592 -272
WIRE -592 -112 -592 -144
WIRE -592 32 -592 -16
WIRE -592 144 -592 112
WIRE -592 288 -592 240
WIRE -592 400 -592 368
WIRE -592 544 -592 496
WIRE -592 656 -592 624
WIRE -592 800 -592 752
WIRE -592 912 -592 880
WIRE 304 1040 304 992
WIRE -592 1056 -592 1008
WIRE 304 1152 304 1120
WIRE -592 1168 -592 1136
FLAG -1120 -528 0
FLAG -592 -624 0
FLAG -592 -784 b0
FLAG -1120 -720 input
FLAG -592 -368 0
FLAG -592 -528 b1
FLAG -592 -112 0
FLAG -592 -272 b2
FLAG -592 144 0
FLAG -592 -16 b3
FLAG -592 400 0
FLAG -592 240 b4
FLAG -592 656 0
FLAG -592 496 b5
FLAG -592 912 0
FLAG -592 752 b6
FLAG -592 1168 0
FLAG -592 1008 b7
FLAG 304 1152 0
FLAG 304 992 dac
SYMBOL voltage -1120 -672 R0
WINDOW 0 48 35 Left 2
WINDOW 3 44 78 Left 2
WINDOW 123 0 0 Left 2
WINDOW 39 0 0 Left 2
SYMATTR InstName V1
SYMATTR Value SINE({vref/2} {vref/2} 1k)
SYMBOL bv -592 -752 R0
WINDOW 0 51 24 Left 2
WINDOW 3 49 69 Left 2
SYMATTR InstName B1
SYMATTR Value V=if(V(input)/{vref}-(128*V(b7)+64*V(b6)+32*V(b5)+16*V(b4)+8*V(b3)+4*V(b2)+2*V(b1)+1)/256+0.5,1,0)
SYMBOL bv -592 -496 R0
WINDOW 0 51 24 Left 2
WINDOW 3 49 69 Left 2
SYMATTR InstName B2
SYMATTR Value V=if(V(input)/{vref}-(128*V(b7)+64*V(b6)+32*V(b5)+16*V(b4)+8*V(b3)+4*V(b2)+2)/256+0.5,1,0)
SYMBOL bv -592 -240 R0
WINDOW 0 51 24 Left 2
WINDOW 3 49 69 Left 2
SYMATTR InstName B3
SYMATTR Value V=if(V(input)/{vref}-(128*V(b7)+64*V(b6)+32*V(b5)+16*V(b4)+8*V(b3)+4)/256+0.5,1,0)
SYMBOL bv -592 16 R0
WINDOW 0 51 24 Left 2
WINDOW 3 49 69 Left 2
SYMATTR InstName B4
SYMATTR Value V=if(V(input)/{vref}-(128*V(b7)+64*V(b6)+32*V(b5)+16*V(b4)+8)/256+0.5,1,0)
SYMBOL bv -592 272 R0
WINDOW 0 51 24 Left 2
WINDOW 3 49 69 Left 2
SYMATTR InstName B5
SYMATTR Value V=if(V(input)/{vref}-(128*V(b7)+64*V(b6)+32*V(b5)+16)/256+0.5,1,0)
SYMBOL bv -592 528 R0
WINDOW 0 51 24 Left 2
WINDOW 3 49 69 Left 2
SYMATTR InstName B6
SYMATTR Value V=if(V(input)/{vref}-(128*V(b7)+64*V(b6)+32)/256+0.5,1,0)
SYMBOL bv -592 784 R0
WINDOW 0 51 24 Left 2
WINDOW 3 49 69 Left 2
SYMATTR InstName B7
SYMATTR Value V=if(V(input)/{vref}-(128*V(b7)+64)/256+0.5,1,0)
SYMBOL bv -592 1040 R0
WINDOW 0 51 24 Left 2
WINDOW 3 49 69 Left 2
SYMATTR InstName B8
SYMATTR Value V=if(V(input)/{vref}-128/256+0.5,1,0)
SYMBOL bv 304 1024 R0
WINDOW 0 51 24 Left 2
WINDOW 3 49 69 Left 2
SYMATTR InstName B9
SYMATTR Value V={vref}*(V(b0)+2*V(b1)+4*V(b2)+8*V(b3)+16*V(b4)+32*V(b5)+64*V(b6)+128*V(b7))/256
TEXT -1152 -290 Left 2 !.tran 1m
TEXT -1152 -440 Left 2 !.param vref=2.048V
TEXT -1152 -368 Left 2 !.options plotwinsize=0

Re: AD変換を数式で - pinokio

2014/07/27 (Sun) 11:43

返信ありがとうざごいます。

数式で行うとかなり複雑ですね。シミュレートするのに時間がかかりそう。

このADだけでなく、他の回路もあり時間がかからなくて
AD変換できる回路構成はありますか?

LTのICのほうがよいでしょうか?