PSoCでμVオーダのセンサ出力を測定してみる

先日、PSoCDeveloperのフォーラムに「ゲイン10,000を実現するには?」という質問が上がっていた。「モジュールをこう接続するといいよ」という回答が付く中、「そんな高ゲインでは入力オフセットの影響で出力が飽和してしまうよ」「入力信号を変調して、AC結合で増幅してから復調したほうがいいよ」という指摘があった。

まぁ当然の指摘なわけだが、それをPSoCで実現するとどういう形になるのか、またどの程度の現実味があるのか、ちょっと試してみた。

(2/28/2008 追加)
内部構成を少し変更した第2段を作成してみた。


ハードウェア・内部ブロック構成

まず、原信号はひずみゲージの出力を想定し、5V入力に対して半固定抵抗で0μV〜100μVの差動出力が得られる抵抗ネットワークを用意。これを±5V(0V/5Vと5V/0V)の10kHz矩形波でバイポーラ駆動し、出力される0μV〜±100μV差動出力をPSoCに入力する。駆動電圧源はPSoCのデジタルポート出力をそのまま使用する。(なお、mΩ級の抵抗値やμV級の電圧が測れる測定器を持ち合わせていないので、数値の精度は適当。)

PSoC側では、これをINSAMPで受けて差動信号をシングルエンド信号に変換し、増幅と駆動キャリア周波数のBPFに通してからキャリア周波数で同期検波。検波出力を増幅・LPFを通してA/D変換する。

最初はこの構成そのまま(INSAMP (x93), BPF, PGA (x24), LPF, PGA (x8)のトータルゲイン約10,000)でいこうと思ったが、BPFやLPFにゲインを持たせることができるということが分かったので、構成をこう変更した。

  INSAMP (x93) ⇒ BPF (10kHz, x34.5) ⇒ PGA (x3.2) ⇒ 同期検波+LPF (10Hz, x2.0)
  (BPFの出力はいったんP0[5]に出力し、再度入力されている。)

また、抵抗ネットワークの出力信号は矩形波になるが、そのうちBPFを通過するのは基本周波数のみになるが、元の矩形波の振幅に対する基本周波数の振幅はπ/4倍になる。また、検波では全波整流の後で平均を取るので、元の正弦波の振幅(p-p)に対する絶対値平均の値は1/π倍になる。この2つの値も掛けると、トータルゲインは約5,000(ただし入力のp-p電圧に対する出力電圧の比)ということになる。

この定数では、入力が±100μV(=200μVp-p)の場合、出力(ADC入力)は1,000mVになる。ADCの基準電圧に標準の1.3Vを使う場合、ちょうどよい電圧と言える。

ADCはDELSIG11を使用。11ビットA/D変換ユーザモジュールだが、AGND〜AGND+Vrefの範囲しか使用しないので、実質10ビット変換となる。

これを、PSoC Express World Tour評価基板の右下にあるCY8C29666で実装してみた。こんな感じ。


抵抗ネットワークはJ6に接続する。

J6ピン番号
(VCC)21(NC)
(GND)43P0[0] / NONINV_IN
P0[7] / INV_IN65P0[6] / MOD_EXT
P0[3] / INSAMP_OUT87P0[2] / LPF_OUT
P0[5] / BPF_OUT109P0[4] / X_MOD_EXT


ソフトウェア

そのままPSoC Express World Tour評価基板の右下にあるCY8C29666で使えるようになっているので、興味のある人はどうぞ。uVtest.zip

1秒間のA/D変換値を平均し、1秒ごとにLED表示を更新。表示値は、A/D入力AGNDが1024。LEDの点灯自体が割と大きいスイッチングノイズを出すのと、LED表示による消費電流で電源電圧がけっこう揺すられるので、LEDのON/OFFができるようにした。ボタンS2(右下のボタン)を押すとLEDのON/OFFが切り替わる。

I2Cスレーブ機能を持っており、ISSPコネクタ経由でA/D変換値の読み出しも可能。スレーブアドレスは0x21。0バイト目にダミー値(値は何でもよい)を書き込むと、読み出し用データを準備する。読み出しは0バイト目がダミー、1,2バイト目がサンプル数、3,4バイト目が平均値、5,6バイト目が最大値、7,8バイト目が最小値。それぞれ、前回データを準備してから今回データを準備するまでのA/D変換値を元にした値が入る。


結果

入力電圧が最大(半固定抵抗を最大に回しきった状態)のときの、INSAMPの出力とBPFの出力はこんな感じ。時刻0は抵抗ネットワークのドライブ出力が変化する位置で、50μsごとにドライブ出力が変化している。(そのたびに鋭いスパイクが発生しているのが見える。)


青い線がINSAMPの出力、赤い線がBPFの出力。INSAMPの出力は約20mVp-pで、これがゲイン93倍で増幅した後なので、元信号は約215μVp-p(約±108μV)ということになる。また、BPFの出力は約600mVp-pなので、ゲインは約30倍。BPF自体のゲイン(34.5)と矩形波・基本波の比率π/4を掛けると27なので、一割近く多いが、オーダは合っている。

INSAMPの出力がえらく汚いが、これでも何度も波形を取り直して見やすいものを選んだ結果。いくつも通して見るとこんな感じになる。


さて、こんな波形を同期検波するとどの程度の精度が得られるのか。半固定抵抗を0に回しきった状態のA/D変換値が、これ。


1分間の計測で、最大値が1,039、最小値が1,025。最大・最小の差は14。

半固定抵抗を最大に回しきった状態だと、こう。


同じく1分間の計測で、最大値が2,010、最小値が1,997。最大・最小の差は13。

A/D変換値に14LSBのバラツキが発生しているものと仮定すると、A/D変換値10ビットのうち下4ビットが無効で6ビット程度の精度があることになる。1秒平均値のみを見ると4LSB程度のバラツキが発生しているので、こちらは8ビット程度の精度があると考えられる。

ただし、微小電圧を精度良く発生させたり測ったりする測定器を持ち合わせていないため、どの程度の直線性が確保できているのかは全く不明である。

また、かなり大きいドリフトがある。以下は、電源を切り暖房も切った状態で1時間程度放置してから電源を入れ、半固定抵抗を最大に回しきった状態で15分計測したもの。


A/D変換値のバラツキの傾向はほとんど変わらないが、時間の経過とともに変換値が上昇傾向にあることが分かる。このようになる原因は不明だが、おそらく

  1. 温度の上昇に伴うトータルゲインの変化
  2. 温度の上昇に伴う電源電圧(USBパワー)の変化

のいずれかだと思う。

なお、今回はPSoC Express World Tour評価基板を使用し、電源もUSBパワーをそのまま使っているので、ノイズ対策は皆無に近い。きっちりとシールド等を施し、まともな電源を用意すればもう1〜2ビットの精度は十分稼げるのではないかと思う。


結論

PSoC単体でμVオーダを「観測」することはできた。「計測」と呼ぶには程遠い精度だが、簡易に傾向を知りたいという程度であれば使えなくもないと思われる。


少し構成を変えて挑戦してみる

その後、最初のやり方とは違う方法も取れることに気付いたので、やってみることにした。違う点は主に2つ。
LPFを省略することで使用するアナログブロックを節約することができる。ただし、LPFは同期検波器を兼ねていたので、LPFを省略する場合、かわりに同期検波器として動作するSCBLOCKを置く必要がある。また、LPFの出力は同期検波した信号を平滑したものになるが、同期検波器の場合は平滑されないので、LPFの出力と比較してピーク電圧が高くなり、その分だけ出力が飽和しやすくなることに注意が必要である。

Vrefをレシオメトリックにすることで、電源電圧の変動に対してADCの出力値の変動を抑えることができる。ただし、PSoC単体で設定可能なVrefのうちレシオメトリックなものは[VDD/2]±[VDD/2]のみで、これを使用してADCからフルスケール出力を得るにはADCの入力範囲がGND〜VDDと広くなってしまう。アナログブロックで出力をフルスイングする使い方はしたくないので(どこでクリップするか分からないため)、ADCに入力する電圧は[VDD/2]±[VDD/4]に制限することにした。これによってADCの精度は実質的に1ビット少なくなる。外部からVrefを与えることで、この精度の制限は取り除くことができる。

そうしてできたのが、この内部ブロック構成。
各ステージのゲイン設定はこうなっている。トータルゲインはほぼ前と同じ。

  INSAMP (x93) ⇒ BPF (10kHz, x38) ⇒ PGA (x5.3) ⇒ 同期検波 (x1.1)
  (BPFの出力はいったんP0[5]に出力し、再度入力されている。)

ADCはDELSIG11からADCINCVR(13ビット設定)に変更。AGND〜AGND+Vref/2の範囲で使うので、実質的に11ビット変換となる。

ソフトウェアのほうは、変換速度を毎秒5回に設定。取得値は32サンプルの移動平均を取るようにした。これによって、値のバラツキはかなり少なくなった。

A/D変換結果は以下のとおり。まずは半固定抵抗が最大値設定の場合。


次は半固定抵抗が最小値設定の場合。


いずれも、平均値は±1LSB程度に収まっていることが分かる。また、この図では分かりづらいが、VDDの変動(USBパワーの変動)が原因と思われる不定期のドリフトが現れなくなった。なお、あらゆるドリフトが消えたわけではなく、温度によるゲイン変化が原因と思われるドリフトは依然残っている。


この図は定常状態からエアコンを切って窓を開けて気温を下げたときの状況である。明らかに、温度変化に応じてA/D変換値が変化していることが分かる。電源を切って5分程度経過してから電源を入れた際にも似たようなドリフトが発生することから、温度変化によるドリフトはかなり大きいようだ。まぁゲインが1万倍もあれば仕方がないとは思うが。

仮に温度変化に伴うゲイン変化がドリフトが原因だとして、それを避けるにはどうすればよいか。内部温度センサがあるので、それで温度を検出してA/D変換値に補正を掛けるか、あるいは検出した内部温度がある特定レンジに入るようにPSoC自体に電力を消費させるか・・・というところだろうか。

そうそう、第2段のソフトはこちら。
uVtest2.zip

例によって、そのままPSoC Express World Tour評価基板の右下にあるCY8C29666で使えるようになっているので、興味のある人はどうぞ。



2/27/2008 作成
2/28/2008 第2段 追加


戻る
inserted by FC2 system