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


超音波距離測定器 処理説明


今回の距離測定器は超音波パルスを送出した後、測定対象物からの反射波を検出します。
音波を出してから戻ってくるまでの時間を計測し、対象物までの距離を測定します。

下図の動作を繰り返し実行します。
この動作と独立してLED表示処理が実行されます。



ラベル定義
;**************** Label Definition ********************
        cblock  h'20'
s_count                         ;Send-out pulse count adr

        endc
    ワークエリアの定義にはCBLOCK疑似命令を使用しました。
    この疑似命令を使うとCBLOCKとENDCの間で定義したラベルのワークエリアをCBLOCKのオペランドで指定したアドレスから順番に自動設定されます。エリアのダブりも防げるので便利です。割り当てられたアドレスを確認するのにはアッセンブルした結果で確認します。

    7セグメントLEDの点灯セグメントデータもEQUで指定しています。
    0から9までは通常の数字表示の指定ですが、10番目は検出エラー表示に使っています。
    作成初期には中央のセグメントだけを点灯させましたが、表示が見づらいので全てのセグメントを消しました。

     11番目は割り込みエラーに使っています。デバッグ用です。



環境指定 他
    LIST および INCLUDE疑似命令プログラム開始については「ライト・コントローラー」を参照して下さい。

    コンフィグレーションワードとして以下を指定しています。
    発振器の種類HS
    ウォッチドッグタイマーOFF
    パワーアップタイマー使用する
    低電圧プログラミング OFF
    (これをOFFにしないとRB3を入出力ポートに使用できません)

    結果は3F72hです。




初期化処理
;****************  Initial Process  *********************
    ポート初期化
      RA0/AN0ポートはA/Dコンバータの入力に使用するので、入力モードに設定します。他のAポートは出力に設定します。
      BポートはLEDのセグメント制御に使うので全て出力に設定します。
      CポートのRC2/CCP1はキャプチャの入力に使用するので入力モードに設定します。

    超音波送信周期タイマー(TMR0)初期化
      超音波の送信周期はタイマー0を使って制御しています。タイマー0は8ビットのタイマーなので256までのカウント値ですが、プリスケーラを256に設定して、256 x 256 = 65535カウントにしています。今回は発振器に4MHzを使用しているので1カウントは(1/(4 x 106))x4 = 10-6秒 = 1マイクロ秒です。ですから、タイマー0がタイムアウトする時間は約65ミリ秒になります。

    キャプチャモード初期化
      キャプチャにはタイマー1が使用されます。タイマー1の初期化を行います。初期化時点ではCCP1は誤動作を防止するためにOFFにしています。

    A/Dコンバータ初期化
      コンバータ入力をチャネル0にしています。今回使用するクロックは4MHzなので、A/D変換クロックにはFosc/8を設定しています。
      A/D変換した結果は上位のビット側を使用するので、結果の格納は左寄せ(ADFM=0)にしています。
      AポートはLEDの桁指定の出力用にも使用するのでRA0/AN0以外のポートはデジタル指定にします。

    LED表示周期タイマー(TMR2)初期化
      ワークエリアに7セグメントの表示データを設定しています。表示の初期値として「エラーコード」を設定しています。
      タイマー2は約10ミリ秒でタイムアウトするようにします。
      PIE1レジスタでタイマー2割り込みを可能にしています。

    割り込み初期化
      タイマー0割り込み、周辺機器割り込み、グローバル割り込みを可能にします。
      周辺機器割り込みを可能にしないとキャプチャ、タイマー2などの割り込みが行われません。
      この処理により割り込み動作が開始されます。

    初期化処理が終了すると割り込み待ち状態になります。自分のアドレスをひたすら実行するだけです。



割り込み処理
;***************  Interruption Process  *****************
    キャプチャ割り込み、タイマー2割り込み、タイマー0割り込みのチェックを行います。どの割り込みが発生したかは各々の割り込みフラッグをチェックして判断します。その後、該当の割り込み処理にジャンプします。
    いずれの割り込みでもない場合には処理を継続しても仕方がないので処理を停止しています。実際の回路ではインサーキット・シミュレータなどがないと割り込み異常は確認できません。リセットするという手もありますが、リセットしてもまた同じ動作をするので意味はありません。正常に動作しない場合にはこの部分も疑ってみる必要があります。
    割り込みが発生するとグローバル割り込み可能ビット(GIEビット)が自動的に"0"になります。ですから、割り込み処理中にさらに割り込みが発生することはありません。



割り込み異常処理
;*************** Illegal interruption *****************
    異常割り込みが発生したときにLEDに割り込みエラーの表示をします。
    この処理はデバッグ用に設けた処理で、割り込み以外のチェックにも使用可能です。




割り込み終了処理
;************  END of Interruption Process **************
    今回のソフトは初期設定以外は全て割り込み処理で行われます。ですから、割り込みが発生した時点で割り込まれた処理では共通のレジスタ(Wレジスタ、ステータスレジスタ)は使っていないので、それらのセーブ、リセーブ処理は行っていません。
    割り込み終了処理ではRETFIE命令でGIEビットを"1"にして割り込み可能状態にします。



超音波パルス送出処理
;***************  Pulse send-out Process ****************
    パルス送出処理では以下の処理を行います。

    割り込み表示クリア
      TMR0の割り込みフラッグをクリアします。これをクリアしないと割り込み処理が終了した時点でGIEビットを立てたとたんにタイマー0のタイムアウトを待たずに、また、割り込みが発生してしまいます。
      念のためタイマー0のカウントエリアをクリアしています。

    検出エラーチェック
      前回のパルス送出後、今回のパルス送出まで反射波の検出が行われなかった場合、測定不能として表示を消灯します。この処理を行わないと反射波が規定時間に戻って来ない場合に前の測定データがそのまま表示され続け、計測を誤ってしまいます。

    反射波検出回路停止
      送信パルスを出した直後、受信回路に回り込みが発生し、誤検出する可能性があります。これを防止するために反射波検出回路の動作を停止します。RA4ポートはオープンタイプで外付けに抵抗器が必要なのでRA5を使用しています。

    キャプチャ動作開始
      タイマー1のカウントエリアおよびキャプチャレジスタの内容をクリアします。入力の立ち上がり検出モードのキャプチャの設定、キャプチャ割り込み可能ビットの設定、さらに念のため割り込みフラッグをクリアしています。

    40KHzパルス送出
      40KHzのパルスは1サイクルのON時間が12.5μ秒、OFF時間が12.5μ秒のパルスです。
      今回の回路では4MHzのクロックを使っているのでインストラクション実行時間は1μ秒です。ですから、正確な40KHzを出すことは出来ません。ON,OFFをそれぞれ12μ秒とした場合、41.7KHz。13μ秒とした場合、38.5KHzになります。この時間の調整はパルス送出処理の中のステップ数を変えて調整します。
      20パルスを送出すると20パルス x 0.025ミリ秒/パルス = 0.5ミリ秒になります。

    表示補正データ取り込み
      ADCON0レジスタのGOビットを立ててA/Dコンバータを動作させます。入力チャネルを切り替えて使用する場合にはこの後約20μ秒の待ち時間が必要です。今回の場合には、入力チャネルは0に固定しているので待ち時間はいりません。A/D変換の完了はGOビットが"0"になるかどうかをチェックして判断します。A/D変換されたデータの上位3ビットのみを抽出し、54を加えて換算値とします。

    誤検出ガード
      パルスを送出した後、受信側への回り込みが終了するまで検出回路を停止します。今回は約1ミリ秒の時間にしましたが、回り込みが少ない場合にはもっと短くてもOKです。回り込みが多い場合にはもっと長くする必要があります。

    反射波検出開始
      誤検出ガード時間経過後、反射波検出を可能な状態にします。



キャプチャ割り込み処理
;******************  Capture Process ********************
    キャプチャ割り込み処理では以下の処理を行います。

    割り込み表示クリア
      キャプチャ割り込みフラッグをクリアします。

    距離換算処理
      反射波を検出してキャプチャ動作で得られるタイマー0のカウント値は音波の伝搬時間に比例していますが、そのままでは表示には使えません。今回の処理では規定値でわり算を行い、距離数値に変換しています。
      例えば1mの距離から反射した場合で説明します。
      1mの距離を音波が伝搬する時間は20℃の場合2/343m/秒=5831μ秒です。タイマー0のクロックは1μ秒/カウントなので、キャプチャ時点のタイマー0の値は5831になります。このとき、表示には100(1mのこと)と表示させたいので規定値として58で割ると距離に換算することができます。規定値はA/Dコンバータで取り込む値になります。ですから、温度が異なる場合、A/Dコンバータに入力する電圧を変換させれば表示の補正をすることができます。ただし、デジタル変換しているので細かな調整はできません。

    表示設定処理
      距離換算した値はバイナリ数(2進数)なので、そのままではLEDに表示することはできません。
      2進数を10進数に変換して各々のワークエリア(百位、十位、一位)に設定します。
      百位が9を越えている場合にはエラー表示にしています。



LED表示処理
;****************  LED display control  *****************
    キャプチャによって得られた距離数値をLEDに表示する処理です。
    LEDは1桁ずつ順番に表示します。ですから、同時には一桁分しか表示していません。
    表示はタイマー2を使用して10ミリ秒毎に行います。表示がちらつく場合にはタイマー2の設定値を少なくしてもっと早い周期で表示させます。