2008/11/8
送信機(JR製PCM9X)のトレーナー出力(D.S.C.)の信号を調べたくて
PIC-16F88を使ってパルス幅を測定できないかと考えました。
調べてみると、PPMモードは3種類のパルスで構成されているようです。
約10msecの同期パルス(active LOW)
約350usecの区切り用パルス(active HIGH)
各チャネル用のパルス(active LOW)
手持ちのPIC-16F88は、タイマーとシリアルの機能を内蔵しているので、
タイマーを使ってで各パルスの幅を測定し、その値をシリアルで出力させて
PCで読み取るようにしました。
回路図はこのような感じです。
入力側回路
送信機のトレーナー出力をトランジスタで受けます。
トランジスタ出力はトレーナー出力と論理が反転しますので、
この回路は出力を5V-0Vにするレベル変換の動作をします。
これだけだとわかりにくいので、シミュレーションの波形を
載せておきます。
上段ウィンドウの緑色の線がトレーナー出力、青色の線がトランジスタの
コレクタ端子の波形です。
トレーナー出力がHIGH側のときはトランジスタがONとなり、
コレクタ端子はLOW(0V)になります。
逆に、トレーナー出力がLOW側のときはトランジスタがOFFとなり、
コレクタ端子はHIGH(5V)になります。
シリアル側回路
PICのUSART出力をトランジスタで反転してシリアルケーブルのTX
に接続します。
PC側から見ると、この端子はRXになります。
トランジスタは、MAX232などのRS232Cドライバの代わりです。
本来のRS232C規格にはなっていませんが、この程度の
回路でもPC側は受けてくれます。
プルアップ抵抗から電流を供給してHIGHレベルを作っているので、
ボーレート57600をビット化けしないで通信できるようにするために
この抵抗値をだいぶ小さくしてあります。
PIC-16F88のプログラム
Cで記述し、CC5Xでコンパイルしています。CC5Xについては
こちらに使い方のメモを書きましたので
参考にしてください。
ソースコード
入力パルスのエッジを検出し、次のエッジまでのパルス幅を
タイマーで測定します。
タイマーは、TMR0を使います。
TMR0用のクロックは、16usec周期となるように設定します。
(この16usecというのが後々都合が良い数字になるのです。)
ソースクロックは、インターナルOSC 8MHzを使います。
プリスケーラは1/32に設定します。
TMR0用のクロックは、デフォルトで 1/4されているので、プリスケーラと合わせると
8MHz x 1/4 x 1/32 = 62.5kHz -> 16usec
となります。
例えば350usecのパルスだと、
350usec / 16usec ≒ 21(小数点以下切捨て)
なので、21という値をPCに送信します。
TMR0は8bitカウンタなので、16usec x 255 = 4080usecまで測定可能です。
PPMの同期パルスは10msec程度ありますので、TMR0ではカウント
しきれずオーバーフローを起こします。
ただ、今回測定したいのは各チャネル用のパルス信号なので、
同期信号を正確に測定できないのは妥協することにします。
シリアルは、PICのUART機能を使って簡単に実現できます。
ボーレート 57600
データ8ビット
パリティ無し
ストップビット1ビット
フロー制御無し
一回の送信データは、スタート+データ+ストップ=10ビットと
なります。
57600bpsで10ビットデータを送信する時間は
1/57600 x 10 = 173.6usec
となります。
PPMでは、各チャンネル用パルスの間の区切り用パルスが約350usec、
各チャンネルも一番短くなったときで約500usecはありそうなので、
この間に10ビットのシリアルデータを送りきることができます。
PCでPIC-16F88から送られてきたシリアル信号を受けとります。
データは0から255までのバイナリなので、Acknowrich.exeというソフトを使いました。
バイナリデータを受信したら、加工しやすいように16進数に変換して
おくと便利です。
Acknowrich.exeで保存したデータをxedit.exeで開くと、16進数が得られます。
後の作業用に、ここではoption設定で1列に表示させるようにしています。
PPMモードのトレーナー信号を取り込んで整理してみました。
Excelファイルはこちらです。
syncパルスはカウンタがオーバーフローしていますので、パルス幅は
でたらめです。9チャンネル分のパルスが出力されていることがわかります。
このデータを取るときに、送信機のエルロン操作をしていましたので、
ch2のデータだけをH列に集めました。単位は[usec]です。
パルス幅がエルロン操作に対応して変化していることがよくわかります。
F列は、PCM9Xの取り扱い説明書の内容を書いたのですが、チャネル番号と
対応しているかどうかは確かめていません。
なお、このデータの最初と最後の部分は、安定化電源のONとOFFの直後で
回路動作が安定していないので、パルス幅もおかしな値が含まれています。