今だけ人気マンガ100円レンタル特集♪

課題でa/d変換回路について実験中で、一応arduinoを使って適当なアナログ値からデジタル値を得ることは出来ました。(量子化誤差の関係で値が少しずれていますが、、)ただ、以下の写真の回路がどのように動いてデジタル値を得るかが分かりません。

そこで分かる方に教えてほしいです。
使ってる部品は、r-2r集合抵抗器。オペアンプはNJM2904, トランジスタは2SC1815です。

「電子工作 a/d変換について」の質問画像

質問者からの補足コメント

  • 抵抗分割の話ですが下から470Ωとありますが、その下にGNDを記入するのを忘れていました。
    正しくはGND → 470Ωです.

    あと、指摘があります通りラダー抵抗の一番下の抵抗は私の書き間違いです。2Rです。ご指摘ありがとうございます!

    No.1の回答に寄せられた補足コメントです。 補足日時:2020/07/17 15:31

A 回答 (6件)

#3です。



> 抵抗分割した回路のV1(0.68V)を基準電圧にしてLEDの点灯条件を調べると(0011)となり、
> 私の予想では(0010)になって欲しかったのですが少し数値がずれてしまっています。
#3の回答にも書きましたが、LEDが結果を表示するのは、D/Aラダー電圧をゼロから増していって初めてV1(基準電圧)を越えたとき、です。(プログラムを読み切れないのですがたぶんそうなっているはず)
つまり D/Aラダー電圧 > V1  とならなければLEDには表示されません。
ラダーの入力が B0010 では0.62Vですね。これではV1の0.68Vに足りないのでまだLEDには結果は出ません。0.68Vを越えた値、つまり B0011=0.94V がA/D変換の結果となります。
これも量子化誤差のひとつと言えるでしょう。それを考えれば B0010 でも B0011 でも正しいということになります。
V1にボリウムを使って連続可変にするとおもしろいでしょうね。
    • good
    • 0

✖ A/D変換回路


○ D/A変換回路
「電子工作 a/d変換について」の回答画像6
    • good
    • 0

こんにちは。

一生懸命お勉強のようですね。 他の方から「逐次近似/比較」の用語のアドバイスがあり、それをヒントに検索したならすでに解決しているかもしれませんので、 おせっかいかもしれませんが、追加の説明をしてみましょう。
ポイントは、「AD変換のために何とDA変換する。そしてアナログ入力と比較してみる」
アナログをデジタルに変換するAD変換の方法はいろいろありますが、一般的に、アナログをデジタルに変換するのはけっこうむずかしく、 大きな誤差が出たり雑音に弱くなったりします。 そこで、比較的容易な、デジタルをアナログに変換するDA変換を行ってアナログ信号を作り、目的の入力信号と比較することで 入力信号を推定するのが「近似法」(人によってDA比較法、逆近似法・・などとも呼ぶ)です。
提示された回路は、この近似法用の回路ですね。 図面の文字がよく読めないのですが、抵抗列は「ラダー型DA変換器」と呼ばれており、この構造の理解自体がオームの法則のちょっとしたゲーム になっている、巧妙な仕組みです。
例えばardinoの4ビットの出力PORTは、それぞれ5Vを出力するとしたら、 一番上のビットが1なら、オペアンプの入力端子には1/2×5Vすなわち2.5vが入力されますが、一番下のビットが1なら、1/16×5vすなわち0.3vしか 出力されません。また、それぞれのビット出力は加算になっていて16段階の疑似アナログ信号が作れるようになっており、すべてのビットが1ならば、15/16×5vすなわち4.7vが出力されます。 右側のオペアンプは比較器になっており、アナログ入力とDA変換器で作成した疑似アナログ信号と比較して、疑似アナログ信号のほうが少しでも大きければ出力電圧が出る(小さければ0のまま)ので 1815トランジスタで安定化させて「大きい・小さい」を0/1としてardinoに伝えるようになっています。
もう基本はわかりましたね。 ご提示のプログラムを私ががちゃんと理解できていないのですがAD変換をしたいとき、最も単純には、DA変換装置で「0,1,2,3・・・」という数値に相当する電圧を順番に出力してみて、たとえば「9」になった瞬間に比較出力が「0」 すなわち、「9では目的のアナログ値より大きいよ」とわかるので、目的のアナログ値はきっと8(から9の間)だろうとわかり、AD変換ができたことになります。 これが「近似法」です。
さてさて、いかがでしょうか。
次に、さらにちょっと工夫した「逐次近似法」の補足を。 先ほどの比較では、数字を順番に出力していくので、例えば目的のアナログ値が12.5ならば、13回のステップが必要ですね。 これを合理化するため、次のような方法をとります。
まず、中央に当たる8を出力して比較します。目的の値がこれより大きくて比較信号の0が戻ってこないなら、 さらに4を足した12を出力して比較します。それでも0が戻って来ないならこんどは2を足して14を出力。すると比較信号が戻ってきて大きすぎることがわかるので、1を引いた13を出力。 それでも大きすぎるとの比較信号が戻ってきた。すなわち12より大きく13より小さいことが4回のステップでわかります。 この方法は毎回4回のステップが必要なため、例えばアナログ値が2.5でも4回必要な点では順番に出力した場合より時間がかかりますが平均では圧倒的に有利。 大きな数値でまず比較し、徐々に小さな差で修正しながら比較をするので「逐次近似」と呼ばれている単純ながらおもしろい工夫ですのでご参考ください。
さて、質問の趣旨に合っていたでしょうか。 お役に立てば幸いです。頑張ってくださいね。
    • good
    • 0

#1です。



何をしているか、およそわかりました。
① CPUから4ビットのデジタル値を出してD/A変換しアナログ電圧にする。
② ①と入力のアナログ値と比較。
③ ①が上回ったところでポートBに出力してLEDを点灯させる。
こんなことをしていますね。

「基準入力」の電圧を計算してみると、0.68V、2.12V、3.56V になります。
D/A出力は 5V×N/16 (Nは0~15) なので、
0.00V、0.31V、0.62V、0.94V、1.25V、1.56V、1.88V、2.19V、
2.50V、2.81V、3.13V、3.44V、3.75V、4.06V、4.38V、4.69V  が出て来ます。
(正確には 5/16V=0.3125V ピッチになる)

例として、「基準入力」の電圧を2.12Vにしているとします。(以下、Bは2進数を示す)
CPUはポートDにデジタル値 B0000 を出力します。D/A変換器は0.00Vに変換。コンパレータ―はLowを出力するのでCPUのポートCにはHighが入ります。LEDの点灯条件にはなりません。
CPUはポートDの出力を1だけ増して B0001 にします。D/A出力は0.31Vになります。CPUはまだ出力条件になりません。
ポートD出力を B0010 にして・・・
これを繰り返してポートDの出力が B0111(上の式で N=7) になるとD/A結果が2.19Vになり、「基準入力」を上回るのでLEDが点灯します。

例がちょっと悪かったかな、「基準入力」2.12V、D/A出力2.19Vでは差が少ないので、使っている抵抗の精度によってはもうひとつ上の結果(N=8)になるかもわかりません。
もうひとつ、OP-AMPに2904を使っていますね。電源を5Vで使った場合、許容入力電圧は3.5Vまでです(データシートにある「同相入力電圧範囲」)。これ以上の電圧を加えると正しい結果を出力しません。「基準入力」の3.56Vもこの制限に該当します(多少の余裕はあるでしょうが・・・)。また出力電圧の上限も3.5VなのでD/A出力の3.75V以上では正しく働かないでしょう。

最も基本的なA/D変換器です。D/Aラダー抵抗とカウンタだけで作れるので私も作ったことがあります。欠点としてスピードが遅いのですが高速になるよう改良したものが「逐次比較型」と言われるものです。現在使われているA/D変換器はほぼすべてがこのタイプです。
    • good
    • 0
この回答へのお礼

ものすごいわかりやすい解説ありがとうございます! 図の動作原理がよくわかりました!
度々の質問ですみませんが、抵抗分割した回路のV1(0.68V)を基準電圧にしてLEDの点灯条件を調べると(0011)となり、
私の予想では(0010)になって欲しかったのですが少し数値がずれてしまっています。
これはA/D変換での量子化誤差の原因なのか、私のプログラムの書き方がこのような原因を生んでしまっているのかわかりません(^◇^;)
解説をお願いしていただいてもよろしいでしょうか?

お礼日時:2020/07/19 19:45

逐次比較型a/dコンバータを構成しているものと思われます。

DA変換部からのアナログ出力をソフトウェアで変化させそれと入力のどちらが高いか比較してデジタル値を求めます。
    • good
    • 0

A/D変換の実験とのことですがラダー部はD/A変換で使う回路ですね。

CPUではどんなことをさせているのかわからないので説明はできません。
変換前のアナログ信号はどこに入れているのですか?
「基準電圧」は何を入れていますか? この電圧をA/D変換するのですか?

A/DではなくD/A変換の実験ですか?
ラダー回路を使ったD/A変換の説明は下のリンクを見てください。
http://mitt.la.coocan.jp/pic/pic7_16.html

ラダー抵抗の一番下、縦に書いてある抵抗は2Rのはず。
この回答への補足あり
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
質問の回答です。情報不足ですいません。
基準電圧は上記の基準電圧入力端子に抵抗分割
(下から470Ω → 1kΩ → 1kΩ → 1kΩ → arduinoの5V端子へ)した3種類の測定電圧V1,V2,V3を入力してその時の値をLED表示(デジタル値)すると言ったものになります。

以下に実行したソースコードを載せておきます。
(今回私がわからないのはプログラムではなく、なぜこのようなデジタル値が出力されるのかと量子化誤差の観点から予測される値が少しずれているかがわからないところです)

//4bit binary counter
//グローバル変数の初期化
int outData = 0;
const int compIn = A0;
int saveData = 0;
int num = 0;
void setup() {
// put your setup code here, to run once:
DDRD = B11111111; //ポートDの全てのビットを出力に設定
DDRB = B11111111; //ポートBの全てのビットを出力に設定
pinMode(compIn , INPUT_PULLUP);

}

void loop() {

if(digitalRead (compIn) == LOW) {
saveData = outData;
outData = 0;
}
outData++;
PORTD = outData;
PORTB = saveData;
delay(10);
}

お礼日時:2020/07/17 15:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング