多機能デジタルマルチメータ


【DMMの概要】
アナログ機能満載のPIC16F1783を使った製作例としてマルチメータを製作します。
このPICマイコンには多種類のモジュールが内蔵されていますので、これらをフル活用して
外付け部品はほぼ無い構成で次の機能を持つマルチメータの作り方を説明します。

 ・直流電圧測定
 ・直流電流測定
 ・周波数カウンタ
 ・正弦波出力
 ・矩形波出力

完成したマルチメータの外観は下図となります。測定端子が多いので基板のままで使うことにしました。
電源は7V〜9V入力ですので、ACアダプタか006Pの電池を使います。


【全体構成と仕様】

このマルチメータの全体構成は、下図のようにしました。まず表示はI2C接続の液晶表示器だけで行い、
操作部は計測項目選択用のDIPスイッチと、出力周波数などをアップダウンさせるためのスイッチとなります。

システムクロックは周波数精度の点から8MHzのクリスタル発振器を使い、内部PLLで4倍して32MHzの
システムクロックとしています。
電源は消費電流がわずかですので、006Pの電池で十分持ちます。
計測部分についてはPICマイコンだけで構成されています。
端子が直接PICマイコンに接続されてしまっていますので、この構成図を見ただけではどういう動作を
しているのか判別不能です。


 こうして製作するデジタルマルチメータの機能と仕様の目標を下表としました。

項 目  仕 様  備 考 
 電源 006P電池  6V〜9V
内蔵3端子レギュレータで5V生成
消費電流:20mA以下
電圧測定 測定範囲:0V〜4.096V
分解能:約1mV
インピーダンス:1MΩ
精度: 約±3%
電流測定 測定範囲:0〜409.6mA
分解能:0.1mA
負荷抵抗:1Ω
精度: 約±3%
周波数測定 測定範囲:10Hz〜10MHz
分解能:1Hz
負荷抵抗:10kΩ
精度: 約50ppm
正弦波出力 出力電圧 :約4Vpp
周波数範囲:10Hz〜1kHz
周波数設定:20段階固定周波数切替
正弦波分解能:100
矩形波出力 出力電圧:CMOSレベル
周波数範囲:1kHz〜8MHz
周波数設定:10/100/1k/1Mステップ
安定度: 約50ppm
 表示出力 液晶表示器 16文字×2行
表示内容
  +x.xxxV xxx.x mA
  Freq 3000000Hz
または
  +x.xxxV xxx.x mA
  Sine 1000Hz
または
  +x.xxxV xxx.x mA
  Rect 8000000Hz
 電圧、電流は常時表示
 操作 測定項目選択:DIPスイッチ
周波数変更 :Up、Downスイッチ
 
【測定項目ごとの内部構成】
計測項目ごとに内部モジュールをどのように使っているかを説明します。
すべてPICマイコンの内蔵モジュールだけで構成しています。

(1) 電圧測定
 これは最も簡単な構成で下図(a)の構成としています。外部入力を直接12ビット
 A/Dコンバータの入力としています。この入力のインピーダンスを1MΩと一定に
 するため抵抗を挿入しています。
 12ビットA/DはVref+に内蔵定電圧リファレンス(FVR)を使い、Vref-は0Vとしています。
 これで最大4.096Vまでの計測ができることになります。分解能は12ビットですから
 4096ステップなので、1mVとなります。精度はFVRとA/Dコンバータの性能で
 決まってしまいますが、FVRが±3%ですのでこの精度となってしまいました。

(2) 電流測定
 電流測定の場合の内部構成は下図(b)となります。入力に1Ωのシャント抵抗を挿入し、
 この間の電圧降下を測定しますが、電圧レベルが低いので、内蔵オペアンプ#1で
 約10倍に増幅して計測しています。これで測定できる電圧が最大0.4096Vまでですから
 電流に変換すれば最大409.6mAということになります。
 精度は電圧と同じでFVRで決まってしまいます。オペアンプは単純な非反転増幅回路
 構成とし、外付けの抵抗でゲインを決めています。

(3) 周波数測定
 周波数測定の場合の内部構成は下図(c)となります。
 入力信号は交流で低レベルという前提で考え、コンデンサで直流成分をカットし、
 アナログコンパレータ#2を使ってスレッショルドを8ビットD/Aコンバータで低めに設定します。
 これで低レベルの信号でも入力できることになりますし、波形の整形も一緒に行うこと
 ができます。さらにヒステリシスで安定な計測も可能になります。
 D/Aコンバータの出力設定はここでは固定ですが、アップ/ダウンスイッチで
 可変にしても良いかと思います。
 外部ピンでコンパレータ#2の出力C2OUT(RA6ピン)をタイマ1の外部入力T1CKI(RC0ピン)
 に接続します。
 タイマ1では入力パルスのカウントを1秒間継続します。このカウント中にオーバーフロー
 したら割り込みを生成し、プログラムでオーバーフロー回数をカウントしておき、
 1秒後にトータルのカウント数を求めて周波数を求めます。
 1秒の時間は、タイマ2で8MHzのサイクルクロックから20msec周期のインターバルタイマを
 構成し、このインターバルタイマの割り込みを50回受け付ければ1秒ですから、
 この前後でタイマ1のカウントの開始と終了を制御します。
 タイマ2はプリスケーラを1/64とし、周期レジスタを250、ポストスケーラを10とすれば、
 8MHzつまり0.125μsecの入力から、0.125×64×250×10 = 20msec のインターバルが
 生成できます。
 


(4) 正弦波出力
 内蔵の8ビットD/Aコンバータを使って正弦波を出力します。この場合の内部構成は
 下図(d)となります。
 D/AコンバータはリファレンスをFVRとし、4.096Vとします。さらにD/Aコンバータの出力は、
 インピーダンスが高くそのままでは負荷をドライブできませんので、オペアンプ#2に接続し、
 オペアンプ#2をユニティゲインのバッファ構成として十分の出力能力となるようにしています。

 タイマ2を最高10μsec周期という超高速のインターバルタイマとし、この割り込みでD/A
 コンバータの出力電圧設定をします。この出力電圧は、別に正弦波1波形を100分解能で
 構成したテーブルデータを用意し、これを順番に出力します。
 周波数変更はタイマ2のインターバル周期を変えることで行います。最高の10μsec周期の
 場合で、100個の1周期を出力すると、1000μsecの周期となりますから1kHzの正弦波と
 いうことになり、これが最高周波数ということになります。

 周波数変更はそれほど自由にはなりませんので、あらかじめ20個の周波数の設定値を
 用意しておき、Up/Downのスイッチ操作でこの20個を切り替えて周波数を変更するように
 しています。用意した周波数は次の20個です。
 10Hzから100Hzまでの10Hzステップ、100Hzから1kHzまでの100Hzステップ、
 ただし、この周波数はぴったりではなく、近い値です。

(5) 矩形波出力
 矩形波はPSMCコントローラで生成しますが、このときの内部構成は下図(e)となります。
 PSMC1をシステムクロックの32MHzで動作させ、単純な単相PWMパルス出力モードで、
 デューティが常に50%としています。



【回路図と組み立て】
全体構成から作成した回路図が下図となります。ほぼ全体構成そのままという感じになります。
スイッチSW3、SW4、DIPスイッチのプルアップは内蔵プルアップ抵抗を使います。
DIPスイッチは3ビット分のみの接続とし、これで8通りの切替ができるようにしています。
液晶表示器はI2Cタイプなので2本の配線だけです。リセットは本来PICのリセットピンと接続した
方がよいのですが、電源オンリセットだけで済ませています。


製作が完了した基板の部品面とはんだ面が下記となります。
バックアップ用電池の実装は省略しています。





【プログラム】
マルチメータは次の5つのファイルで構成しています。

 ・MultiMeter.c  :アプリケーション本体プログラム
 ・lcd_lib3.c   :液晶表示器用ライブラリ プログラムファイル
 ・lcd_lib3.h   :液晶表示器用ライブラリ ヘッダファイル
 ・i2c_lib3.c   :I2C通信ライブラリ プログラムファイル
 ・i2c_lib3.h   :I2C通信ライブラリ ヘッダファイル

プログラムの全体フローは下図のようになっています。



最初で内蔵モジュールの初期設定を行っています。設定が必要なモジュールは
次のモジュールとなります。
 ・I/Oピン、プルアップ設定も含む
 ・I2Cモジュール  :マスタモード 100kbps
 ・オペアンプ    :オペアンプ1、2両方
 ・コンパレータ   :コンパレータ2のみ
 ・定電圧リファレンス(FVR)   :4.096Vにセット
 ・D/Aコンバータ  :FVRリファレンスで外部出力なし
 ・A/Dコンバータ  :FVRリファレンス 手動変換

最後に液晶表示器の初期化をしてから、開始メッセージを表示し、メインループに入ります。
メインループでは、電圧と電流の計測と液晶表示器への表示を1行目にし、続いてDIPスイッチ
の値をチェックして、0、1、2の場合のみ周波数計測と表示、正弦波出力と周波数表示、
矩形波出力と周波数表示を実行しています。

計測表示の後、アップ、ダウンのスイッチのチェックをしてDIPスイッチの状態に応じて
周波数のアップ、ダウンをします。最後に0.3秒の遅延を入れて全体を繰り返します。

割り込み処理ではタイマ0、タイマ1、タイマ2の3つの割り込みがあります。
タイマ0の場合は正弦波の出力ですので正弦波テーブルのインデックスを更新し、
タイマ0の再設定をして戻ります。
タイマ1の割り込みは周波数カウンタのオーバーフロー割り込みですので、
回数のみカウントして直ぐリターンします。
タイマ2の割り込みで正確な1秒でタイマ1のカウント開始と停止を制御しています。
20msec周期の割り込みですので、50回目で1秒となります。

多機能デジタルマルチメータのファームウェアは下記からダウンロードできます。
MPLAB X IDEのプロジェクトファイルとなっています。

 ★★★ 多機能デジタルマルチメータのプロジェクト1式 ダウンロード ★★★