Distance Meterの製作

 時々使っていた市販品の距離計が、動作不安定から再起不能になってしまいました。早速分解しましたが、タイマ−ICの555が4個と、ベアーチップで構成したものでした。このベアーチップの中身は、MPUと液晶ドライバではないかと思っています。距離計はなくても差し障りはないのですが、なんとなく寂しいので、PICでの自作にチャレンジしました。センサーは超音波センサーを使います。当初は回路でTX・RXを切換え、1センサーで検討していましたが、複雑なうえ、動作が不安定でしたので、途中でTX・RX各々にセンサーを使用する2センサーに変更しました。使用するPICは、CCP機能のあるPIC16F648Aです。

 超音波センサーは40KHzで共振するものを使用し、タイマーICの555で40KHzを発振させます。この発振周波数は7-8間、6-7間の抵抗、及び6-GND間のコンデンサでHLの時間、及び周波数が決まり、下記回路図の定数になりました。PICでこの40KHzをON/OFFさせますが、ONさせるときにPICにEXT割込みをかけ、同時にタイマー1をリセットします。この割込みが終わったら、RX波でキャプチャー割込みをかけるために専用端子にRX波を入力し、タイマー1の値をキャプチャーして液晶表示させるという構成になります。発振周波数を40KHzに合わすため、コンデンサの直並列でトリミングしています。発振の継続時間は555の4ピンをPICのRA3でコントロールしています。Hで発振しLで止まります。Hの時間は250usecに設定しており、この時間内に40KHzは周期が25usecですから、約10サイクル分入る勘定です。RX波はオペアンプで増幅してRB3に、EXT割込みはスイッチのダウンエッジでRB0に接続します。電源電圧は超音波素子が電圧が高いほどよく飛びますので15Vにし、その他は5Vにしていますので三端子7805を入れています。オペアンプの利得は約80dBで、出力を倍電圧整流しています。調整箇所はほとんどないのですが555の発振周波数の調整はTX,RXの超音波センサーを対抗させRXの出力が最大になるようにフィルムコンの値を選択しました。オペアンプの増幅は無信号時のオペアンプ出力のノイズレベルで決めました。

回路説明

#include <16f648a.h>
#fuses HS,NOWDT,PROTECT
#use delay(clock=10000000)
long get,dist;

///LCD_Lib設定
#define mode 0
#define input_x input_B
#define output_x output_B
#define set_tris_x set_tris_B
#define stb PIN_B1
#define rs PIN_B2
#include <lcd_lib.c>

#INT_EXT                // B0
void EXT_isr()
   {
    output_high(pin_A3);       //40KHz_Out gate on
    set_timer1(0x0000);       //Timer Start
    delay_us(250);         // TXバーストパルスの幅
    output_low(pin_A3);       //TX_out OFF
    clear_interrupt(INT_EXT);     //EXT割込みフラグクリア
   }

#int_ccp1                // B3
void ccp_isr()
   {
    get=get_timer1();        // Timer値get
    dist=0.00665*get-5;       // 換算cm -5は実測との補正のため
    lcd_init();            // 表示ルーチンへ
    lcd_clear();
    printf(lcd_data,"MeasureMent"); //Standby 表示
    lcd_cmd(0xc0);
    printf(lcd_data,"DIST=%Lu",dist);
    set_tris_b(0x09);        //B0,B3は入力
   }

void main()
   {
    set_tris_a(0xf7);        //A3 出力
    set_tris_b(0x09);        //B0,B3は入力
    output_low(pin_A3);       //40K出力off

    setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
    setup_ccp1(CCP_CAPTURE_RE);
    ext_int_edge(H_TO_L);

    enable_interrupts(INT_CCP1);
    enable_interrupts(INT_EXT);
    enable_interrupts(GLOBAL);
//Liquid Initial Display
 while(1)
    {
    }
 }

 このプログラムのポイントは、割込み処理です。EXTとキャプチャーの2重の割込みをかけますが、最初のEXT割込み処理の最後に、割込みフラグをクリアしておかなければ、キャプチャー割込みが機能しませんので要注意です。また、BポートがLCDでは出力モードですので、割込み前に入力モードにしておく必要があります。LCDのコントロールはCCSのライブラリをインクルードして使用します。

ソフトの説明

ロジアナで動作確認

 ロジックアナライザのトリガ入力を555の出力に、信号入力をPICのRB3に接続して、PICのRB0に接続されたスイッチを押下すると、液晶にDIST=11と距離が表示されました。単位はcmです。このタイミングチャートにおいて、トリガポイントはバーストの中の40KHzの1周期目の後に出ているように見えます。スイッチ押下後、反射波がトリガポイントから770uSec後に、RXに入波されていることが、このタイムチャートで確認できます。音速を34000cm/secとすると770usecに進む距離(cm)は34000×770×0.000001=26.18cmとなります。これは反射された往復距離になりますので、対象物までの距離はこの値の半分の13cmです。約15%少なめに表示されていることになります。バーストの終端から反射波までは550uSecで、これで計算すると9.4cmになります。最後にバーストの中央から測ると670uSecですので11cmになります。使用したこのロジアナはPCベースで使用するものですが、2現象のストレージオシロに比べると格段に使いやすいです。
 

  

トップページへ戻る

ソースリスト