ミリ秒計測回路

  1. ミリ秒計測

    1. ミリ秒計測システム

       プログラムでミリ秒を計数することは容易ですが、スタート&ストップの信号の生成回路は状況に応じて適切な選択が必要です。ここでは、赤外線発光ダイオードと赤外フォトトランジスタを利用したスイッチを組み込み時間計測を行うシステムを紹介します。

    2. 赤外発光ダイオードとフォトトランジスタ

       赤外で発光するダイオードとフォトトランジスタは環境によってはスイッチ信号として利用できます。赤外光は可視光よる波長の長い光で、通常の室内照明環境ではスイッチとして利用できます。赤外光LEDで赤外を照射し、これをフォトトランジスタで受けてスイッチします。障害物が光線を遮るとフォトトランジスタがオフしてタイミングを通知します。
       TPS601Aはレンズ付のフォトトランジスタです。赤外線を受光すると、(これがトランジスタのベース電流となり)コレクターエミッタ間が導通します。赤外の中心波長は 800nm 、受光角度は±10度で、スイッチ時間はμ秒です。下の写真左が赤外LED、右がフォトトランジスタです。発光と受光の角度が一致していないと受信できません。

       

      センサー回路と距離の関連です。発光側にTLN108を利用した場合、30mmで数mA、TLN201を利用すると100mm 程度まで間隔を取ることが出来ます。


      ここではフォトトランジスタとしてTLN110Aを利用します。パッケージはTPS601Aと同じで、コレクタ側の端子がアノード(+側)になります。最大電流は100mAですが、ここでは、30mA 程度を流します。

  2. ここでの目的


    1. 目的

       ここでは、重力による落下時間を計測し、理論計算と実際の落下時間を照合する実験を行います。

    2. システム概要

       実際に落下させて計測を行うため、高さ2m程度の櫓(柱)を用意します。落下直後、中央、床直前の、赤外光による通過センサをおき、中央までと床までの落下時間を計測します。1.8m の落下時間の計算値は600m秒ですから、ミリ秒単位で3桁の計測が可能です。

    3. 表示

       表示には、I2C接続の6桁の7素子数字表示器を理由します。I2C接続のため、電源2本、信号4本のみで接続が可能です。

  3. システム構成


    1. フォトセンサー回路

      フォトLEDとLEDは別の小型基盤に10cm程度離して取り付けます。この回路を3回路用意し、出力信号をPIC のAポートに接続します。


    2. 計測回路(PIC利用)

      フォトセンサーの信号をA3,A2,A1に接続します。フォトセンサーの出力を確認するLEDをA1,A0,B5に接続します。ICSPはPICKIT2用の書き込み回路、I2Cは表示用の6桁7セグを接続するI2Cバスです。


    3. 計測プログラム

      16F88を用いた計測プログラムを紹介します。スイッチの押し下げがない場合、3個のセンサを読み取りLEDで表示します。消燈していれば、光が届いています。間隙に手を入れると発光します。
       スイッチを押すと、計測モードに入り、センサAで計測開始、B,Cを通過するとそれまでの経過時間を表示します。計測時間が990m秒を越えると、通過信号がなくても繰り返しを終了します。
       B3にスイッチを接続します。スイッチがオフのとき、3個のセンサー信号の値をLEDぬ出力します。LEDの光がフォトトランジスタに入射していないと、LEDが点灯します。この場合、LEDとフォトトランジスタの方向が直線状に揃うよう調整します。
       スイッチがオンになると、計測を開始します。まず、センサAの信号がオフになるのを待ちます。次に、センサーBがオフになるまで、ミリ秒単位で計数します。Bがオフになったら、センサCがオフになるまで、m秒単位で計数します。
       センサA,B,Cがオフにならない場合、(ボールがセンサを通過しない場合)999まで計数すると、センサの次の読み取りに進みます。

      //m秒時間計測
      
      //SensorA A2
      //Sensor B A3
      //SensorC A4
      
      //Sensor checkLED A0
      //Sensor checkLED A1
      //Sensor checkLED B5
      
      //TestSW B3
      
      //I2C B1,B4
      //ICSP CLR,B7,B6
      
      // I2Cマスター 6*7seg  0x62  //  
      
      #include <16f88.h>
      
      #fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT
      #use delay(clock = 20000000)      
      #use i2c(MASTER,slow,sda=PIN_B1,scl=PIN_B4)
      
      #use fast_io(B)
      #use fast_io(A)
      
      #define seg6dva 0x62
      
      int sn,i,w;
      long count0,count1,count2;
      int dig[6];
      
      void main()
      {
      
       set_tris_a(0b11100);//4,3,2:in, 0,1:out
       set_tris_b(0b11011111);//
      
        output_bit(PIN_A0,0);
        output_bit(PIN_A1,0);
        output_bit(PIN_B5,0);
        delay_ms(300);
      
         count1 = 987;
         count2 = 321;
      
        while(1){
        
         if(input_b() & 0x8){//sw off
          //Sensor test mode
            sn = input_a();
            output_bit(PIN_A0,bit_test(sn,2));
            output_bit(PIN_A1,bit_test(sn,3));
            output_bit(PIN_B5,bit_test(sn,4));
          }
      
          else {//測定開始
           count0 =0;
           count1=1;
           count2=2;
      
            while(input_a() & 0x4){
              output_bit(PIN_A0,1);
              count0++;
              delay_ms(3);
              if(count0 >= 999) {
                count1=888;
                break;
               }       
            }
           
            while(input_a() & 0x8){
              output_bit(PIN_A1,1);
              count1++;
              delay_ms(1);
              if(count1 >= 999) break;
            }
           
            while(input_a() & 0x10){
              output_bit(PIN_B5,1);
              count2++;
              delay_ms(1);
              if(count2 >= 999 ) break;
            }   
          }
      
          //10進数に分解
          dig[5] =count1/100;
          w = count1 % 100;
          dig[4] = w/10;
          dig[3] = w % 10;
      
          dig[2]=count2/100;
          w = count2 % 100;
          dig[1] = w /10;
          dig[0] = w % 10;
          
          //I2C 送信
           i2c_start();       //スタートコンディション
           i2c_write(seg6dva);
           for(i=6;i>0;i--){
              i2c_write(i<<4 | dig[i-1] );//桁数と数値
           }
           i2c_stop();
      
          delay_ms(100);
          //count2++;
      //else
        }//while
      }          

  4. 結果、問題点


    1. 計測結果

       A-B間とB-C間の距離から、通過時間の理論値は389mSと217mSになります。実験では、約600m秒の1.8mの落下時間を数m秒の誤差で計測できました。
      理論値 実験1 実験2 実験3 実験4
      A-B間 389 383 378 391 417
      BーC間 217 222 222 223 222

    2. 計測開始タイミング

       落下物体(木製の球)をクリップで留め、この直下に第一センサーを配置しますが、クリップで留める位置のずれで測定誤差が発生します。600m秒の計測に対し20m秒程度の誤差が発生します。

    3. 落下経路

       落下経路の途中に通過センサーを設置しますが、球がこの経路を横切らないと、通過の検知が出来ません。球を離すときにずれが発生すると計測に失敗します。実際には、数回に1回の失敗が発生します。
       センサー不通過の場合、表示は999となります。

    4. センサーの対向配置

       感度をあがる(雑音を防ぐ)ため、レンズ付のLEDとフォトトランジスタを使用していますが、パイプなどで固定すればよいのですが、ここでは、単線の導線で向きを合わすため、ちょっとした接触で位置がずれてしまいます。10cm の間隙で向きを合わす(検知用LEDを消燈させる)には、ちょっとした手間が必要です。