位相カウンタ
Copyright (C) 19May2005 coskx
【1】H8/3048のITUを使用した位相カウンタのテスト
ITU3chを使用したPWMを用いてモータを駆動し,モータ軸に連動したフォトロータリエンコーダ(インクリメント)からの2相信号をITU2chを利用した位相カウンタの読み込みについてテストする。
なお,ITU2chを利用した位相カウンタはハードウェアとして,16ビットしか持っていないため,-32768から32767までの範囲でのみ,正しく値を読むことができる。
次のプログラムによるテストを行なった。実際動作させて,カウンタの値が±32768を超えた時にどのように表示されるかためしてみなさい。
H8/3048のITUを使用したPWM・カウンタテスト |
/**************************************** #include "h8-01.h" /*************************************** void driveMotor(int
pwm) void
brakeMotor(void) void init_pwm3(int
pwmMax)
/*ITU3の初期化*/ void driveMotor(int
pwm) void
brakeMotor(void)
int getPhaseCounter(void) void clearPhaseCounter(void) ****************************************/ void initPhaseCounter(void) /* void clearPhaseCounter(void) /*何もしないで指定された時間[msec]たつと戻る関数*/ /* mainと割り込み関数のみで共有するグローバル変数,この変数名はINTで始まる*/ #define PWM_MAX 1000 main() /*タイマ割り込み関数*/ |
【2】仮想的な32ビットカウンタを作る
前述のプログラムでは,ITU2chの位相カウンタに対応した関数を3つ,次のように用意している。
void
initPhaseCounter(void)
2相信号カウンタ初期化
int
getPhaseCounter(void)
2相信号カウンタ値取得
void
clearPhaseCounter(void)
2相信号カウンタ値クリア
もし,32ビットのカウンタが存在しても同様の関数を作ると考えられる。異なる点は,getPhaseCounter()の返す値がlong
intになるということである。
32ビットのハードウェアカウンタは存在しないが,存在するように見せかけることは出来る。そこで,この3つの関数は残しておき,次の3つの関数を新たに作成する。
void
initVirtualPhaseCounter(void)
ソフトウェア2相信号カウンタ初期化
内部でinitPhaseCounter()を使ってもよい
long
int
getVirtualPhaseCounter(void)
ソフトウェア2相信号カウンタ値取得
内部でgetPhaseCounter()を使ってもよい
void
clearVirtualPhaseCounter(void)
ソフトウェア2相信号カウンタ値クリア
内部でclearPhaseCounter()を使ってもよい
この3つの関数の内部では共用するグローバル変数の存在を認めるが,それ以外のグローバル変数を使用してはならない。
このような仕様の3つの関数を作ると【1】のプログラムのmain()では,
initPhaseCounter()
→ initVirtualPhaseCounter()
getPhaseCounter()
→ getVirtualPhaseCounter()
clearPhaseCounter()→ clearVirtualPhaseCounter()
の3箇所を変更するだけで【2】のプログラムになる。【2】のプログラムは未完成である。3つの関数を完成させなさい。
H8/3048のITUを使用したPWM・カウンタテスト(32ビットの仮想ソフトウェアカウンタ利用) |
/**************************************** #include "h8-01.h" /*************************************** void driveMotor(int
pwm) void
brakeMotor(void) void init_pwm3(int
pwmMax)
/*ITU3の初期化*/ void driveMotor(int
pwm) void
brakeMotor(void)
int getPhaseCounter(void) void clearPhaseCounter(void) ****************************************/ void initPhaseCounter(void) /* void clearPhaseCounter(void) /************************************************************** この位置に次の3つの関数を記述する。 void initVirtualPhaseCounter(void) /*何もしないで指定された時間[msec]たつと戻る関数*/ /* mainと割り込み関数のみで共有するグローバル変数,この変数名はINTで始まる*/ #define PWM_MAX 1000 main() /*タイマ割り込み関数*/ |