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バイト |
|||||||||||||||||||||||||||
表示形式 |
|
|||||||||||||||||||||||||||
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 初版作成