2016年12月24日

ラズパイで MCP3204/MCP4922 を使う

 ラズパイでアナログ信号を扱いたくて、Microchip の MCP4922 (AD コンバータ) と MCP3204 (DA コンバータ) を使おうとしている。これらは秋月で廉価で売られていて、電子工作界隈ではよく使われている。接続して動かすのは簡単で、以前にも少し書いた(「るあこん:SPI を実装した」)。ところが、アナログ回路というのはここからが大変なんですね…

 まず、最初に考えた回路はこんな感じ。アナログ部分の詳細は書きませんが、前例のある回路なので大きな問題はないはず(そうでもなかったことが後でわかるのだが)。アナログ部分に与えるのは、オペアンプ用の±15V・内部での電圧シフト用のリファレンス電圧(要微調整)・ MCP3204 からのアナログ信号。アナログ部分から帰ってくる2系統の信号を MCP4922 の CH0 と CH1 で受けて、デジタルに変換する。電源は秋月の 5V スイッチングアダプタで、±15V はコーセルの SUW30515 で 5V から作る。ラズパイは 3.3V 動作なので、ADC と DAC 用に 3.3V 電源を TA48M033F で作る。ラズパイからも 3.3V が出ているが、たぶん雑音が多いだろうから、自前で用意することにした。

 これで動くだろうと思ったわけですよ。でまあ、確かに動くんだけど、CH0/CH1 で受けた値がふらつく。12 bit の ADC なのでフルスケールが 4096 なのだが、±40 ぐらいふらつく。何これ、実質精度が 7 bit ぐらいしかないじゃん。これでは使い物にならないので、いろいろ試行錯誤した。

 オシロスコープで見ると、CH0/CH1 で受けている信号に約 40 kHz の交流成分が乗っている。振幅は 30 mV ぐらい。さらに調べてみると、アナログ部分の基準電圧 Vref に同じ周期の 4 mV ぐらいのリップルがある。これを抑えてやればいいのか、と考えて、ADC/DAC やアナログ部分の基準電圧をシャントレギュレータ NJM431L の +2.495V から作ることにした。また、SUW30515 の入力の 5V をアダプタから直接入れるのをやめて、可変レギュレータ NJM2397 で作った 4.6V にした。さらに、高周波のノイズを除去するため、EMI フィルタ BNX016-01 を NJM2397 の後に入れた。

基準電圧の値が変わったので、アナログ部分の回路定数も同時に変更した(ここには書いていない)。

 しかし、これではあまり改善されなかった。さらに、CH0/CH1 で受けている信号をよく見ると、40 kHz の成分に加えて、約 1 MHz の成分も乗っていた。これは SUW30515 が発生源であることが判明。振幅 15 mV ぐらいのリップルが +15V, –15V の両方に乗っている。オペアンプの電源は±12V でも大丈夫なので、レギュレータの NJM7812FA/7912FA を入れてリップルを除去しようと試みたが、1 MHz 近傍のリップルはせいぜい 2/3 程度までしか減らなかった。

 電源がなんとかならないかな、といろいろ探していたところ、ストロベリーリナックスで「LT3439 超ローノイズDC-DCコンバータモジュール(+12V/-12V)」というのを見つけた。実装するスペースがなかったのでジャンパ線で配線することになり、本来の性能は出し切れてない感じだが、少なくともアナログ部分の電源のリップルは完全に消えた。あとは 40 kHz の成分だが、原因がどうしても特定できなかったので、対症療法として、アナログ回路の最後段のオペアンプの帰還抵抗 (33 kΩ) と並列に 1 nF のコンデンサを取り付けた。これで時定数 33 µs のローパスフィルタになるので、40 kHz (25 µs) の成分は小さくなるだろう、という読み。これが当たりで、MCP4922 の変換結果のふらつきは±2 程度にまで減った。なお、目的の回路は 1 ms ぐらいの応答が見られれば十分なので、33 µs のローパスフィルタが入っていても大きな支障はない。

 アナログ回路は難しいですねえ。デジタル回路はつなげば動くけど、アナログはそうはいかない。「マイコン+MCP4922」でネット検索して作例を探すと、「とりあえず動いた」というところまでの記事が多いんだけど、実際はそこから先の方がはるかに道のりが長い。もっと経験を積んでからこの記事を読み返したら「何バカなことやってんだよ」と思うんだろうけど、現時点での記録として残しておきます。

Posted at 2016年12月24日 15:33:40
email.png