複数(8個)のRCサーボ制御信号を1つのITUで作る
異なるパルス幅を持つ一連の連続パルスを連続して発生する動作を1つのITUで作る
Copyright(C) 16Nov2004
coskx
8つのRCサーボを同時に制御するための8つの独立したパルス幅のパルスの生成が必要です。8つのITUを使えば簡単ですが,5つしかITUはないので工夫が必要です。RCサーボの周期は20msec程度で,その中のパルスの幅が0.4〜2.2msec程度です。そこで1つのITUで8つのパルス幅のパルスを順番に作って,同時にあいているポートに何番目のパルスかを出力すればうまくゆきそうです。
ここでは,ITU3を使って8つのパルス幅を持つパルスを順番につくり,同時にP3のbit0-bit7にH信号を同期して順番に出力し,8このパルス発生を繰り返すようにしています。8つのAND回路を外付け(ITU3のoutputとP3のbit0,ITU3のoutputとP3のbit1,ITU3のoutputとP3のbit2,...)すれば,8つのRCサーボを制御できるようになります。(どのITUチャネルを使っても作ることが出来ますが,ここではITU3を用いた例を示します。)
ITU3はPWM動作を行ない,PWM周期は2.5msecとしました。8パルスを作ると,ちょうど20msecとなります。割り込みを用いて,1つのパルスが終了するごとに次のパルス幅を与え,8回のパルス発生で8つのパルス幅を持つパルスを順番につくっています。
割り込みはGRAコンペアマッチとGRBコンペアマッチの2つを使用しています。(GRBのみ使うと,パルス幅を長くする変更の時,同一周期中に2度目の割り込みが生じた時に,カウンタアップが不正動作を起こします。)
プログラムのダウンロード
DownLoad |
multipulse.c |
/********************************************************* TCNTとGRAのコンペマッチ 出力はPWMモードなのでTIOCA3 2(CPUのpin) CN1-16になる TCNTとGRBのコンペマッチ割り込み TCNTとGRAのコンペマッチ割り込み 一周期の様子
データ配列 *********************************************************/ #include "h8-01.h" /*パルス幅は最初1000,800,1200,900,1000,1000,2000,2000μsec*/ /*****初期化関数*****/ void startMultiPulse() #pragma
interrupt(imib3INT)/*この名前の関数は割り込みルーチン仕様である*/ #pragma
interrupt(imia3INT)/*この名前の関数は割り込みルーチン仕様である*/ main() |
IntTbl.src |
;************************************************************************ ; .ORG
H'000070 ;IMIA1 |
オシロスコープで確認
ch1はP3B7を検出しているので,系列7の出力時にHになる。周期は20msecである。
ch2はTIOCA3を検出しているので,系列0,1,2,..,6,7が順に出力され,これが繰り返されている。
ch1のパルスに同期がとれているところが系列7の2000μsecのパルスである。
ホストPCのターミナルソフト(例えばハイパーターミナルで動作を擬似的に確認できるようにしたもの)
multipulse.c |
/********************************************************* TCNTとGRAのコンペマッチ 出力はPWMモードなのでTIOCA3 2(CPUのpin) CN1-16になる TCNTとGRBのコンペマッチ割り込み TCNTとGRAのコンペマッチ割り込み 一周期の様子
データ配列 *********************************************************/ #include "h8-01.h" /*パルス幅は最初1000,800,1200,900,1000,1000,2000,2000μsec*/ /*****初期化関数*****/ void startMultiPulse() #pragma
interrupt(imib3INT)/*この名前の関数は割り込みルーチン仕様である*/ #pragma
interrupt(imia3INT)/*この名前の関数は割り込みルーチン仕様である*/ void memdump(void) /*for
Debug*/ main() |
IntTbl.src |
;************************************************************************ ; .ORG
H'000070 ;IMIA1 |