まえがき
PIC等のマイコンと無線モジュール等の周辺機器間ではUARTによる通信が使用される機会が多々あります。
トラブルシュートを目的にUART通信を記録するシステムを考えました。
無線システムの場合は末端器、中継器、親機のように複数台使用しますので本システムは4セット(1セットは子機と本体)製作しました。
機能
システムは「子機(UART-RS422変換)」「シリアルポートロガー(本体)」「RS422-USB変換」「PC」より構成されます。
被測定機器を実際使用しながら測定したいので、子機と本体に分け「子機−本体間通信」をRS422とし長いケーブルを使用できるようにしました。子機の電源は本体から供給します。
本体に記録したデータを「RS422-USB変換」経由にてPCへ送信し、PCにて表示します。
通信速度は9600bps迄としています。
子機
3.3から5V迄のUARTを入力するため、入力トレラント機能のあるBusBuffer74VHC125を使用しました。RS422トランシーバーにはMAX14783EESA+を使用しドライバー動作をさせています。本体から5Vを供給し子機内部のレギュレーターにて3.3Vにして使用しています。
RS422-USB変換器
本体からのRS422をUARTにしその後UART-USB変換によりPCに取り込めるようにします。
電源はUSB経由で5Vを受電しているため、PCの保護のために過電圧/過電流保護コントローラーを経て3.3Vレギュレーターへ向かいます。UART-USB変換器(FT232RL)自身も3.3Vレギュレーターを内蔵していますが未使用です。
シリアルポートロガー本体
PIC18F46K22とキーエンコーダー用にPIC16F630を使用しています。
数バイト程度の少ない通信データを確認するために20文字×4行LCDがあります。LCDでは表示限界がありますので、同時に外部メモリに記録します。外部メモに記録した時刻も同時に記録しており、そのためにRTC(リアルタムクロックRTC-7301DG)及びバッテリーバックアップIC(MAX793S)とボタン電池(CR2032)を使用しています。
外部メモリの内容はPCへ送信し、PCのソフトウエアにて表示します。
なお、ロガーの2つのRXに同時に入力がない想定としています。
シリアルが何バイト連続するか不定なので、1byte毎に外部メモリに書き込むこととしました。
例えば9600bpsの1byte分は(スタート1ビット+データ8ビット+ストップ1ビット)10÷9600=1.04msとなります。
本機はソフトウエア側で速度を気にせず使える高速書込みの不揮発性メモリであるパラレルI/FのFRAM(強誘電体ランダムアクセスメモリMB85R256FPNF-G-JNE2)を使用しました。データ収集中はPCを接続しない運用方法としましたので、不揮発性メモリにすればデータ収集した後PCへ接続する迄の間、電源を落としてもデータが残ります。
富士通セミコンダクター社
http://www.fujitsu.com/jp/products/devices/semiconductor/memory/fram/ へのリンク
1byteのライトサイクルtWCが最低150nsとかなり高速です。パラレルI/FのSRAMと同じように使用できます。
上記回路図によりFRAMのアドレスはPICから直接では無くバイナリーカウンター74HC590ADを2個によって指定します。PICからバイナリーカウンターへパルスを1つ送る度にアドレスがインクリメントされます。従って毎回アドレス1から(0からではありません。最大で65535迄)の書込みとしています。
『※590Aの出力Qが0から始まらないのはCKKとRCKを反転入力しているからです。カウンタをクリア(CCLR)して0になった後、内部カウンタからは出力されません(RCKの立ち上がりがないから)のでQには変化がありません。次にCCKの立ち上がりで内部カウンタは1になってしまい、次のRCKの立ち上がりで1をQへ出力するのです。RCKを反転せずに入力すれば0から始まることはブレッドボードとスイッチで試して確認しましたが2つの入力が共に立ち上がり動作のため、2つの入力の優先度が不明でしたので確実な反転入力を選択しました。』
メモリーはメイン基板から取り外せないのを嫌ってバイナリーカウンターと一緒の別基板にしてメイン基板と二層構造にしました。(上記写真)
外部メモリをパラレルI/Fにしたのでデータポートを共通にするため、RTCもパラレルI/Fを選択しました。PICからアドレスも指定します。1データ(4ビット)リードサイクルtRCが最低150nsで一度に12個のレジスタを読むため最低150ns×12個=1.8μsとなります。
右記の回路図は本体の電源回路とキーエンコーダー回路です。PIC16F630は4つのキースイッチのチャタリング防止用で、出力2ポートはデータ用で0b00から0b11(10進で0から3)、もう1ポートはスイッチを押したときに立ち上がりパルス出力するもので、受け取り側のPIC18F46K22の外部割込み入力に使用して「外部割込みがあった後、2ポートからデータ入力する」のように使用しました。
電源は外部から5Vを取り込みコモンモードフィルタによりノイズを低減させます。その後過電圧/過電流保護コントローラーLTC4361ITS8-1により5.8V超の電圧又は1A超の電流で遮断し以降の回路を保護します。FET出力直後の22μFはこのコンデンサがないと負荷がインダクタとなるためLTC4361ITS8-1の安定化のために入れました。 その後のLCフィルタによりノーマルモードノイズを低減させます。
本システムの定常電流は100mA程度でしたので遮断電流は500mAとし、LTC4361ITS8-1のSENSE抵抗を100mΩにしたかったのです。でも100mΩでは直ぐに遮断しました。
オシロで突入電流を観測すると比較的長い時間突入電流が流れていましたので、LTC4361ITS8-1のCGを付けることで立ち上がりを7msと遅くし、かつSENSE抵抗も50mΩ(遮断値1A)としました。
右記の回路図は本体のRS422回路です。RJ-45コネクタが2つありAは子機と接続し、BはRS422-USB変換器と接続します。1つのRXは終端抵抗の有無を選択できるようスイッチと接続されています。このスイッチは2回路で終端抵抗を使用しているときLEDが点灯するようにしています。
トランシーバーMAX14783EESA+は1つでドライバー動作とレシーバー動作をします。_REとDEにより切換えます。
レシーバー動作側には120Ωの終端抵抗を接続しました。3.3V電源時終端抵抗には22mAの電流が流れます。MAX14783EESA+(40Mbps)の低速版(500kbps)としてMAX14782EASA+がありますので低速版でも十分だと思います。
RJ-45のAとBは7-8端子が並列に接続されています。そして7-8端子はRXに接続されています。複数のシリアルポートロガーの時刻合わせを同時にできるようにするためのもので数珠つなぎに接続し最後の機器のみ終端抵抗を接続する方にスイッチを操作します。
子機の回路図とRS422-USB変換器について
左側が子機の回路図で右側がRS422-USB変換器の回路図です。RS422-USB変換器について述べます。PIC12F1840はLED点滅用のみに使用しました。このPIC電源は2回路スライドスイッチと連動しており、RS422トランシーバーがドライバー動作の場合は点滅します。つまりドライバー動作であることを警告することが目的です。スイッチが反対側の場合は点滅せずトランシーバーはドライバー動作ではなくなります(実際はレシーバー動作)。になります。3.3VレギュレーターにはUSB経由で入ってくるノイズ低減のため超低ノイズTPS7A4700(StrawberryLinux社)基板を採用しました。UART-USB変換にはFT232RL(秋月電子通商社)基板を採用しました。
シリアルポートロガー本体の(CCS C)のソース(usartmonitor18F46K22X.c)
UARTを1byte受信する度に1byteの指標(RX1かRX2の2つを区別するデータ)と受信データをFRAMへ書き込みます。
前述のRTC12個のレジスタを読んで得られるRTCデータは西暦下2桁、月2桁、日2桁、時2桁、分2桁、秒2桁となり、シリアルポートの最後の受信後1.5msを超える「間」が出来たらこの日時データをFRAMに書き込んでいます。
処理時間
FRAMの書込みとLCD表示をしているときをオシロのHIGHで表わした観測結果です。
CH3がFRAMの書込みで、CH4がLCD表示です。
2つの山の間隔は約1msでUART9600bpsのデータ間隔と同じです。つまり2byte連続するデータを受信した時の様子です。
上記の内、CH3のFRAMの書込み部分を拡大しました。4μsと分かります。これは2byte(指標と受信データ)の書込み時間です。
今度はCH4を拡大しました。LCD表示に結構掛かっているのが分かります。LCD表示をしなければ9600bpsよりもっと高速の通信でも記録出来そうです。
CH3はRTCの読み込み時間(HIGHの部分)を観測しました。中央より右側を見ると約36μsであることが読み取れます。12個のレジスタを読み込んでいる時間です。1レジスタ当り3μsとなります。外部水晶は9.8304MHZで 4逓倍でクロックは39.3216MHZとなり1cycleは4/39.3216MHZ=0.102μs/cycle。
3μs/レジスタ÷0.102μs/cycle=29cycle/レジスタとなります。
なお、オシロ中央の直ぐ左側の波形は44μsを示しています。別途観測の結果、次の44μs迄の間隔が約1.5msだったの1.5msのタイマーの割込みによる処理時間の増加であることが分かっています
PC受信プログラム画面
上記がVisualBasicで作ったプログラムで、シリアルポートロガーからデータを受け取った画面の様子です。
「1=」又は「2=」とは指標のことです。次の41はASCIIコードの16進表記で受信したデータとなります。
「T=」以下は日時となります。
1はaから一つずつ増えていくデータを受け取っていて、2はAから一つずつ増えていくデータを受け取っていることとなります