1. はじめに
ソース・メジャー・ユニット(SMU)というのを製作してみた。SMUは測定器のひとつで、ダイオードやトランジスタのI-V特性を調べたりするのに使われている。買うと高いので、自作できないかと前々から思っていた。
SMUは下図のような構成となっている。電流源(current source)と電圧源(voltage source)があり、測定対象(DUT)にかかる電圧と電流をスイープしながら測定することができる。
2. ハードウェア
2.1. 概要
回路の概略図を下に載せた。USBで制御するためにFT2232Dというチップを使ってみた。FT2232DはMPSSEという機能を搭載していて、USBからI2C通信やSPI通信などが行えるようになっている。今回は、これを利用してI2CインターフェースのD/A、A/Dチップを使おうと思った。
D/Aコンバータに書き込むことで、-8.2 V~8.2 Vの範囲の出力電圧を設定できるようになっている。また、直列に入れた抵抗の電圧降下をA/Dコンバータで読み取ることで、電流を測定することができる。マルチプレクサでA/Dの入力を切り替えて電圧と電流の両方を測定できるようにした。
※ 測定で電流源を使う機会はあまりないので今回は省いた。
2.2. 回路図
下に全体の回路図を載せた(パスコンなどは省略してある)。
電圧源回路
D/Aコンバータ(MCP4725)の出力は0~3.3 Vの範囲なので、これを-8.2~+8.2 Vの範囲になるようにオペアンプU6(MAX9945)で減算回路を組んでいる。トランジスタQ3, Q4はオペアンプの出力電流をブーストするために入れている。オペアンプの出力電流が6 mA以上になると、抵抗R21/R23(100 Ω)の電圧が0.6 VくらいになってQ3/Q4がオンし始める。そこからは、オペアンプの代わりにQ3/Q4が出力を補ってくれるので、大電流が扱えるという仕組み。最初この回路見たとき、オペアンプの電源端子に抵抗が入っていて不思議な感じがしたけど、なかなか良いのではと思う。
電流検出抵抗
電圧源の後ろには、電流検出用に抵抗1 Ω、10 Ω、100 Ω、1 kΩを接続した。電流を測定する際は、これらの抵抗の両端の電圧差をA/D変換する。測定レンジに応じて抵抗値をリレーで切り替えられるようにした。小さい電流を測りたければ大きい抵抗値を選ぶことで、精度を上げることができる(オームの法則)。例えば、1 μA以下は1 kΩ、1〜10 μAは100 Ω、...みたいな感じにする。実際には、100 Ωを選択すると、1 Ωと10 Ωも直列に入ってしまうので、111 Ω(= 1+10+100)の電圧降下をみることになるが、ソフトウェア側で値を変えるだけなので問題ない。
電流検出
電流検出抵抗の電位がA/Dチップの入力範囲(0~3.3 V)にないので、そのままではA/D変換できない。なので、計装アンプAD620というのを使って、検出した電圧をリファレンス1.65 Vに持ってくるようにした。AD620のゲインはRGピンに繋ぐ抵抗によって設定することができる(下の式で計算できる)。今回は、RG=5.49 kΩ(4.99k+1k//1k)という値を使ったので、ゲインは10倍である。AD620は値段が高い(秋月で810円)。
A/Dコンバータは16-bit分解能のMCP3425を使った。ゲイン1, 2, 4, 8倍のPGA(プログラマブル・ゲイン・アンプ)を内蔵している。すごい。値段もまあまあ安い(秋月で200円)。
電源・その他
電源はすべてUSBから供給するので、PCにさすだけで使える。USBコネクタはType-Cコネクタを使ってみた。Type-Cデビューしてしまった。I2C通信のSDAは双方向なので、FT2232DのDOピン(ADBUS1)とDIピン(ADBUS2)をショートさせる必要がある。5 Vから±12 Vを生成するところは、秋月のDC/DCコンバータキット(https://akizukidenshi.com/catalog/g/gK-12337/)を使った。
3. 製作
3.1. プリント基板の設計
今回はKiCadを使ってみた。今までEagleを使ってたんだけど、なんかツイッターの人たちみんなKiCad使ってるし、良さそうだったので僕ものりかえた。使ってみたかんじは、うん。KiCadの方が良いね。
設計したプリント基板は、Fusion PCBに作ってもらった。注文してからちょうど2週間で届いた。基板は10枚で$5で、送料が約$15かかった。品質はすごく良かった。
3.2. 完成
プリント基板にはちゃんとソルダーレジストがのってて、しかもシルクスクリーンも印刷されてて、自作の感光基板と比べたら超はんだづけが簡単だった。
4. ソフトウェア
4.1. FT2232DのMPSSE機能
FT2232D、FT2232H、FT232H、FT4232HにはMPSSE(Multi-Protocol Synchronous Serial Engine、マルチプロトコル・シンクロナス・シリアル・エンジン)という機能があり、SPI通信やI2C通信をエミュレートすることができる。FTDIのアプリケーションノートにD2XXライブラリを使ったサンプルプログラムがあるので、それを参考にしながらプログラムを書いた。
一度MPSSE機能をオンしたら、上図のようにFT_Write()関数でコマンドデータを書き込むことで、決められた動作をさせることができる。例えば、「nバイトのデータをクロックの立ち下がりエッジで送るコマンド(0x11)」とか「nビットをクロックの立ち上がりエッジで読み取るコマンド(0x22)」とかがある。それらを組み合わせることで色々な通信プロトコルに対応することができる。
注意点は、FT2232Dには使えないコマンドがあること(あとから気づいた)。I2C通信する際に、3-フェーズクロッキングのコマンド(0x8C)がFT2232Dではサポートされていなかったので、1bitずつデータを送るコマンドを使わないといけなかった。
MPSSEの詳しいことについては、忘れないうちに別の記事にでもまとめておこうと思ってるけど思ってるだけ。
4.2. QtでGUIアプリケーション
Qtを使って簡単なGUIの測定アプリを作ってみた。使い方は単純で、FT2232Dの接続を確認したら、電圧と電流の上限値とステップ値を入力してスタートボタンをクリックするだけ。すると、スイープ測定が開始して、結果をリアルタイムでグラフに表示してくれる。
測定中、プログラムはD/Aコンバータに値を書き込んで、A/D変換が終わるのを待って、A/Dコンバータから値を読み取って、、、という処理を繰り返す。この間、GUIのウィンドウが固まってしまうのはなんかダサいので、QThreadでマルチスレッドにしてみた(マルチスレッドとか何も分かってないけど、分かってなくてもなんとなく使えてしまうのがQt)。また、測定開始時にちょっとしたキャリブレーションをするようにした。D/Aコンバータのゼロ点を探すのと、電流がゼロの時のA/Dコンバータのオフセットを調べておいて後から引き算する。
5. 測定テスト
5.1. pnダイオードのI-V特性を測ってみる
たまたまpnダイオード1N4148が落ちていたので、I-V特性を測ってみた。
下に測定結果を載せる。横軸は順方向電圧 VF、縦軸は順方向電流 IF(ログスケール)。1 nA程の小さい電流まで測れている。すごい。すごくない?
5.2. npnトランジスタのIC-VCE特性を測ってみる
次は、2SC1815(セカンドソース品)のIC-VCE特性を測ってみた。9 V電池と100 kΩの抵抗で適当なベース電流を流しながら、コレクタ-エミッタ間の特性を測定した。下図がその測定結果。それっぽい曲線が出た。あまり良いトランジスタでは無さそう。
6. 反省点など
今回はコストを抑えるためもあって、電流制限は完全にソフト側で行なっている。なので、例えばツェナーダイオードとか測ろうとすると急に電流が流れすぎて壊してしまう可能性がある。
D/AコンバータのINL(積分誤差)が思っていた以上に悪かった。データシートのTyp.見て安心してたんだけど、結局5倍くらい悪かったので残念。ハズレを引いたかもしれない。もっとキャリブレーションをガチでやろうとするなら、2個のD/Aコンバータの出力を1:1000くらいの比で合成して分解能細かくするとかありかもしれない(こうすれば実質20bitくらいの分解能になりそう)。
電流検出抵抗を切り替えるのにリレーを使った。MOSFETはゲートの漏れ電流が出力に流れてしまいそうだったのでやめた。フォトMOSFETとかならどうなんだろうか。まあでも、リレーを使ったことで測定中にカチカチ音が鳴ってちょっとかわいいので、これはこれで良い。
7. まとめ
SMUを作ったよ、という話。