ローコスト7チャンネルADコンバーター(LCD表示機能付)

Topics PICC Pro lite mode Actual use AD convert USART LCD Interrupt PIC16F88

はじめに


Hitech PICC Pro lite モードになってから、使えるデバイスが一気に増えました。Liteモードなので、コードが肥大するというウィークはあるものの、昔のPICC Liteより断然お勧めです。

今回は、PIC16F88を使用した汎用で使えるアナログデジタルコンバータをご紹介します。以前に4チャンネル10bitアナログコンバータ "豆AD"で紹介したエクセルロガーも使用できるので大変便利です。



このように、エクセルロガーを利用すれば簡単にログを取ることが可能です。また、取得値は10ビットデータそのものですが、エクセルを使って関数変換すれば電圧でも対数でも目的に合わせたデータに変換できます。

仕様

装置名 ローコスト7チャンネルADコンバーター(LCD表示機能付)
主な機能 7チャンネル分の10ビットA/Dコンバートされた値のLCDモニター表示と通信機能
通信機能 通信フォーマット:
8ビット、パリティ無し、ストップ1ビット

スピード:
9,600bps(公称値)固定(プログラム内で1200〜38400bps対応可能)
通信フォーマット:
スタート1ビット、データ8ビット、パリティ無し、ストップビッド1ビット

通信方式:コマンドレスポンス方式

 0〜6を受信→対応するチャンネルのAD値を4桁10進数で送出
 a:全チャンネルのAD値をCSV形式で送出
 c:コンソールのクリア

出力レベル:ロジックレベル出力(アイドル=1、スタートビット=0、ストップビッド=1

受信バッファ:32バイト
表示形式
No 名称 機能
1 チャンネル切り替えスイッチ LCDに表示するチャンネルを切り替えます。
0->1->2〜6->0と巡回します。長押しするとキーリピートが掛かります。(そのときのAD表示は、スイッチを離した後安定します)
2 LCDコントラスト調整 LCDを適切な濃度になるよう調整します。
3 電源、ADコンバータ、通信入出力 各入出力コネクターです。
4 PICkit2(ICSP)コネクタ PICkit2を接続してデバッグやプログラムを行います。
5 チャンネルと値表示 現在選択されているADコンバータ値を10進数で表示します。0〜1023の1024段階表示です。
6 バーインジケータ 現在選択されているADコンバータ値を48段階のバーグラフでリニア表示します。
7 プログレスモニター ドットが点滅しており、マイコンが動作している事を示します。通信受信時は*マークが約0.2秒表示されます。
8 スモールバーインジケータ 左より各チャンネルのAD値を6段階+ブランクの計7種類キャラクターを利用し、棒グラフ状で表示します。

MPU Microchip PIC16F88
クロック 内蔵8MHz使用
電源 4.3〜5V 消費電流3.7mA@5V
その他 PICkit2/ICD2インターフェース搭載

回路図


部品表

Item Quantity Reference Part 備考
1 1 CN1 HEADER 9 ヘッダーピン
2 1 CN2 HEADER 3 ヘッダーピン
3 1 CN3 CON7X2 SUNLIKE SC1602BS-B液晶ユニット+コネクタオスメス
※それ以外の互換モジュールでは、電源の1-2が逆転している場合がありますので、配線時には使用するLCDモジュールの仕様を確認してください。14ピン(7ピン2列)
4 1 CN4 HEADER 2 ヘッダーピン
5 2 C1,C3 0.1uF 積層セラミックコンデンサ
6 1 C2 10uF/16V 電解コンデンサ
7 1 DBG1 HEADER6_L ヘッダーピン(Lアングル)
8 1 JP1 HEADER 2X2 2x2ヘッダーピン 通常は1-3と2-4をショートしてください
9 3 R1,R2,R3 100 100Ω 1/8W程度
10 1 R4 100K 100KΩ 1/8W程度
11 1 R5 10K 10KΩ 1/8W程度
12 1 SW1 SW PUSHBUTTON タクトスイッチ
13 1 U1 PIC16F88 PICマイコン
14 1 VR1 10K(B) 半固定抵抗LCDコントラスト調整
15 1 基板    
16   配線材、スタッド等    

部品は、一般的なものを使用しているので入手は容易と思います。

プログラムダウンロード

Date version Build Folder Device note
new
2009/11/17
1.21 MPLAB8.40,Hitech PICC pro Lite mode v 9.70 C:\picsrc\piccpro\lcd_adc PIC16F88 lcd.cの修正。動作は1.20と同等です。
2009/1/15 1.20 MPLAB8.10以上Hitech PICC Pro lite mode v9.60 PL4build3206以降 C:\picsrc\piccpro\lcd_adc PIC16F88 平均化処理にfloatを使うのをやめ、プログラム容量を大幅に減らしました。またCGキャラクタもEEPROM領域で定義するようにしました。
2009/1/12 1.13 MPLAB8.10以上Hitech PICC Pro lite mode v9.60 PL4build3206以降 C:\picsrc\piccpro\lcd_adc PIC16F88 LCD表示でAD値のゼロサプレス(例0012→12と表示)にしたので、数字が読みやすくなっています。またlcd.cの部分の見直しを図りました。

※Folderで指定されているフォルダにmain.c等の全てを解凍すれば、プロジェクトがそのまま使用可能です。いずれもzipで圧縮されておりhexファイルが同梱されています。MPLAB8.15以降に付属のPICC Pro v9.60 PL3や公式に公開されているPICC Pro v9.60 PL3を使用してLiteモードでビルドした場合の動作保障はありません。こちらを参考にして最新のPICC Proをダウンロードして使用してください。PICKit2のアプリケーションv2.55を使用するとき、接続したまま電源を入れると、PICの中のプログラム内容が変更されます。(書き込み直せば問題ありません)

調整

半固定抵抗を回してLCDの濃度調整をします。それ以外の調整箇所は特にありません。

写真

これがプロトタイプです。左上からUSB-シリアル変換基板、本機、テスト用半固定抵抗基板です。
この基板は、4列20桁も搭載できるようにしてあります。
アナログ入力のテストはエレキジャックの付録を利用しました。
シリアルは、ストロベリーリナックス社のUSB-シリアル変換モジュールを使いました。
基板構成です。これだけの部品で最大7チャンネル分のAD変換とLCDモニターを実現できます。
裏面です。部品が少ないので、製作に慣れている人であれば、2時間位で出来上がると思います。
コンソールで「a」を送信すると、このように帰りデータとして受信します。


特記事項

■ハードウェア
・アナログ入力の回路は、なにも構成されていませんので、使用目的に応じた回路を付け加える必要があります。電圧監視では、抵抗の分圧比だけでも実用的に使用できます。温度計やストレインゲージなどの高精度なアナログ入力にはオペアンプなどでそれなりのインターフェースを構成する必要があります。
・PICkit2を使用しながらデバッグする場合、RB6とRB7をアナログ入力のAN5とAN6として使用しているので、そこにはアナログ入力を切れるようなハードウェア構成にすることが望ましいです。(一応100Ωの保護抵抗は入っています)
・PICKit2を接続しているときにMPLAB IDEでプログラムを書き込む場合、基板上のタクトスイッチではコントロールができません。MPLAB IDE上のMCLR操作スイッチにて操作してください。
・LCDの配線は、通信を使用する以上、変則的な割り当てになっています。(RXだけ、もしくはTXだけという使い方ができません)
・アナログ入力のグランドは、精度を上げるためにPICマイコンの電源ピン(5番)に近い部分から取るようにしてください。
・PICのアナログ入力インピーダンスは10KΩ以下にしてください。高いインピーダンスを受けるときはオペアンプなどでバッファします。
・LCDはサンライク社SB1602を使用する場合、回路図上のJP1は1-3と2-4をショートしてください。それ以外のLCDを使用する場合は、部品仕様書などで電源ピンを確認の上設定してください。

■ソフトウェア
・平均処理は修正移動平均処理(もしくは平滑移動平均処理)をしています。メモリーを節約するためunsigned intのみで行うようにしました。

このプログラムでは、最初にADコンバータの取得データを16倍し、希釈用の変数(予め16倍された過去のデータが入っている)を更に3倍にしてこの2つを足し、それを4で割っています。その時下位4ビットが8以上かどうかで丸め処理をしています。これにより、大幅なプログラム容量の節約となりました。ここで使用している16倍は、その時適当に決めた値であり、2のべき乗を取る数字であれば何でもよく、その半分の値を四捨五入の判定としていました。更に最適化した方法をオーディオレベルメーターで採用しています。

改善前
adc_average = (adc_average * 4 + adc_value +0.5 )/5;//平均化処理用
adc_value = (unsigned int)adc_average;//平均化処理用

※adc_averageの型はfloat、それ以外はunsigned int
修正移動平均の移動平均量は5に固定しています。
このプログラムで採用している方式
tank_adc_value16x = (adc_value * 16 + tank_adc_value16x * 3)/ 4;//平均化16倍処理
adc_value = tank_adc_value16x /16;// 1/16処理
if ( (tank_adc_value16x % 16 ) > 7) adc_value++; //丸め処理

※全ての変数の型はunsigned int
修正移動平均の移動平均量は4に固定しています。
オーディオレベルメーターで採用している方式
adc_average_dilution = (adc_data * 2 + adc_average_dilution * temp) / (temp+1);//平均化処理(2倍)
adc_data = adc_average_dilution /2;// 平均化された値を取り出す
if ( (adc_average_dilution % 2 ) > 0) adc_data++; // 数値丸め処理

※adc_average_dilutionは常に前回の値の2倍が格納されている

tempの変数で修正移動平均の移動平均量を変更出来るようにしております。(最大15まで)
こうすることで、PICの処理速度を改善し、メモリーを節約しています。

・バーグラフとAD値は、即値を使用すると、数字がふらつき読み難いため平均化した値を使用して表示しています。
・通信で出力される数字は即値データを使用しています。
・LCDのユーザーキャラクタ定義は8種類を全て使い切っています。小さいグラフのキャラクタは”_”(アンダースコアー)を使っています。
・通信バッファは32バイト分持っていますので連続した電文は32文字までなら処理します。それ以上の電文は読み飛ばされます。
・添付のlcd.cやsci.cなどのファイルは、サンプルを加工しています。
・ADコンバーターの計測は、通信を使用しているのでスリープ機能を使用しないで動作させています。
・提供ソフトはチップが使える7チャンネル分全てのAD入力を使用していますが、使用目的によりカスタマイズすると良いでしょう。
・VrefはPICの電源を使用していますが、AD入力のピン機能の交換で外部Vrefに対応することができます。

付録

・ボーレートのエラーレート表

nominal baud Fosc(MHz) brg parameter integer actual rate error rate
1,200 8 64 103.17 103 1201.92 0.16026%
2,400 8 16 207.33 207 2403.85 0.16026%
4,800 8 16 103.17 103 4807.69 0.16026%
9,600 8 16 51.083 51 9615.38 0.16026%
19,200 8 16 25.042 25 19230.77 0.16026%
38,400 8 16 12.021 12 38461.54 0.16026%

あとがき

最初はLCDでレベルメータを作っていたのですが、色々やっていたらこのようなものになりました。対数変換部分を入れてしまえば出来るかなと思っています。応用として、コンソールから各種設定をできるようにしたり、4行20桁のLCDを使う例が挙げられます。今回のプログラムはスリープ機能を使用していませんが、通信で受信を使わなければスリープ機能でAD変換を使用できるので、LSBの精度が若干改善します。複数のチャンネルが同じようなアナログ回路で構成される場合は、外部に74HC4051などのアナログマルチプレクサなどで切り替えられるようにしてアナログ回路の共有をすると、回路が簡単になるでしょう。

BBSにご意見ご感想をお待ちしております


2011/12/21 一部修正と加筆(移動平均計算の部分)
2011/10/2 語句の誤り訂正 単純移動平均→修正移動平均
2009/1/15 バージョン1.21公開
2009/1/15 バージョン1.20公開
2009/1/12 lcd.cの修正
2008/12/3 一部修正
2008/12/ 1 一部修正
2008/11/30 初版作成


ホーム