ラジコンサーボ用パルス発生
以前、みたようにラジコンサーボ用のパルス波とはこのようなものです。
20msという十分長い周期中で、1~2ms程度の間のパルス長を出すことでサーボ角度を制御します。パルス長を1~2ms程度の間で長くしたり、短くしたりでサーボ角度をコントロールしています。
20msという十分長い周期中で、ほんの1/10 程度の間パルス波を出しているだけです。
このPWMパルス発生を、タイマー機能のPWM発生に頼る以外の方法でできる方法はないか、考えてみたいと思います。
IO出力でPWMパルス発生方法
まず、IOピンでの出力でパルスを作る方法を考えます。
IOピンから 出力:1 出力しない:0 この方法を時間で制御して上のようなPWMパルス波を発生する方法です。IOピンの出力はいくつでも取れるので、多数のPWMパルス波を作れることになります。
上の図のパルス波の部分を拡大して見ます
割り込みなどで一定の間隔 でいくつものIOピンをON,OFFしていけば、パルス波が出来上がることになります。
0.1msごと割り込みで 各IOピンをON状態を変えるとすると
cnt=0 ~ cnt=0
割り込み処理 | ① | ② | ③ | ④ |
IO1=1 | IO1=1 | IO1=1 | IO1=0 | |
IO2=1 | IO2=1 | IO2=0 | IO2=0 | |
IO3=1 | IO3=1 | IO3=1 | IO3=0 | |
一回の割り込みの処理①の中で
IOピンを
IO1=1 IO2=1 IO3=1
といくつものIOピンの出力をいっぺんにします。
こうすることで、多数のIOピンの状態を割り込み時間ごとに変えられます。
0.1msごとに割り込み処理するのなら、0.1msごとに、各IOピンの出力が ① →② →③ →④→のように変わり、0.1msの幅でパルス長を変えられることになります。
発生するパルス波を増やすにはIO1=1 のピンをどんどん増やせばいいだけです。
一番上の図のようにパルス長は2.0msまでなので、それをすぎれば、全てのIOピンは20msまでずっと0を出力し、周期20msがくるとまたもとに戻り、① →② →③ →④→を繰り返します。
しかし、割り込み間隔が短くなくると、各IOピンを全部ONにしたり、OFFにしたりする処理がその間隔内で全部終えることができるのか?
という処理速度から来る問題があります。
PWMパルス発生を切り替える
上の方法では
一番上の図のようにパルス長は2.0msまでなので、それをすぎれば、全てのIOピンは20msまでずっと0を出力し、周期20msがくるとまたもとに戻り① →② →③ →④→を繰り返します。
処理をするのは最初の2msまでです。
この図の通り、パルスが落ちると、あとは20msが終わるまで、何もしていません。
上の方法のようにいっぺんにいくつものパルスを発生させるより、一つパルスを発生させれば、次に切り替え、また次のパルスを発生させる という方法も考えられます。
- ①で IOピン IO1 にパルスを発生させた後、 出力を切り替え
- ②で IOピン IO2 にパルスを発生させ また切り替え
- 次は③
と 次々とパルス波を作り、出力ピンを切り替える方法です。
これだと、パルス波長は最大で2msなら、周期20msあるので、8個か9個のパルスが発生できることになります。
これをIOピンで発生させる方法にしてもいいですが、タイマーのPWM機能を使って、その出力をつぎつぎ切り替えていくほうがよりよいでしょう。
しかし、3664FのタイマーPWM機能は出力ピンが固定されていて、切り替えることができません。
外部に切り替え回路をつくる方法や、出来たパルス波をいったんIOピンに入力し、それをまた別のピンに切り替えるような方法でなら可能かと思います。
まとめ
ラジコンサーボ用パルスを多数発生させるには、
- IO出力でPWMパルス発生方法
- PWMパルス発生を切り替える
この2つの方法の選択になるでしょう。
②の方法なら、タイマーのPWM機能を使い発生させられるので、切り替え方法の問題になるでしょう。
- twtter
- google+
- hatena