Robotのページ

 

リアルタイムにKRG-2ジャイロをH8/3052で読み取る


サーボとマイコンの間に挿入し、勝手に補正してくれる便利なジャイロKRG-2。
ただ、昨今のシリアルサーボには接続するすべがないため、マイコンに値を取り込むプログラムを書きました。

このコードでは、タイマ割り込みを利用しジャイロの値を常に読み続け、リアルタイムに値をいつでも取得することができます。
その分無駄も多いのでリソースの少ないH8に対しては、王道か邪道かというと、邪道のような気もしますが、結構便利です。

この記事は、その覚書です。


 


 

C言語ソースのダウンロード

 
 

H8/3052(秋月) 用
コンパイラ : GCC Developer Lite
ダウンロード

 

 

マイコンとの接続


ジャイロには5Vの電源とGND、あとPortB.B2にジャイロの入力,PortB.B0にジャイロの出力を接続します。
KRG-2は入力を2系統、出力を2系統持っていますが、差分値はどちらも同じなので、同じチャンネルを1方だけ使用してください。
 

 

ソース全景

/**************************************************************************
* 製作日     : 2006/08/03
* ファイル名 : gyro_init.c 
* 製作者     : HM (http://dream-drive.net)
* 説明       : H8/3052用のPWMジャイロ制御ソースです
*            : PortB.B2にジャイロの入力,PortB.B0にジャイロの出力を接続
***************************************************************************/

//グローバル変数:ジャイロの状態を保存する変数
int g_counter;

/**************************************************************************
*  関数名 : gyro_init
*  説明   : ジャイロの初期化をします
*  引数   : なし
*  戻り値 : なし
***************************************************************************/
void gyro_init(void){
	PB.DDR = 0x04; //Bit2を出力,Bit0を入力に
	//出力側の設定
	ITU.TSTR.BIT.STR4=0; //ITU ch4カウントストップ
	ITU.TMDR.BIT.PWM4=1; //ITU ch4はPWMモード
	ITU4.TCR.BIT.TPSC=3; //φ/8を使用(1クロック0.32μsec)
	ITU4.TCR.BIT.CCLR=1; //GRAとのコンペアマッチでTCNTクリア
	ITU4.TCNT=0; //カウンタクリア
	ITU4.GRA = 62496; //20msec周期でTCNTはクリア
	ITU4.GRB=4500; //ITU4のGRBをパルス4500に初期化
	ITU.TSTR.BIT.STR4=1; //ITU4 出力カウントスタート
	//入力側の設定
	ITU3.TCR.BYTE = 0x23;    //GRAインプットキャプチャでTCNT=0,0->1でTCNT++,1/8クロック
	ITU3.TIOR.BYTE = 0xCF;   //GRB立ち上がり(未使用)orGRA両エッジインプットキャプチャ
	ITU3.TIER.BIT.IMIEA = 1; //割り込み許可
	ITU.TSTR.BIT.STR3 = 1;   //カウント開始
}

/**************************************************************************
*  関数名 : int_imia3
*  説明   : ITU3.GRAコンペアマッチで割り込み時に呼び出しされる
*         : パルスの決定とj_counterへの保存
*  引数   : なし
*  戻り値 : なし
***************************************************************************/
void int_imia3(void){
	ITU3.TIER.BIT.IMIEA = 0;  //割り込み禁止
	ITU3.TSR.BIT.IMFA = 0;    //フラグクリア
	if(PB.DR.BIT.B0 == 0) g_counter = ITU3.GRA; //入力パルス立下りでカウンタ更新
	ITU3.TIER.BIT.IMIEA = 1; //割り込み許可
}

/**************************************************************************
*  関数名 : get_gyro
*  説明   : ジャイロの値を返す
*  引数   : なし
*  戻り値 : (int)ジャイロの値を返す(符号が方向を表す)
***************************************************************************/
int get_gyro(void){
	return g_counter-4501;
}

 

ユーザー関数一覧


void gyro_init(void);

ジャイロの初期化と起動。
メイン関数で1度呼び出すと、ジャイロの読み取りがバックグラウンドでスタートします。

int get_gyro(void);

任意の場所で呼び出してください。
戻り値にジャイロの値を返します。(符号で方向を表します)

 


Copyright ©2004-2010 HM(みっちー) All Rights Reserved.