製作物

オペアンプを使った積分型ADCを作ってみた

投稿日:

トランジスタ技術2022年4月号に掲載されていた積分型ADC (Analog to Digital Converter)の記事を見て、面白そうだったので実際にブレッドボードで作ってみました。

初めに言っておきますが、今回作るADCはマイコンのADCの代わりになるようなものではなく、原理を理解して楽しむようなものです。

回路はほぼすべてトラ技のものをそのまま使用させてもらっていますが、文章を読んでもすぐに理解できなかった点などを咀嚼してこの記事を書くことにしました。

 

概略

今回の回路の構成はこのような感じになっています。

概略

グラフ一定電圧を積分するとその出力は一次関数となり、それとアナログ入力を比較します。

積分結果がアナログ入力を上回ったタイミングでカウンタのクロックを停止させます。クロックの周期と T を調整することで(4bitなら 周期=T/16)、 t/T がカウンタの値として出力されます。

積分結果が直線なので t/T はアナログ入力に比例します。したがって、これでアナログからデジタルに変換できることが分かります。

 

次は各ブロックの回路を見ていきます。

 

積分回路

オペアンプの積分回路について数式を用いて説明します。オペアンプの入力と出力の間にコンデンサを入れると積分回路となります。

積分回路

そもそもオペアンプは、2つの入力の差を増幅して出力する素子です。式にすると

V_{out} = A(V_{+} - V_{-})

となりますが、増幅率Aは10000など非常に大きいので

V_{+} - V_{-} = 0

とみなせます。これはバーチャルショートやイマジナリーショートと呼ばれていて、オペアンプ回路の基本となります。

いま、コンデンサに蓄えられた電荷Qと流れる電流Iを図のように定めると、(オペアンプの入力インピーダンスは大きいのでオペアンプの入力端子には電流は流れません)

Q = C(V_{out} - V_{-})\\ I = \cfrac{dQ}{dt}

となりますが、

V_{-} = V_{+} = 0

を用いると、

Q = CV_{out}\\ I = C\cfrac{dV_{out}}{dt}

となります。また、

-V_{in} = RI = RC\cfrac{dV_{out}}{dt}

(符号に注意)より

\cfrac{dV_{out}}{dt} = -\cfrac{V_{in}}{RC}

となり、両辺をtで積分すると、

V_{out} = -\cfrac{V_{in}}{RC}t

となります。(ただしt=0V_{out} = 0 とする)

 

V_{in}に負の一定電圧をかけてやることで概略で示したように時間に比例して増加する出力が得られます。

なお当然ですが出力はオペアンプにかける電源電圧の範囲に限られます。

リセットするにはコンデンサを短絡すればよいです。

 

比較回路

積分結果とアナログ入力を比較して0か1を出力します。

コンパレータICというのもありますが、オペアンプに周辺回路を何も付けなければそのままコンパレータになります。

先ほどのバーチャルショートの話と混同しないように注意が必要ですが、バーチャルショートはオペアンプの出力から入力に負のフィードバックが掛かっている場合に成立します。

コンパレータといってもこのままだと出力は1か-1(負電源)なので、負の出力を0にするリミッタ回路を追加します。

リミッタ回路

オペアンプの右の部分がリミッタ回路です。抵抗とショットキーバリアダイオードからできています。

ショットキーバリアダイオードは通常のダイオードよりも順電圧降下の小さいダイオードです。

 

積分結果がアナログ入力よりも小さいとき、オペアンプの出力は1(具体的には約4V)となります。このときダイオードには逆方向に電圧が掛かるので、電流は流れずそのまま1が出力されます。

逆の場合はオペアンプの出力は-1(約-3V)となり、ダイオードには順方向に電圧が掛かることになります。

GNDからダイオード、電流制限抵抗を通ってオペアンプに電流が吸い込まれるので、出力電圧はGNDからショットキーバリアダイオードの順電圧降下分だけ下がった電圧(約-0.3V)となります。

 

原理的に0になるわけではではありませんが、後に出てくるアナログスイッチの入力電圧は -0.5V ~ VDD+0.5V なのでこれで大丈夫です。

 

カウンタ回路

グラフ4bitのバイナリカウンタを使ってtを測ります。

カウンタのビット数がADCの分解能にそのまま対応します。

カウンタICも当然あるのですが、今回はDフリップフロップを組み合わせて作ります。

カウンタ

こんなに簡単な回路でカウンタになるのってちょっとびっくりしませんか?私はびっくりしました。

それはさておき、動作を説明します。左が下位で右が上位となっています。

 

2進数の数字が1ずつ増えていく様子を思い浮かべてほしいのですが、1の位は毎回1と0が入れ替わりますよね。そのため最下位のフリップフロップのDはQに繋がっていて、クロックが入るごとに反転します。

 

2つ目以降は全て同じ回路になっていて、DはQに、CKは1つ下の位のQに繋がっています。

10進数だと考えやすいと思いますが、一般の記数法において、ある位の数字が変化するのは1つ下の位が桁あふれしたときで、その変化は+1です。

特に2進数においては、桁あふれ=1→0、変化=反転にほかなりません。

下の位が1→0と変化するとき、Qは0→1と変化しますからこれをCKに入力していて、その時の変化は反転なのでDは自身のQに繋がっているというわけです。

 

上図では省略していますが、もちろんQにはLEDを付けて結果を出力させます。

また、各フリップフロップにリセット端子があるのでそれも接続します。

 

電源回路

オペアンプの動作には正負の両電源が必要になります。

今回は角形電池の9Vを真ん中を基準にして±4.5Vとして使用することにしました。

 

真ん中の電圧は抵抗2つで簡単に作れますが、そのままだと負荷によって電圧が変わってしまうので電源としては使えません。

そこで、またオペアンプの出番です。次のようなボルテージフォロワと呼ばれる回路で、負荷があっても電圧を一定に保ちます。

電源回路

オペアンプの出力と反転入力を直結することで、バーチャルショートが成立し、

V_{out} = V_{-} = V{+}

となります。

これをGNDとして使い、もともとの電池の両極は正負の電源として使います。

あえて明示的に書いていますが、オペアンプの電源は電池です。

 

 

全体回路図

以上の回路をまとめると全体の回路図はこんな感じです。

schematic

上段左が電源部で、中段は左から定電圧生成部、積分部、比較部となっていて、下段がカウンタ、出力部です。

上段右はICの電源とかなのであまり関係ないです。

 

ここまでで紹介していない部品として、アナログスイッチがあります。

これは右図のピン番号で説明すると、13番がHだと1と2が導通して、Lだと非導通になります。

この例だとDO0をHにするとコンデンサを短絡して放電することが出来ます。

 

少し見にくいですが、太字になっているアナログ入力、DO0~DO2が外部入力です。

DO0, DO1はリセット信号で、DO2はクロックです。

トラ技ではADALM2000というUSB計測器を使用してこれらの信号を制御しているのですが、当然そんなものは持っていないのでPICマイコンで制御したいと思います。プログラムは最後に掲載します。

 

定数計算

積分回路は R=100kΩ, C=1μF として、クロックは100Hzだとします。

アナログ入力の入力範囲を0V~4Vとしたときの積分する定電圧を求めましょう。

カウンタは4bitなので、クロック16周期で積分値が4Vになるようにすればよいことになります。

V_{out} = -\cfrac{V_{in}}{RC}t

V_{out}=4, R=100*10^{3}, C=1*10^{-6}, t=16/100 を代入すると、

V_{in} = -2.5V となります。

これを可変抵抗とボルテージフォロワで作ります。

 

実際はオペアンプが電源電圧いっぱいまでは出力できなかったりするので、積分電圧や入力電圧を微調整します。

 

動作テスト

今回使用したパーツは以下の通りです。

  • オペアンプ TL082L-D08-T x2
  • フリップフロップ TC74HC74AP x2
  • アナログスイッチ TC74HC4066AP
  • ショットキーバリアダイオード SD103A
  • 積層セラミックコンデンサ 1uF
  • LED、抵抗、可変抵抗
  • 9Vアルカリ電池
  • PIC16F18313

パーツは全て秋月電子で揃えました。

 

ブレッドボードで組んでみたのがこちらです。ごちゃごちゃしてますね。

動作テスト

 

右上の電源ラインにアルミ電解コンデンサが入っているのが分かると思いますが、これがないと何故か動作が不安定になってちゃんと動きませんでした…。

 

実際に動作させてる動画がこちらです。

ピンセットで回している可変抵抗が入力で、LEDが出力です。およそ1秒ごとにAD変換を行っていて、可変抵抗を回すと出力結果もそれに応じて変化するのが確認できました。

変換のたびに結果が若干違うので精度は4ビットすら怪しいですが、概ね増減の傾向は正しいので良しとしましょう。

PICのプログラムも一応載せておきます。

▼クリックで表示

 

まとめ

今回はトラ技の記事を参考に積分型ADCを作ってみました。

私はオペアンプやアナログ回路の経験があまりないので、実際に作ってみて程よい勉強になったと思います。

また何か面白そうな回路があれば実際に作ってみたいと思います。

 

今回の記事は以上となります。ご覧いただきありがとうございました。

-製作物

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

USB給電の小型吸煙器を作ってみた

今回はUSB給電で動作する小型の吸煙器を作ってみました。 今まではんだ付けの際はヤニの煙を吸わないように気を付けながら行っていましたが、吸煙器を使うことでとても快適になりました。 もっと早く作ればよか …

バブルソートを行う電子回路を作ってみた

今回は CPU を用いずにハードウェアでバブルソートを行う回路を作ってみました。 ソート対象の変数はコンデンサに充電された電圧で、フリップフロップで状態管理、オペアンプで比較・代入を行います。 &nb …

PICとグラフィックLCDでシンプルな卓上時計を作ってみた

今回はある程度実用的な卓上時計を作ってみました。日時の表示と温度、湿度、気圧の表示だけのシンプルな機能としました。   目次1 主な使用部品2 回路解説2.1 電源部2.2 RTC2.3 I …

PICでカラーLCDモジュールを動かしてみた話【ST7789】

今回は以前に Amazon で購入したまま積んでいた フルカラーグラフィックLCD を PIC で制御してみました。 激ムズというわけではありませんでしたが、いくつかつまずいたポイントがあったので備忘 …

アナログライフゲーム2.0を作りました

以前にライフゲームを抵抗とコンパレータを使って計算する「アナログライフゲーム」という作品を作りました。 自分の作品の中でもお気に入りの作品で、何度かイベントにも展示したりしたのですが、この度バージョン …