«  | トップページ |  »

2004年5月 6日 (木)




駆動ブロックのエンコーダーの配線のみ、仮につないで実際にカウントさせて見る。特に問題ないようだ...

いろいろ考えたが、結局単純な方法を試した。エンコーダーのパルスを入力ポートに直結。高速なインターバル割り込みにて処理を行い、すべてソフトウエアでカウントしてみる。
枯れた手法だと思うので公開。

エンコーダーは、P8.6、P8.7とP8.0、P8.1に接続されている。

16kHzインターバル(62.5usec)で割り込みを回す。割り込み処理内部で前回、前々回と、今回の状態を比較し、インクリメント、ディクリメントの処理を行う。これで24kHzまでの帯域を確保。直線走行で約7.2m/sec相当。多分大丈夫、かな。


(グローバル変数 定義部分)

const signed char ccEncorderEncord[64]={

0,1,-1,0,-1,0,2,1,1,-2,0,-1,0,-1,1,0,
0,1,-1,-2,-1,0,0,1,1,0,0,-1,2,-1,1,0,
0,1,-1,2,-1,0,0,1,1,0,0,-1,-2,-1,1,0,
0,1,-1,0,-1,0,-2,1,1,2,0,-1,0,-1,1,0

};

(割り込み処理部分)

int i,j;
char c;

us = TW.TCNT;

if ( 1 ){
TW.TSRW.BIT.IMFA = 0; /* 割り込み要求クリア */

usEncorderBuff <<= 2;
usEncorderBuff = (unsigned short)((IO.PDR8.BYTE & 0x00c3) | (usEncorderBuff & 0x0f3c));

c = ccEncorderEncord[usEncorderBuff & 0x3f];
usEncorderLeft = (unsigned short)((int)usEncorderLeft + (int)c);

c = ccEncorderEncord[(usEncorderBuff >> 6) & 0x3f];
usEncorderRight = (unsigned short)((int)usEncorderRight + (int)c);
}
usTest = TW.TCNT - us;
}

(バックグラウンド)

LCDCommand( 0x80 );
sprintf( strBuff, "L %04X R %04X ", usEncorderLeft, usEncorderRight );
for(i=0;i< 16;i++){
LCDData( strBuff[i] );
}

LCDCommand( 0xc0 );
sprintf( strBuff, " %2d.%2d usec ", usTest / 20,(usTest % 20) * 5 );
for(i=0;i< 16;i++){
LCDData( strBuff[i] );
}



割り込み処理時間は、現在のところ見たとおり。実際にはこれに割り込み自体のオーバーヘッドがあるから、+3usecくらいか?
これから処理を追加していって、40usec以下くらいに押さえられれば、何とかなるのでは?と思っている。

どうだろう?

|

«  | トップページ |  »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: :

«  | トップページ |  »