実際にソフトを組むにあたって最初に問題となったのは通信速度だ。当初データシートの記述を頼りに 460800bps と考えていたが、本当にそうなのか?Copilotは違う値を答えてくるが・・・?
TSD-10に電源を入れると基板面で微小なLEDが点滅を繰り返していた。どうも電源ONと同時に連続測定をスタートしているようだ。こういったセンサーはスタートコマンドを送るまで測定を始めないと思っていたが違ったようだ。それなら測定データをUARTで連続送信しているだろうから、その信号で通信速度を確認すればよい。
オシロスコープでTSD-10のUARTの波形を観測すると1ビットが約2μsに相当するようで、デフォルトの通信速度は 460800bps で間違いないようだ(計算上は1ビットが2.17μsになる)。
そこでPIC16F15325の内蔵UARTを使って近い速度の信号を作ってみたが上手く行かない。内蔵の16MHzや32MHzのクロックを分周しても速度誤差が8.5%出てしまう。UARTは多少の誤差は許容できるはずだが、ここまで違うと無理のようだ。そこで内蔵UARTを使わず、ソフトで直接ポートを駆動してUART信号を作る事にした。送信するデータの1ビットずつを取出し、それに従ってポートをON/OFFるする。この方法で作った実際の波形を観測すると、オーバーヘッドが大きく1ビットに3μsほどかかり2.17μs迄は下がらなかった。そこで最後の手段として、プログラム中にビット出力命令を直接並べて(ハンドエンコードして)実行する事とした。ビット出力命令の実行時間は0.124μs程度なので2μs程度の遅延を挟めば丁度良い信号を生成できる。そうやって出来上がったプログラムの1バイト送信分が、
// 1 - 0x5A
LATAbits.LATA4 = 0; _delay3(5); // Start bit
LATAbits.LATA4 = 0; _delay3(5); // b0
LATAbits.LATA4 = 1; _delay3(5); // b1
LATAbits.LATA4 = 0; _delay3(5); // b2
LATAbits.LATA4 = 1; _delay3(5); // b3
LATAbits.LATA4 = 1; _delay3(5); // b4
LATAbits.LATA4 = 0; _delay3(5); // b5
LATAbits.LATA4 = 1; _delay3(5); // b6
LATAbits.LATA4 = 0; _delay3(5); // b7
LATAbits.LATA4 = 1; _delay3(10); // Stop bit
といったプログラムである。Stop bitを長めにとっているのは次のStart bitまでの時間に余裕を持たせ同期ずれを回復できるようにするためである。 このプログラムは上手く機能した。これで測定の停止(Stop)とボーレートの変更は出来るようになった。ビットレートを一旦9600bpsまで落とせば後はPIC内蔵UARTでも余裕をもってコマンドを送信できる。
もう1つ問題になったのはTSD10からのデータが全く受信出来なかった事である。色々テストした結果判明した原因は、受信に使ったPICのA5ポートが全く機能しなかった事である。以前同様なトラブルが別のPICであり、解決策も以前書いたが今回はそれでも上手く行かなかった。色々試したが結局諦めて代わりに基板を改造してC5ポートを受信に使う事で解決した。
TSD10の仕様によると測定データは毎秒50回(20ms毎に)送られてきて、精度は±5cm、ブラインドゾーン(無感距離)が5cmある。また分解能(測定結果)がmm単位なので使いづらい。そこで複数回(とりあえず25回)の測定の平均をとり、最下桁を丸めてcm単位を結果とするようにした。
実際に周囲の対象物の距離を測定してみるとブラインドゾーンはほとんど無く、測定値には10cm位のオフセットがあった。
オフセットについてはTDS10の個体毎に異なると思われるのでコマンドで設定できるようにした。またデータシートによると反射の無い状態(測定範囲外)では65535mmが送られてくるよう記載されているが、実際にTSD10を空に向けてみると最大探知距離である10000mmが送られてきてデータシートと異なる。
(終り)


0 件のコメント:
コメントを投稿