■>サンテックのホームページTOPへ       ■>サンおやじの工作室TOPへ
    工作室
       10mS周期で8個のRCサーボを制御する

<工作室に戻る
プレステのコントローラでRCサーボを動かそう
  ■第1書 RCサーボをどうやってコントロールするか
  ■第2章 RCサーボの性能を調べる
  ■第3章 PC用ジョイスッテックをRCサーボをコントロールする
■10ms周期で8個のRCサーボを制御する
RCサーボコントローラの限界に挑戦!

10mS周期で8個のRCサーボを制御する

RCサーボ4個の制御はタイマWを使用したため、CPUコアはほとんどアイドル状態です。
そのため、キャプチャや、プレステのコントローラを読み取る等の機能を付加することができました。
正直なところ、これだけの機能が入るとは思っていませんでした。検証はしていませんが、まだ余力が有るようです。
それならば、RCサーボ8個を制御できるでしょうか?
ソフトウェアの問題も有りますが、ハード的な制約も有ります。
各ポートのHighレベルの出力電流は最大2mA。ポートの総合出力電流は30mA
この制約を超えて使用する事はできません。実際にRCサーボの信号線の消費電力を測定してみると200〜500uAの範囲に有るようです。
これならH8Tinyの出力ポート全てにRCサーボを接続しても動作しそうです。
ではソフトの方はどうでしょうか。

前回のRCサーボ4個の制御をおさらいしてみると、H8TinyのPWMモードはコンペアレジスタGRAが周期レジスタに使われてしまうため、GRB・GRC・GRDの3出力しか制御できません。
これを解決するためにタイマWをフリーランさせ、コンペアレジスタGRA・GRB・GRC・GRDのコンペアマッチを利用して4出力のPWMを作り出しました。
PWMの周期はタイマカウンタTCNTのオーバーフロー割り込みで、TCNTにセットする値で決まります。
それと同時に、TCNTオーバーフロー割り込み発生時に、FTIOA・FTIOB・FTIOC・FTIODの出力をHighにセットします。
これをしないと、コンペアマッチの出力は、1度パルスを出力するとその後Lowのままになってしまいます。(図1)


図1 オーバーフロー割り込みで出力をHighにしないとパルスが出ない

H8Tinyのコンペアマッチは他にもタイマVに有りますが、タイマカウンタが8Bitなので10mS周期の使用には向きません。(周期が早い)
ではもう4個のRCサーボをどうやってコントロールしましょう?。
いくら暇で困っている(かどうか知りませんが)H8TinyでもnSのタイマの代わりに使うのは・・・・・
やはりタイマWにもう一仕事してもらうしかないようです。もう1度CRサーボのPWMを見てみると、
第2章  RCサーボの性能を調べるで調べたように、パルス幅は最大で2.3mS周期は10mS程度で制御すれば良いわけです。 つまりタイマWもコンペアマッチが発生した後7mS位は暇なのです。


図2 タイマWも暇?

さて暇なタイマWに仕事をさせる方法ですが、8個のRCサーボをA・Bの2グループに分けて、時分割で制御します。
AグループはFTIOA〜FTIOD端子BグループはP50〜P53の端子で制御します。
まずタイマWの周期を5mSにします。そして今までのようにコンペアマッチでFTIOA〜FTIODまでを制御します。
PWMのパルス幅は最大で2.3mSが実測ですから、RCサーボの個体差・クロックの誤差・温度変動・を含めても2倍の5mSまで必要になる事は無いでしょう。
したがって、TCNTのオーバーフロー割り込みが発生する5mSまでには、Aグループの4個のRCサーボにパルスが出力されます。
ここでFTIOA〜FTIODの出力をHighにしたい所ですが、今回はTCNTのオーバーフロー割り込みが発生しても、FTIOA〜FTIODの出力はそのままにしておきます。
そうです先ほど説明した「1度パルスを出力するとその後Lowのままになる」を利用するのです。
このまま次のTCNTのオーバーフロー割り込みが発生するまで何もしなければ、FTIOA〜FTIODの出力は10mS周期のPWMになります。


図3 Aグループの制御

Aグループは制御できたので、次にBグループの制御をします。
Aグループのパルスが出力され、TCNTのオーバーフロー割り込みが発生した後の5mS、タイマWは何をしているのでしょう。
実は出力こそ変化しませんが、GRA〜GRDのコンペアマッチは動作しています。
コンペアマッチは出力を変化させるだけでなく、割り込みを発生させることができるのです。
今までRCサーボの制御でコンペアマッチの割り込みは使いませんでしたが、今回Bグループの制御ではこの割り込みを利用します。


図4 コンペアマッチ割り込み

Aグループのパルスが出力され、TCNTのオーバーフロー割り込みが発生したら、まずP50〜P53をHighにします。そして、コンペアレジスタGRA・GRB・GRC・GRDにBグループのパルス幅を設定します。
その後コンペアマッチA〜Dの割り込みを許可しておけば、後は割り込みを待つだけです。
割り込みアドレスは、タイマWに1つしか割り当てられていませんので、割り込みが発生したらタイマステータスレジスタTSRWの内容を確認して、それぞれの出力をLowにします。
つまり、TSRWのIMFAビットが1ならP50をLowにIMFBビットが1ならP51をLowにするのです。
プログラム中では、1ビット毎に確認していられませんから、TSRWの下位4Bitを反転させてP5xのポートに内容とandして書き込んでいます。これでBグループの制御は終了です。
次のTCNTのオーバーフロー割り込みで、コンペアマッチ割り込みを禁止、AグループのFTIOA〜FTIODの出力をはHigh、そしてコンペアレジスタGRA・GRB・GRC・GRDにAグループのパルス幅を設定すれば10mS周期でRCサーボが8個制御できます。


図5 タイマWのコンペアマッチを利用してグループBを制御する

さて、PWMパルスを作れることが判っても、データが無ければRCサーボは動きません。
今回は、RS232Cでデータを送ります。
RCサーボを8個制御させたのですが、そのほとんどを担っているのはタイマWですから、まだまだH8Tinyは余裕です。特にAグループを制御している5mSの間はCPUコアは何もしていません。
そこで、この5mSを利用してデータを受信します。
データを送り込む役割は、パソコンにさせましょう。
シリアルでデータが転送できれば、パソコンでなくてもOKです。

まずAグループの制御準備が終わった所で、「H8Tiny CPUボード」側から1バイトデータを送信します。
これを受信したパソコン(親)は8バイトのデータを送ります。各バイトはそれぞれのRCサーボ用のデータで0〜255の値です。
H8Tiny CPUボード」側から送っている1バイトは’A’と言うキャラクタを送っていますが、データを受信するタイミングを作っているだけです。したがって’A’自体には何の意味も有りません。
シリアルの設定は

38400BPS   8Bit  パリティ無し  ストップ1Bit  フロー制御無し

です。
全てのソースと回路図、そしてコンパイル結果のモトローラSファイルは以下からダウンロードしてください。
いつものようにパソコンと「H8Tiny CPUボード」の接続は「ダウンロードアダプタ(H8シリーズ)」を使っています。またパソコン側のプログラムとVC++のソースもアップしておきます。
回路図・ソース・モトローラSのダウンロード(rc8cont_1.lzh)
PC側のプログラム・実行ファイル(servo_out_2.lzh)


プレステのコントローラでRCサーボを動かそう
  ■第1書 RCサーボをどうやってコントロールするか
  ■第2章 RCサーボの性能を調べる
  ■第3章 PC用ジョイスッテックをRCサーボをコントロールする
■10ms周期で8個のRCサーボを制御する
RCサーボコントローラの限界に挑戦!