2014年3月7日金曜日

PIC18F14K50で簡易4chアナログロガーを作ってみた

USB内蔵マイコンを使って何か実用的なものを作ろうと思い、簡単に出来て役に立ちそうなアナログロガーを作りました。

アナログロガーがあれば二次電池の充放電特性を見たり、太陽光発電で使われている蓄電池の電圧推移を記録できるので何かと便利ですよね?

使用したマイコンは、秋月電子で販売されている「PICマイコンPIC18F14K50T-I/SS(USB内蔵)」ってやつです。 USB内臓で150円って安い! 
過去にAVRでロガーを作ったことがありますが、そいつはATmega88のUSART出力をFT232系のシリアル変換ICで受けてPCに送信していました。今回のはPIC内部にUSBインタフェースが内蔵されており、(バッファ用のオペアンプ等を除くと)1チップで完結するのでとても楽です。

といっても、PICでUSBを使うとなると、どうやって開発していけば良いのかよく分からんわけで。。。
イロイロ調べてみると、「microchip社のWEBサイトにUSB機能を使ったデモプログラムがある」とのことなので早速DLしてきました。中にはAudioデバイスのデモだったりCDC,HIDなどたくさん入ってました。
デモプログラムをコンパイルする際、ヘッダファイルのパスを通すのに結構苦労しましたがww

デモプログラムの「Device - CDC - Serial Emulator」ってのを雛形にして改造していきます。
これをコンパイルしてPICに書き込んでUSBに接続すると、PC側からは仮想シリアルポート(COMポート)として認識されます。


PICで行う処理はとても単純です。
1、シリアルデータが送られてくるまでポーリングしながら待ちます。
1、データが送られてきたら、受け取った文字を確認し、"I"であればAN5,6,7,8をAD変換してPCに送信します。
以上です。

AD変換を1回行うだけでは偶然混入したノイズの影響を受けそうなのと、分解能が1024(10bit)になってしまうので、64回変換を行ってその合計をPCに送信しています。
理論上は、入力電圧が固定でADリファレンスも固定なら何回AD変換をしても分解能は1024のままです。
しかし、現実では周辺ノイズやリファレンス電圧の微小なふらつきが有り、閾値付近の電圧を変換する際は、変換値がパタパタ行ったり来たりします。
64回変換を行っている間に閾値のどちらに多く傾くかで結果が変わってくるわけです。
これで見た目の分解能を上げることが出来ます。(多分....)

次にPC側です。こちらも単純です。
1、AD変換値を得たいときにCOMポートへ"I"を送信する。
2、受信データをCHごとに分離して表示する(電圧への換算を行う)。
3、ログの記録やグラフを表示する。
以上です。

汎用のシリアルターミナルからCOMポートを直接叩いても構いません。
ただ、送られてくるデータがそのままだと見づらいのと、受信した日時が記録できないので専用のソフトを作りました。
C#で開発したので、簡易グラフやテキストログの記憶&吐き出し機能も割と簡単に実装できました。

動作中の画面

PC側ソフトウェアとPICのhexファイルなどはこちらです(動作保証なし、細かいバグチェック未)。 
https://db.tt/e7NyeN5t (MD5: 0F7F6214082B2A39CA2066C6A1D2D21A)


~ 以下写真など ~

ロガー本体。
フリスクのケースに入れてます(・ω<)

ANポートに配線前。

プローブ差込口。

分圧基板はクッキングシートで転写する方法でやってみました。

生基板に転写後。

エッチング後。
一回だけだけの転写だとトナーが薄すぎるのか、ピンホールが出来てしまいました。残念。
なんとか使えそう。

部品実装後の分圧基板。
ダイオードは過電圧保護用。
(漏れ電流で逆に悪さをしている感w)

TL431の基準電圧源。

リチウムイオン電池の充電電圧のログを取ってる様子。

 12V12Ahのシールド鉛蓄電池を定電流放電した時の電圧変化をログ取ってる様子。

リチウムイオン電池の充電電圧ログ例 (テキストデータ→ https://db.tt/zdPVdrZD)

シールド型鉛蓄電池の放電電圧ログ例 (テキストデータ→ https://db.tt/5gZneCmD)


周波数カウンタ機能を追加するともっと便利だったかな?
例えば、ハイサイドで電流検出した値を周波数に変換して、フォトカプラで受けるなど。。
Twitterへの投稿機能も追加したい...

入力インピーダンスを高く保ちつつ、精度を上げるには入力のバッファアンプも必要ですね!

~ おわり ~




3 件のコメント: