目次

システム構成

 移動、画像に関連する処理系のテストが終わったので
 最終システム構成を見直します。



 各処理系に分け、電子回路とVHDLコードを考えます。

 DCモータドライブ

  DCモータは、TAMIYAの6速ギアボックスを
  左右に配置しています。



  電子回路はフォトカプラ、パワーMOSFETを利用した
  シンプルで一方向だけの回転です。



  次のVHDLコードで、DCモータに与えるPWM波形を
  生成しています。

  process (nRESET,iPCLK)
  begin
    if ( nRESET = '0' ) then
      iPCNTC  <= 0 ;
      iRDUTYX <= 0 ;
      iLDUTYX <= 0 ;
    elsif rising_edge(iPCLK) then
      if ( iPCNTC = PCNTMAX ) then
        iPCNTC  <= 0 ;
        iRDUTYX <= iRDUTY ;
        iLDUTYX <= iLDUTY ;
      else
        iPCNTC <= iPCNTC + 1 ;
      end if ;
    end if ;
  end process ;
  iLMOUT <= '1' when ( iPCNTC < iRDUTYX ) else '0' ;
  iRMOUT <= '1' when ( iPCNTC < iLDUTYX ) else '0' ;

  上位の移動制御シーケンサは、次の2レジスタに
  与えるパラメータで、回転数を調整します。

    iRDUTY
    iLDUTY

  予期しないときに、DCモータが回転するのを
  防止するため、イネーブル信号でパルス出力
  を制御します。

  iPWMOUT(0) <= iRMOUT when ( iENABLE(0) = '1' ) else '0' ; -- right
  iPWMOUT(1) <= iLMOUT when ( iENABLE(0) = '1' ) else '0' ; -- left

 ロータリーエンコーダ

  モータの回転軸に、6速ギアボックスについていた
  円形アームを取付け、フォトインタラプタで回転を
  拾います。



  フォトインタラプタは、TLP1018(東芝)の手持ちが
  あったので、それを利用しました。



  データシートでは、5V利用が推奨されていましたが
  3.3Vでも充分動作しました。



  ロータリーエンコーダ用スリットは、DCモータの
  シャフトに取付けてあるので、DCモータ回転制御
  に利用するクロックでサンプリングします。

  process (nRESET,iPCLK)
  begin
    if ( nRESET = '0' ) then
      iROTL_SFT <= "000" ;
      iROTR_SFT <= "000" ;
    elsif rising_edge(iPCLK) then
      iROTL_SFT <= iROTL_SFT(1 downto 0) & iROTIN(1) ;
      iROTR_SFT <= iROTR_SFT(1 downto 0) & iROTIN(0) ;
    end if ;
  end process ;
  iROTL_TRG <= '1' when ( iROTL_SFT = "001" or iROTL_SFT = "011" ) else '0' ;
  iROTR_TRG <= '1' when ( iROTR_SFT = "001" or iROTR_SFT = "011" ) else '0' ;

  ロータリーエンコーダ動作のモニタ用に
  LEDを接続し、回転を目視できるように
  します。

  ROTOUT <= (not iROTL_TRG) & (not iROTR_TRG) ;

  2つのトリガー信号を利用し、左右個別カウンタを
  インクリメントします。これで左右の回転数の差が
  わかるのと、距離を計算できます。

  process (nRESET,iROTL_TRG)
  begin
    if ( nRESET = '0' ) then
      iROTL_CNT <= 0 ;  
    elsif rising_edge(iROTL_TRG) then
      iROTL_CNT <= iROTL_CNT + 1 ;
    end if ;
  end process ;

  process (nRESET,iROTR_TRG)
  begin
    if ( nRESET = '0' ) then
      iROTR_CNT <= 0 ;  
    elsif rising_edge(iROTR_TRG) then
      iROTR_CNT <= iROTR_CNT + 1 ;
    end if ;
  end process ;

 Servoモータドライブ

  Servoモータは、電源とパルスを与えれば回転するので
  フォトカプラを利用し、3.3Vから5Vのパルスを生成して
  います。



  Servoモータでは、20msに一度1ms〜2ms幅のパルスを出力
  すればよいので、20msを2000カウントに対応させて処理。

  process (nRESET,iSCLK)
  begin
    if ( nRESET = '0' ) then
      iSCNT      <= 0 ;
      iSERVOREGX <= 150 ;
    elsif rising_edge(iSCLK) then
      if ( iSCNT = 1999 ) then
        -- clear
        iSCNT <= 0 ;
        -- angle control
        if ( iENABLE(1) = '1' ) then
          iSERVOREGX <= iSERVOREG ;
        else
          iSERVOREGX <= 150 ;
        end if ;
      else
        iSCNT <= iSCNT + 1 ;
      end if ;
    end if ;
  end process ;
  iSERVO <= '1' when ( iSCNT < iSERVOREGX ) else '0' ;

  2000カウントするたびに、新しいパルス幅の値を
  ロードしておきます。

  Servoモータの角度を制御するシーケンサは
  次のレジスタに与えるパラメータを使います。

    iSERVOREG

  予期しないときに、Servoモータが回転するのを
  防止するため、イネーブル信号でパルス出力を
  制御します。イネーブル信号にiENABLE(1)を
  使います。

 電源配分

  DCモータ、Servoモータは、同じ電池を電源とし
  BacCodeScannerとFPGAを同じ電池を電源とします。



  BarCodeScannerがおかしな動作をすると、移動
  そのものに影響がでます。BarCodeScannerには
  極力安定した電源電圧を与えます。


マスターシーケンサ  マスターシーケンサは、マシンをあやつる電子回路です。  スタートトリガーを受取り、センサー情報を  利用し、コース上の移動を制御します。  シーケンサは、ステートマシンとも呼ばれ  次のステートを遷移していきます。  FPGA内部では、ひとつのシーケンサで対応します。  マイコンと同じ動作をしますが、状態遷移が主な  仕事で、センサー情報入力、DCモータへのパルス  出力等は専用電子回路が担当します。  シーケンサは次の手順で動かします。
  1. スタートトリガー待ち(トリガーがくると、ステート2へ)
  2. DUTY比10%で、1秒走行(ステート3へ)
  3. DUTY比25%で、1秒走行(ステート4へ)
  4. DUTY比50%で、1秒走行(ステート5へ)
  5. DUTY比75%で、1秒走行(ステート6へ)
  6. センサー情報入力(ステート7へ)
  7. Servoモータ、DCモータのパラメータ計算(ステート8へ)
  8. Servoモータ、DCモータのパラメータ出力(ステート9へ)
  9. ステート6にもどる
 上の手順は、大まかな処理です。  実際には、5状態を用意し、その状態を遷移します。  前輪には、サーボモータを接続したので  後輪は、左右のモータの回転数を変える  ことによる、信地旋回はやりません。  前輪を左右に操舵するだけで、充分方向を  変えて移動可能でした。
LEDモニタ  基板上には、多数のLEDを実装しています。  LEDは、センサー情報、内部シーケンサの  情報を確認するために使っています。  ・どのモードで走行中かを2LEDで表示します。  ・ロータリーエンコーダが、回転を拾っている   かを、2LEDで表示します。  ・DCモータドライブ回路に、PWM波形を与えて   いるかを2LEDで目視可能に。  ・BCSから入力した路面センサー情報モニタ。   (FPGA基板上のLED利用)  マシン走行を動画撮影し、これらのLEDの  点灯パターンを解析すると、FPGA内部の  電子回路の動作を把握できます。
目次

inserted by FC2 system