Robotのページ
リアルタイムにKRG-2ジャイロをH8/3052で読み取る |
|
サーボとマイコンの間に挿入し、勝手に補正してくれる便利なジャイロKRG-2。 ただ、昨今のシリアルサーボには接続するすべがないため、マイコンに値を取り込むプログラムを書きました。
このコードでは、タイマ割り込みを利用しジャイロの値を常に読み続け、リアルタイムに値をいつでも取得することができます。 この記事は、その覚書です。
|
C言語ソースのダウンロード |
|
マイコンとの接続 |
|
|
ソース全景 |
/**************************************************************************
* 製作日 : 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);
int get_gyro(void);
|
Copyright ©2004-2010 HM(みっちー) All Rights Reserved.