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