目次PIC回路集超音波距離計


超音波距離測定器 改善



実際に回路を組み立てて動作を確認すると、最初に想定していたような動作をしてくれません。
以下に今回の作成の中でうまく動作しなかった点を含めて改善した項目を説明します。

RA4ポート
    当初、受信パルス検出回路の制御(動作/停止)はRA4ポートで制御する予定でした。RA4ポートはPIC16Fシリーズでは特殊なポートで前にも使い方を間違えたことがあります。
    RA4ポートの出力はオープンタイプになっており、Hレベル状態にしてもポートはHレベルにはならず、接地から切り離されるだけです。そのため、RA4をHレベルにするためには外部にプルアップ抵抗器を付ける必要があります。
    今回の回路では実装スペースも制限されているので、RA5ポートを使用しました。


温度補正データの取り込み
    空気中を音波が伝搬する速度は周囲温度により変わります。これを補正するために可変抵抗器で電圧を変化させ、A/D変換機能によりデジタル情報への変換を行い、距離換算値として使用しています。
    この補正値の変化範囲は非常に狭いので、当初は可変抵抗器で変化させる電圧の幅を少なくして対応させようとしました。しかし、この方法では電圧の変動または外部からの誘導電圧により影響を受け、安定した動作をさせることが出来ませんでした。そこで、可変抵抗器による電圧変化範囲を0Vから5Vとし、A/D変換した後のデータの処理で対処することにしました。実際にはA/D変換されたデータの上位3ビットのみを変化データとして取り込みます。これにより、可変抵抗器で作られる電圧が多少変動しても距離換算データには影響しなくなりました。


受信回路の電圧
    PICの動作電圧は5Vなので、当初は受信回路の電源電圧も5Vにしました。しかし、超音波を受信した際に受信センサーで発生する電圧との関係で受信回路の電源電圧を9Vに変更しました。5Vではすぐに信号が増幅器の飽和により良好な検出動作が出来にくいと思われます。5Vでの受信機動作の詳細を実験したわけではありません。
    信号保持回路とPICは5Vで動かしているので、信号検出回路の出力(0V−9V)を抵抗器で分圧し、TTL(0V−5V)に合わせています。


キャプチャスタートタイミング
    キャプチャ機能はノイズで誤動作することが考えられます。初期のソフトでは初期化処理でキャプチャ動作の設定をしていましたが、不正なキャプチャ割り込みが発生したため、初期化ではキャプチャで使用するタイマー1の初期化のみを行い、キャプチャ動作の設定はキャプチャ動作を開始するとき(超音波パルス送出直前)に行うことにしました。


接地の方法
    今回の回路では40KHzのアナログ信号を扱います。アナログ信号は回路の配線により微妙に信号レベルが変化します。今回の回路も本来はプリント基板を使用し、アースも充分考慮する必要があります。今回の回路をアクリルケースなどに組み込む場合にはアース板として真鍮の板などの上に回路を取り付ける方が無難です。


発信周波数の調整
    超音波のための40KHzはソフトウェアで作っています。送信ソナーは40KHzの共振周波数を持っているので、周波数を共振周波数に合わせる必要があります。ずれていると送信効率が低下します。
    周波数の調整はソフトウェアのステップを増減して行います。ON/OFF均等に増減します。D1とD2の接続点に簡易レベル計を接続し、ソフトステップを増減してレベルが最大になるように調整します。ソフトウェアを書き換えながら行う必要があり、同じ環境にする必要があるので装置と反射板を固定して行う必要があります。反射する量が変化してしまうと比較できません。少し面倒な作業です。


送信パルス長
    今回の送信パルスの長さは0.5_秒に設定しています。この時間が長いほど超音波のエネルギーが大きくなり長距離の計測が可能になります。しかし、長くすると送信時に受信に回り込む信号も長くなり、ガード時間を長くする必要があり、短距離の計測が出来なくなります。最短計測距離はパルス送出時間と回り込みガード時間(今回の場合1.5_秒)で決まり、今回の場合は約30cmが最短計測距離です。


10位の計算
    キャプチャ機能で得られた距離測定結果を100位、10位、1位の数値に変換する処理で、10位の計算に誤りがありました。1位の値が0の場合、すなわち、10、20、30・・・90の場合、10位に1を加算していませんでした。そのため、10となるべきところが00、20となるべきところが10というように10少ない値となってしまいました。
    例えば、112から少しずつ測定距離を短くすると、112、111、100(110になるべき)、109、108のようになってしまいます。
    これは以下のソースコードが間違っていたためです。
381        goto    digit_u         ;Yes. "R = 0"
    この処理では10を引いた結果の値(R)が0の場合、10位のカウントエリア(disp_t)に1を加算せずに1位の処理にジャンプしてしまいます。
    修正は以下のようになります。
381        goto    digit_t1        ;Yes. "R = 0"
    10を引いた結果の値が0の場合、disp_tに1を加算する処理にジャンプするという修正です。
大井さん ご指摘ありがとうございました。