ところが今までのプログラムでは、入力パルス幅を読み込んだあとそのパルス幅に応じた PWM 制御による出力でモータを駆動し、次の入力パルスを読み込む直前に出力を停止している。ただし、フルスロットルの時は入力パルス幅を読み込んでいるときも、連続 ON でモータを駆動するようにしている。フルスロットル以外では、入力パルス幅をカウントしているときはモータへの出力が OFF になっているので、例えばデューティ比 50% のときでも実効出力は 50% にならない。
出力が完全に ON になる一歩手前のデューティは 950μsec ON / 50μsec OFF を繰り返しているので 95% のデューティ比となるが、実際にはカウント時の無出力部分と次の入力信号の少し手前で出力を OFF にしているので、平均出力が 83.3% ほどになってしまう。つまりフルスロットルと、直前のスロットルとの間に段差ができてしまう。その後、カウント時にも PWM 出力するようにプログラムを組みなおし、かなり段差を改善することができたがそれでも気になる。これがその改善前と改善後のスロットルカーブ。
何とかこの段差をなくすことができないか悩んでいた。つい最近中本さんが自分の飛行機に搭載するマグネットアクチュエータドライバを作ったということで、そのプログラムをプリントしてくれた。初心者の作った冗長なプログラムを見て、こんな風に組んだらいいよと暗に教えてくれたのだと思う。プログラムリストのコメントの多さからもそのことは明白だ。何日間かかけてプログラムの動作を追った。なるほどと感心させられるところばかり。願ってもない良き教材にただただ感謝。お陰でプログラムの中からその解決の糸口を見出すことができた。
プログラムのアルゴリズムは今までとは全く違ったものとなった。スロットル信号のパルス幅をカウント中も PWM 制御出力を行う。測定中のパルスではなく、一つ前に取得したパルス幅を元に PWM 制御を行う方法だ。この方法なら PWM 制御が途切れることはない。今まで以上に滑らかなコントロールとリニアリティが得られる。
電源投入時には一つ前のパルス幅は存在しないので、予め用意したスロットル OFF に相当するデータを元に処理を開始する。二度目からは前回取得したパルス幅に基づいて処理をする。 PIC16F84A で実験を繰り返した。送信機からのスロットル信号はおよそ 23msec に 1 回更新される。何らかの障害でそのスロットル信号が途絶えたときは、安全のために出力をカットするのが望ましい。しかしその方法がなかなか見つからなかった。レジスタ 2 つを使ってカウンタを作り、20μsec ループの中でパルスが検出されなかったらカウントアップし、上位桁がオーバーフローしたら異常と判断して出力をカットするようにプログラムを組み込んだ。20x256x256=1310720μsec つまり約 1.3 秒間信号が途絶えたら出力をカットする。パルス入力がある都度そのカウンタをリセットしている。入力パルスが連続して 57 個ほど欠落したら出力をカットする計算になる。
では上記のリセットプログラムを組み込めば安全かというとそうもいかない。なぜならインドアエアプレーン用の受信機には、送信機からの信号が途絶えると、デコーダからノイズ成分を出力してしまうものも結構ある。受信機の回路構成を簡単にして軽量に仕上げてあるからだ。そのような受信機ではあまり役に立たない。 RX5-2.3 も GWS の 4 チャンネル受信機もそうだ。
スロットルの分解能はプログラムループのステップ数で決まる。 4MHz の発振回路なので 1 ステップは 1μsec 。プログラムは処理内容によって分岐が発生する。どの分岐経路を通ってもステップ数が同じになるようにプログラムを組まなければならない。ループのステップ数は短いに越したことはないが、分岐経路で一番多いステップ数に他の分岐経路のステップ数を合わせることになる。それにもかかわらず 1 ループ 20μsecという短さでプログラムを実現することができた。そのお陰で従来の 20 ステップから 36 ステップへと大幅に分解能を増やすことができた。 PWM 周期は 20x36=760μsec 。つまり PWM クロックは 1.3KHz になる。今までになくきめの細かい滑らかでリニアなスピードコントローラに仕上がった。
プログラムの行数も劇的に減った。その結果 PIC12C509A への移植も簡単だった。今度は人に見せてもあまり恥ずかしくないプログラムになったと思うが、見る人もいないだろうからとりあえず PIC12C509A 用 micro02 スピードコントローラ HEX ファイル (1KB) のみ公開。コンフィギュレーションもプログラム上で設定してあるので、秋月のライターなら読み込んでそのまま PIC に書き込める。 Futaba の送信機を使う場合はスロットルをリバースに設定する。 JR ならノーマル設定のままでいい。回路図は前回のスピードコントローラと全く同じ。
前回作った空中配線スピードコントローラの PIC のみを入れ替えて新たなスピードコントローラを作り、早速 A-1 飛行機に載せてみた。実際の飛行では微妙なスロットルワークに追随して申し分ない性能を発揮してくれた。
これまでの PIC プログラミングを振り返ってみると、今回は特にプログラミングレベルがアップしたという実感がある。ここまでこられたのも中本、小黒両氏のアドバイスがあったからこそ。良き師匠にめぐり合え感謝。m(_"_)m ←始めて顔文字を使った大いなる感謝の意思表示!!