【概要】
PIC16F1829を使った製作例で、シリアルインターフェースで下記デバイスを接続しています。
@ SPIモジュールで高精度なリアルタイムクロックを接続し、時間管理をします。
A 4チャネルのデルタシグマA/DコンバータをI2Cで接続し、4項目のアナログデータ収集をします。
B データの保存にはI2C接続のEEPROMメモリを使いました。
C USARTでパソコンとRS232Cで接続できます。
D 液晶表示器をI2Cで接続しています。完成したデータロガーの外観は下記写真のようになります。
【全体構成と仕様】
【EEPROM 24LC256】製作するデータロガーの全体構成は下図のようにすることにしました。
全体制御はEUSARTを1組とMSSPモジュールを2組内蔵しているPIC16F1829で行います。
アナログデータの収集には、I2C接続の18ビットデルタシグマA/Dコンバータを使いますが、
4チャネルを内蔵したMCP3424を使います。
データ保存には256kビット(32kバイト)のEEPROMメモリをI2Cで接続し、さらに同じI2Cで
液晶表示器も駆動します。
正確な時間が得られるリアルタイムクロックのDS3234をSPI通信で接続し、ログ管理用の
時間として使います。
EEPROMメモリに保存したデータの取り出しは、RS232Cで接続したパソコンから行うことにします。
保存をCSV形式としてExcelなどでデータとして扱えるようにします。
電源はACアダプタ等から供給するものとし、3端子レギュレータで5Vを生成して全体を5Vで
動作させます。
こうして製作するデータロガーの機能と仕様の目標を下表としました
項 目 仕 様 備 考 電源 ACアダプタ等 6V〜9V
内蔵3端子レギュレータで5V生成
消費電流:10mA以下測定項目 CH1、CH3:電圧測定
最大2.047V 分解能約100μV
CH2、CH4:電流測定
最大2.047A 分解能約100μA
精度約±0.1%
精度約±0.5%データ保存 EEPROM
32kバイト
CSV形式で
時分秒、データ×4を保存
保存間隔は10秒固定IC変更により最大128kバイトまで可能
プログラム変更により変更時刻管理 リアルタイムクロックICによる
時間精度:±2ppm(0℃〜40℃)
年月日時分秒 カウント
時刻設定はパソコンから行うバッテリバックアップ可能だがここでは未使用
(CR2032使用)操作スイッチ S1:未使用
S2:未使用表示出力 液晶表示器 16文字×2行
表示内容
時刻 :MM/DD HH:MM:SS
または
データ:4チャネルを同時表示
+X.XXXX,+Y.YYYY,
+W.WWWW,+Z.ZZZZ,基板に直接実装
時刻設定で計測表示に切り替え
ログ出力 パソコンからのコマンドで開始、停止
EEPROMの内容をそのまま送信
コマンド 機能
r EEPROMデータ読み出し開始
e EEPROMデータ読み出し終了
y 年月日設定 続けて yymmdd入力
t 時分秒設定 続けて hhmmss入力
このロガーではEEPROMをI2Cで接続して使います。EEPROMとして24LC256を使うことにします。【リアルタイムクロックIC DS3234】
このEEPROMは下図のようなピン配置となっています。図中でA2、A1、A0からなる3ピンは
EEPROMのデバイスアドレスの下位3ビットとなり、ピンの配線で設定します。
今回の製作では000としています。
このEEPROMは、I2C通信を使って下図のフォーマットでデータを送受信することで、
バイト単位でメモリのリードライトを行います。
書き込みの場合はデバイスアドレス+Writeモードを送信したあと、書き込むメモリアドレスを
2バイトで送信し、さらに書き込みデータを1バイト送信すればこの1バイトを指定アドレスに書き込みます。
読み出しの場合は、デバイスアドレス+Writeモードを送り、読み出すメモリのアドレスを2バイトで
送信後、再度 Start Conditionとしてデバイスアドレス+Readモードを送れば、その後から1バイトの
データが受信できますので、これに対しNACKを送ったあとStop Conditionを送って終了となります。
このロガーにはMAXIM社のSPI接続の高精度リアルタイムクロック「DS3234」を使いました。
このICの使い方を説明します。
このICのピン配置と信号種別は下図のようになっています。NCのピンはすべて未使用ピン
ですのでオープンのままで構いません。
32kHzピンから正確な32.768kHzのパルスが出力されますので、これをPICマイコンの
タイマ1の外部クロック信号としてPIC内で正確な0.5秒間隔のインターバルタイマを生成します。
VBATに電池を接続すればバックアップ用となり、VDDがなくなっても時刻カウントを継続します。
消費電流は3μA以下ですから、CR2032のようなボタン電池でも十分の時間のバックアップが可能です。
このICを使うときのSPI通信のフォーマットは下図のようにします。
クロックはIdle時Highで、IdleからActiveになるとき1ビット送信という設定になります。
時刻などのデータを読み出す場合は下図(a)のフォーマットで、最初にPICマイコン側から
読み出すレジスタのアドレスを送信し、続いてダミーデータを送信すれば指定したレジスタの
データが読み出せます。このときアドレスの最上位ビットを0にします。
次に、時刻を設定する場合には、最上位ビットを1にしたレジスタアドレスを送信し、
続いて設定データを送信すれば指定レジスタに設定されます。
このときのレジスタアドレスと読み書きするデータは下表のようになっています。
表は全体の一部となっていて、この他にアラーム設定やコンフィギュレーション設定などがありますが、
今回の製作では使っていませんので省略します。
いずれもBCD形式で1バイトに2桁を格納していますので、数値から文字に変換する際には
注意する必要があります。
また時間のデータは12時間か24時間かでフォーマットが異なっていますので注意してください。
【回路図と組み立て】全体構成を元に作成した回路図が下図となります。スイッチのプルアップ抵抗は内蔵プルアップを【プログラム】
使います。
計測チャネルの2と4は電流計測用に1Ωの抵抗を追加しています。この抵抗での電圧降下で
電流を測定します。またA/Dコンバータの電源には簡単なフィルタを追加しています。
リアルタイムクロックのバックアップ用電池が必要な場合にはCR2032型電池を使います。
本製作例では必要がありませんので、実装は省略しています。
この回路図を元にパターン図を作成してプリント基板を作成しました。
組み立て図にしたがって製作が完了した基板の部品面が下記となります。
左下はんだ面にA/Dコンバータが
実装されている
バックアップ用電池の実装は
省略しています
中央下がリアルタイムクロック
左側がA/Dコンバータ
次はプログラムの製作です。データロガーは次の5つのファイルで構成しています。
・DataLogger.c :アプリケーション本体プログラム
・lcd_lib4.c :液晶表示器用ライブラリ プログラムファイル
・lcd_lib4.h :液晶表示器用ライブラリ ヘッダファイル
・i2c_lib4.c :I2C通信ライブラリ プログラムファイル
・i2c_lib4.h :I2C通信ライブラリ ヘッダファイル
これら5つのファイルをすべてプロジェクトフォルダにコピーし、プロジェクトに登録する
必要があります。
アプリケーションの全体フローは下図のようになっています。
初期設定で各モジュールの初期化をし、タイマ1とEUSART受信割り込みを許可しています。
メインループではフラグをチェックして分岐しそれぞれの処理を実行しています。
これらのフラグは割り込みでセットされます。
タイマ1割り込みでは、その都度リアルタイムクロック(RTC)から現在時刻を読み出し
バッファに格納し表示フラグをセットします。
これでメインに戻ったとき表示フラグがオンですから表示処理を開始します。
表示処理では時刻設定が実行されるまでは時刻表示を行い、設定後は計測値表示を行います。
時刻表示の場合は現在時刻を1行目に表示しています。計測表示の場合は、A/Dコンバータの
4チャネルを順次実行しては液晶表示器に表示しています。
タイマ1の割り込みでは、10秒ごとに書き込みフラグをオンにセットしています。
これでメインループに戻ったとき書き込み処理が実行され、EEPROMに1回分のデータが書き込まれます。
EUSART受信割り込みで「r」文字を受信すると読み出しフラグがセットされ、メインループに
戻ったときEEPROMから読み出してはEUSARTで送信します。
これを書き込みデータの最後まで実行するか、EUSARTで「e」文字を受信するまで繰り返します。
EUSARTで「y」文字か「t」文字を受信した場合には、それぞれ年月日か時分秒の設定値を
EUSARTから読み込んでRTCに設定します。
これらを実行するためのサブ関数に分けて実行していますので、多くの関数があります。
データロガーのプログラムのプロジェクト1式は下記からダウンロードできます。
「データロガー プロジェクトファイル ダウンロード」