Robotのページ

 

リアルタイムに加速度センサをH8/3052で読み取る


分かりやすく、加速度センサと書きましたが、実際はA/D変換をリアルタイムに読み取る方法なので、加速度センサ以外でも、アナログを用いるものなら何でもOKです。

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

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


 


 

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

 
 

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

 

 

マイコンとの接続


AD.ADDRA〜AD.ADDRDにセンサーを接続してください。
使用するセンサー数が4個未満の場合はAD.ADDRAから順番に使用するセンサーを付けてください。(プログラムの仕様上)
 

 

ソース全景

/**************************************************************************
* 製作日     : 2006/08/03
* ファイル名 : ad_init.c 
* 製作者     : HM (http://dream-drive.net)
* 説明       : H8/3052用のAD変換制御ソースです
***************************************************************************/

//AD変換の初期設定マクロ
#define AD_NUM 3 //AD変換するセンサーの個数-1(0〜3)

//AD変換を保存するグローバル変数
unsigned int ad_0,ad_1,ad_2,ad_3;

/**************************************************************************
*  関数名 : adinit
*  説明   : AD変換ユニットをマクロの個数で初期化
*  引数   : なし
*  戻り値 : なし
***************************************************************************/
void adinit(void){
    AD.ADCSR.BIT.ADF = 0;       //ADFフラグクリア
    AD.ADCSR.BIT.SCAN = 1;      //スキャンモード
    AD.ADCSR.BIT.CKS = 1;       //クロックセレクト、変換時間134ステート
    AD.ADCSR.BIT.CH = AD_NUM;	//チャネルセレクト,使うADの個数を設定
	AD.ADCSR.BIT.ADIE = 1;		//AD変換完了割り込み許可
	AD.ADCSR.BIT.ADST = 1;		//AD変換スタート
}

/**************************************************************************
*  関数名 : int_adi
*  説明   : A/D完了時に呼び出され値をグローバルに保存する
*  引数   : なし
*  戻り値 : なし
***************************************************************************/
void int_adi (void){
	AD.ADCSR.BIT.ADIE = 0;	//AD変換完了割り込み不可

	switch(AD_NUM){
		case 3:	ad_3 = AD.ADDRD;
		case 2:	ad_2 = AD.ADDRC;
		case 1:	ad_1 = AD.ADDRB;
		case 0:	ad_0 = AD.ADDRA;
		break;
	}

	AD.ADCSR.BIT.ADF = 0;	//フラグクリア
	AD.ADCSR.BIT.ADIE = 1;	//AD変換完了割り込み許可
}

/**************************************************************************
*  関数名 : get_ad0
*  説明   : AD:0の変換後の値を返す
*  引数   : なし
*  戻り値 : (unsigned int)AD変換の値
***************************************************************************/
unsigned int get_ad0(void){
	return ad_0;
}

/**************************************************************************
*  関数名 : get_ad1
*  説明   : AD:1の変換後の値を返す
*  引数   : なし
*  戻り値 : (unsigned int)AD変換の値
***************************************************************************/
unsigned int get_ad1(void){
	return ad_1;
}

/**************************************************************************
*  関数名 : get_ad2
*  説明   : AD:2の変換後の値を返す
*  引数   : なし
*  戻り値 : (unsigned int)AD変換の値
***************************************************************************/
unsigned int get_ad2(void){
	return ad_2;
}

/**************************************************************************
*  関数名 : get_ad3
*  説明   : AD:3の変換後の値を返す
*  引数   : なし
*  戻り値 : (unsigned int)AD変換の値
***************************************************************************/
unsigned int get_ad3(void){
	return ad_3;
}

設定個所が1か所あります。
ハイライトしている9行目ですが、使用するA/Dのポート数を設定してください。

AD_NUMの値は設定する[ポート数-1]の実数になります。
 

 

ユーザー関数一覧


void adinit(void);

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

unsigned int get_ad0(void);

任意の場所で呼び出してください。
戻り値にAD.ADDRAのA/Dの値を返します。

unsigned int get_ad1(void);

任意の場所で呼び出してください。
戻り値にAD.ADDRBのA/Dの値を返します。

unsigned int get_ad2(void);

任意の場所で呼び出してください。
戻り値にAD.ADDRCのA/Dの値を返します。

unsigned int get_ad3(void);

任意の場所で呼び出してください。
戻り値にAD.ADDRDのA/Dの値を返します。

 


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