GID-ADC2
機能設計(C) 数理設計研究所 2005/5/3 矢澤正人
最近の数理設計では、GID-ADCを標準RS232通信で使用するためのGID-uPCを介して使用することが増えています。
GID-uPCのマイコン駆動クロックを高速のものに変更してGID-ADC単独では困難な高速・一定周期のサンプリングを実現したり、測定値の平均化やピーク検出などの演算をマイコンに処理させるなどしており、基本的な使いやすさは実証済みです。
GID-ADC2は、GID-ADC+GID-uPCをベースに、より汎用的で扱いやすいものとして設計することにします。
基本デザインをGID-ADC+GID-uPCと決めた時点で大枠のハードウェアデザインもほとんど決まり、この範囲の中でどれだけの機能を搭載することができるのかを考えていきます。
ここに書かれた範囲で、ファームウェアで実現する機能は網羅できていると思いますが、実際にコーディングや動作テストが始まると変更や追加があるかもしれません。
分解能、計測レンジ、チャンネル数など、GID-ADC2の基本性能のほとんどの部分は搭載するADCの性能で決まります。
ADCの本来の性能をできるだけ引き出すように、アナログ入力の機能と能力を決めていきます。
ADCの変換速度は、ADCのアナログ入力からパソコンまでの経路のうちいちばん遅い箇所がボトルネックとなります。

20MHzで駆動するPICマイコンのUARTでRS232を実現すると、230.4kbpsが標準ボーレートの上限になります。非標準のボーレートであれば1250kbpsも可能ですがパソコン側の対応状況が不定です。
UARTを利用すると、送信中にAD変換やその他の処理を平行して実行することができます。
ソフトウェアによる460.8kbps半二重通信も可能ですが、データ送信中は他の処理ができず、実質的な転送速度は半分程度になります。
SPIをソフトウェアで実現すると概ね110サイクル=22マイクロ秒、45kサンプル/秒で頭打ちになります。このデータ量をRS232で転送するに675kbps以上が必要です。
ソフトウェアSPIとUARTによる230.4kbpsのRS232を組み合わせた15.36kサンプル/秒が、このハードウェアで実現可能な変換速度の上限となります。
パソコンから指示があるたびに計測を実行する方式が基本ですが、現実には連続データを得たいことが多くあります。
この場合、いちいちパソコンから計測指示をしていては通信オーバーヘッドが大きいだけでなく、OSの割込みによるジッタを避けられません。そこで、マイコンが自動的に一定間隔で計測とデータ送信を連続実行する機能を設けます。
マイコンで一定の時間間隔を作るにはタイマ割込みを使うのが常套手段です。
PICのTIMER1は1サイクル毎にインクリメントする16bitカウンタで、カウンタ値をプログラムで書き換えることができます。
TIMER1のリロード値をパソコンから定義できるようにしておけば、0.2us ×
65536 = 13msまで0.2us単位で設定可能な計測間隔を作ることが出来ます。
実用的には、1分間隔や10分間隔の計測も用途は広いので、さらにソフトウェアで16bitカウンタを儲け、0.2us
× 65536 × 65536 = 14分30秒まで設定できるようにします。
マイコンのタイマ割込み機能は、1サイクル時間=0.2usのジッタを持つので、注意が必要です。
連続計測の実行開始と終了をパソコン側から制御するだけでなく、一定量のデータを得た時点で連続計測を自動的に終了できると固定長データの取得に便利なので、連続計測の回数を規定する機能を設けることにします。
回数を16ビットで表現すると最大は65535回。10kサンプル/秒だと6.5秒、1秒間隔の計測では約18時間となり、必要十分です。
計測をおこなうごとにデクリメントするカウンタを設け、ゼロになったら連続計測を終了する機能を持たせます。
カウンタ値はユーザが設定し、計測開始時にバッファからカウンタに値をロードすることにします。
その他、連続計測の中断機能と、モデムやTNCなどとの接続時必要になる電源ONで連続計測を自動開始する機能を追加します。
制御と計測を組にすると、応用範囲が大きく広がります。
GID-ADCのTxOUT出力も、計測値を元にした外部機器の制御やインパルス応答・インステップ応答の実験などに使われています。
従来のTxOUTはパソコンとの通信方法が変更になったので廃止することにしました。
これに替わるものとしてRTS及びDTRに同期するデジタル出力を設けるつもりでいましたが、単純にインバータを介してレベル変換するだけでなく、マイコンで制御するチャンネルごとに入力と出力を選択可能な2チャンネルのデジタルI/Oとすることにしました。
RTS/DTRによる制御とコマンド制御は後着優先でどちらでも可能なようにします。
せっかくマイコンが介在しているので、デジタルI/Oはカウンタ入力としても使えるようにします。
カウンタ値は1割込み=0.2usごとにサンプリングして状態が遷移していたらインクリメントするフリーランカウンタとし、カウンタ値はADCの分解能に合わせて12bitとすることにします。
通常のカウンタとは別に、PIC16F88には外部トリガで動作するプリスケーラ付きのカウンタを持っているので、これを3つめのデジタルI/Oとすることにしました。これは、1回転・1パルス出力の風速計の直接接続を想定したものです。
0.2usごとのインクリメントでは入力に敏感に反応しすぎてチャタリングが起きる可能性がありますが、これは外部のCR回路で対応することにします。
基本的なプロトコルは、汎用性の高い8データ、フロー制御無し、1ストップビットにします。
通信速度の上限は230.4kHzと決めましたが、これだけでは対応できないパソコンがあるため汎用性に欠け、通信が高速になる代わりに長いケーブルを使った接続ができません。
そこで、1200bpsも可能なようにしようと考えしましたが、PICのボーレートはSPBRGレジスタとBRGHビットを設定するだけで可変させることができるので、いくつかのボーレートを切り替えれるようにするよりも最大の自由度を保証するためにレジスタ値値を直接指定可能とすることにしました。
いくつかのボーレート設定例を示します。
| kbps | KBAUD | ERROR | SPBRG | BRGH |
| 1.2 | 1.221 | +1.75 | 255 | 0 |
| 9.6 | 9766 | +1.73 | 31 | 0 |
| 19.2 | 19.531 | +1.72 | 26 | 0 |
| 230.6 | 238.096 | +3.15 | 5 | 1 |
| 1250 | ----- | --- | 0 | 1 |
高速変換をするためにはバイナリでデータを送るのが有利です。
データは12bitなので1.5バイトで1データ、3バイト=30bit時間で2つのデータを送ることができ、このときにサンプリング速度は最速となりますが、このようなデータ形式はどうしても扱いにくくハイバイトとローバイトの区別も付きません。
若干性能は落ちますが、データ操作が容易でデジタル入力にも対応しハイ・ローバイトの区別も付けたデータ形式を考えてみました。
このデータ形式は2バイト=20bit時間で1変換データとなるので、最大サンプリング速度は11.52kサンプル/秒となります。
カウンタ入力値も同じデータ形式を利用し、B0〜B11を12bitのカウンタ値として使用します。
Dch2のデータを置く場所が無いので、バイナリデータではDch2のビット入力値は表現しないことにします。
データはAch0〜7、Dch0〜3の順に送信します。無効になっているアナログ入力及びカウンタモード以外のデジタル入力は送信しません。
| 上位バイト | 下位バイト | ||||||||||||||||
|
|
バイナリデータは高速転送に向きますが、通常扱いやすいのはやはり直接可読できるテキスト形式です。キャラクタデータによる転送では、可読性はよくなりますが転送量が増えるので通信速度が遅くなります。
アナログ及びカウンタ入力の値は10進数キャラクタ文字で、ビット入力値は1(31h)か0(30h)で表現します。
バイポーラモードに設定されたアナログ入力チャンネルでは、負の値のときにマイナス記号を付加します。
1行で1計測分のデータを構成し、データはAch0〜7、Dch0〜3の順に並べてデータ間をカンマで区切ります。無効になっているアナログおよびデジタルチャンネルは送信しません。
行頭と行末が特定文字になっているとパソコン側での受信データ処理が楽なので、行頭をカンマ、行末を改行コード(0x0d)にします。行頭がカンマなのは、データ送信処理を簡素に作れるからです。
なお、この形式のデータはターミナルソフトでデータを受信保存したファイルをCSVファイルとして直接Excel等で扱えるように考慮してあります。行頭のカンマによりExcel上ではA列はかならず空欄になります。
すべてのアナログ入力をバイポーラ入力に、デジタルI/Oを3チャンネルともカウンタモードに設定すると、1回の計測につき最大で1データ(6文字×8ch)+(5文字×8ch)=88文字の転送量となります。
スタートビットとストップビットを含めると 88char×10bit=880bitなので、これを230.4bpsで送信すると1秒間に261回計測が可能です。速度を犠牲にしているといっても多くの場合十分に高速だと思います。
文字列先頭の1文字を設定またはコマンドの識別子にします。
設定値は、数値は16進数キャラクタ文字列、ビットは1(0x31)または0(0x30)で表現、有効チャンネルと動作モード設定ではそれぞれ各チャンネルごとの設定をEnable,Disable、Unipola、Bipola、Bit、Counterの頭文字で表現します。
ここまでに決めた機能と設定値を実現するためのコマンドを表にまとめてみました。
ターミナルソフトからの操作時、電源投入のたびに設定値を設定しなおさなくても済むように、設定値の保存と初期化機能を追加していす。
付加機能の項目は一例で、機能の追加を想定しています。もっとも、機能を全面的に切替えたいのならばコマンドによる切り替えよりもマイコンを差し替えたほうがいいかもしれません。
| 区分 | コマンド | 初期値 | 名称 | 意味 | |||||||||||||||||||||||||||||||
| 計測設定 | Aaaaaaaaaddd | Aaaaaaaaaddd | 有効ch | a:有効アナログチャンネル0-7 E=有効 D=無効 d:有効デジタルチャンネル0-3 E=有効 D=無効 |
|||||||||||||||||||||||||||||||
| Baaaaaaaaddd | Baaaaaaaaddd | 動作モード | a:アナログ入力モード0-7 U=ユニポーラ B=バイポーラ d:デジタル入力モード0-3 D=無効 b=bitモード C=カウンタ |
||||||||||||||||||||||||||||||||
| Chh | 00 | dch2カウンタ入力プリスケーラ | hh:16進数キャラクタ小文字のプリスケーラ設定 | ||||||||||||||||||||||||||||||||
| Dhhhh | 00 | 計測回数 | dddddd: 1〜65536回を16進数キャラクタ小文字+1で設定 0だと無限ループ | ||||||||||||||||||||||||||||||||
| Ehhhh | 00 | 1秒間隔 | 計測間隔タイマA | 計測間隔=((タイマA値×0.2us) - 5)×タイマB値 ただし、計測間隔は8.681us以上、値は0〜65535であること |
|||||||||||||||||||||||||||||||
| Fhhhh | 00 | 計測間隔タイマB | |||||||||||||||||||||||||||||||||
| Gb | U | 自動計測開始設定 | d:E=電源ONで自動開始する U=自動開始しない | ||||||||||||||||||||||||||||||||
| RS232設定 | Hhh | FF | 1200bps | SPBRG | hh:16進数キャラクタ小文字 b:1'31hまたは0'30h'
|
||||||||||||||||||||||||||||||
| Ib | 0 | BRGH | |||||||||||||||||||||||||||||||||
| Jb | 0 | 出力形式 | d:B=バイナリ形式 C=キャラクタ形式 U=GID-uPCモード | ||||||||||||||||||||||||||||||||
| 計測実行 | K | 計測1回実行 | 計測を1回実行 | ||||||||||||||||||||||||||||||||
| W | 連続計測開始1 | 計測回数を指定した連続計測を開始 | |||||||||||||||||||||||||||||||||
| L | 連続計測開始2 | 計測回数を指定しない連続計測を開始 | |||||||||||||||||||||||||||||||||
| CR(0x0d) | 連続計測停止 | 連続計測を停止 | |||||||||||||||||||||||||||||||||
| デジタル出力実行 | Nb | Dch0出力 | Dch0出力をb=1ならH、b=0ならLにする(RTSと後着優先、連続変換中はRTS優先) | ||||||||||||||||||||||||||||||||
| Pb | Dch1出力 | Dch1出力をb=1ならH、b=0ならLにする(DTRと後着優先、連続変換中はDTR優先) | |||||||||||||||||||||||||||||||||
| Rb | Dch2出力 | Dch2出力をb=1ならH、b=0ならLにする | |||||||||||||||||||||||||||||||||
| その他 | T | 設定の保存 | 設定をマイコンのフラッシュに保存する。 | ||||||||||||||||||||||||||||||||
| U | 設定の初期化 | 設定を初期化しリセットする。 | |||||||||||||||||||||||||||||||||
| V | バージョン番号表示 | "Ver1.0"など | |||||||||||||||||||||||||||||||||
| 付加機能 | Z0 | 気象計モード | 気象計用ADCとして動作 | ||||||||||||||||||||||||||||||||
| Z1 | GID-uPCモード | GID-uPC互換モード | |||||||||||||||||||||||||||||||||
| Z2 | GID-GVモード | GID-GV互換モード | |||||||||||||||||||||||||||||||||
プロンプトには 改行コード+'>'を使用し、受信エラー検出時はプロンプトの前に改行コード+"ERR"のエラーメッセージを付加します。 プロンプト送信後、ただちにコマンド入力が可能になります。
受信文字列長はコマンドにより異なるので、先頭文字受信時に本来の受信文字列長を判定し、受信文字列長が不正であればエラーメッセージ+プロンプトを送信してコマンド待機状態に戻ります。
正常な受信文字列長+改行コードを受信すると受信文字列の解析をおこないます。コマンドが正常であればコマンド内容を実行し、実行終了後にプロンプトを送信します。不正なコマンドであればエラーメッセージ+プロンプトを送信してコマンド待機状態に戻ります。
連続計測実行時、CR以外の受信データは無視します。