5:プログラム製作

MCP3901を制御するために必要なSPI通信はプログラムI/Oで実現しましたが、単純に1バイトの出力関数(SPIOut())と入力関数(SPIRcv())だけを使っています。これを使ったMCP3901の制御部分はリスト1のようになっています。

リスト1:MCP3901制御関数

まず初期化関数SetupADC()では、CSをLowにしてからRESETコマンドを出力して出力後CSをHighに戻しています。これでリセット動作が開始されますので約1msecの遅延を挿入してから、全レジスタの初期設定を行っています。変調出力は使いませんのでMODレジスタは無視しています。この設定期間全体の間だけCSをLowとしています。

この初期設定が完了すれば、あとは内部で自動的に変換が連続的に実行開始されます。

次の関数が変換結果データの読み出し関数GetData()となります。MCP3901内部で変換が完了するとレディーピン(DR)がLowになりますから、これを待ってから、データ入力を実行します。2チャネル分の6バイトを連続して入力しています。

こうして入力した1チャネル分3バイトから、プログラムが数値として扱えるようにする必要があります。ここでは、long型として扱うため、3バイトのデータから符号付32ビットのバイナリ数値に変換しています。このときPGAなどのオフセット誤差分を補正するためチャネルごとにパラメータOffset1とOffset2を加算しています。

このOffset1とOffset2は、完成後の実機で調整して決める必要があります。

この後さらに、グラフ表示するため、チャネルごとに正側の値だけに変換し、スケール変換して1バイトのデータとしてからBuffer1とBuffer2に格納しています。スケール変換の際には、PGAのゲインによりゲインに個体差が出ますので、実機で調整しながら変換パラメータを調整する必要があります。

さらに、表示を1倍、10倍、100倍の3段階で行いますので、それに合わせてScaleをセットして変換しています。

変換した結果の1バイトのデータをチャネルごとにBuffer1、Buffer2に格納しています。Buffer1、Buffer2はそれぞれ512要素の配列データとして確保していて、バッファが一杯になったら最初に戻って上書きしています。

この格納したデータでトリガ判定をして、そこから320個分のデータだけ表示しています。トリガ指定がない場合には最初から320個分を表示しています。

液晶表示器の制御プログラムは、ライブラリとして構成しました。このライブラリが提供する関数は、表5のようになっています。これらのライブラリ関数を使えば、QVGAクラスのカラーグラフィック液晶表示器でも簡単に制御できます。

表5:グラフィックライブラリの関数

オシロスコープとして使うための画面レイアウトは、写真6のようにしました。スイッチ操作はすべてタッチスクリーンで行いますので、表示がそのままボタンの機能を果たすことになります。

写真6:操作画面レイアウト

表示チャネル選択は12、1、2と3種類で切り替わり、チャネル1、2両方、チャネル1だけ、チャネル2だけの表示をするように切り替えます。

トリガチャネル切り替えは、Trg、CH1、CH2と切り替わり、トリガなし、CH1トリガ、CH2トリガと切り替わります。そのトリガレベルは、右端にある短いバーが現状トリガレベルを示し、トリガレベルアップとダウンのボタンで上下に動かすことができます。

スケール切り替えは、表示スケールの切り替えで、×1、×10、×100と切り替わって表示スケールを切り替えます。同時にCH1とCH2の計測スケール表示が連動して変わります。この値は縦軸1目盛当りの実際の測定電流値を示します。

水平周期切り替えで横軸のスキャン時間が変わり、ボタンの右側に現在値が表示されます。10msec、20msec、50msec、100msec、200msecと切り替わり、それぞれ横軸1目盛当りの時間を示しています。

表示チャネル選択でCH1かCH2の片方だけを選択すると、左端の上下にオフセット調整用のボタンが表れます。これで、入力の0レベルのときの表示位置の調整をします。

6:動作確認

写真6は実際の計測中のグラフで、前回の連載の時計の消費電流を実測しているところです。

このグラフから読み取ると、1秒ごとに180μA程度の電流が約20msec続き、それ以外の時間はほぼ0に近い電流値であることが分かります。

同じ計測状態で、スケールを×10、水平周期を50msecに変更したグラフが写真7となります。

この写真7から180μAの時間が20msecで、その他の時間の電流値が約3μAであることが読み取れます。またノイズ成分が多く含まれており、これ以上の倍率では使うことが困難であることが分かりました。

写真7:スケール変更後のグラフ

ここで、写真8は、当初の時計の消費電流のグラフです。なぜか後半の0.5秒間だけ意図しない余計な電流が流れていることが判明しました。

原因は、リアルタイムクロックICのOutピンとの接続ピンで、PIC側で内蔵プルアップがオンになっていたためでした。このため、OutピンがLowとなる0.5秒間だけ、プルアップ抵抗経由で電流が流れ出していました。

写真8:時計の当初の消費電流グラフ

以上のように、ダイナミックに変化する微小電流をリアルタイムで表示できる専用オシロスコープを使えば、通常のオシロスコープやデジタルマルチメータなどでは計測できない微少電流を、正確に計測することができることが実証できました。

今回の製作で、Microchipの高速ΔΣADCであるMCP3901を使ってみて、24ビット精度での計測はノイズ対策が非常に難しく、今回のような単純な作り方では、16ビット精度が精一杯であることが分かりました。しかし、高速サンプリングの恩恵は十分に得ることができましたので、この特徴を活かした使い方ができれば他の用途にも活用が可能なものと思います。