ATmega128のタイマ比較機能を使ってサーボPWM出力・構想編2
すいません m(_ _)m、本記事はブログ引越時に書式が崩れました。順次修正中です。
というわけで、前回に引き続き構想練っています。今度は逆から考えてみます。
お尻あわせ方式
前回、いろいろ考察しましたが、お尻あわせ方式の方がよさそうです。わりと多くのコントローラは(たぶん)、前回のように、サーボ信号HIGHタイミングが一緒で、LOWにする時がばらばらです。お尻あわせ方式は、逆に、HIGHタイミングをバラバラにして、LOWにするタイミングを一致させます。
↓先頭 ~2.5ms↓
A |________----________----
B |__----------__----------
C |_________---_________---
絵で説明すると上のような感じです。PWMの立ち上がりを調整して、立ち下がりが同じタイミングになるようにします。
これのメリットは、PWMの最大値を2.4msで制御単位を2.5msにしたら、必ず先頭に0.1msの空き時間ができることです。また、PWMは、0.6~2.4msとしていますので、お尻にも必ずすべてがHIGHになっている(事実上アイドルの)0.6msの時間を作ることができます。
目標スペック
前回の中で、仮に決めていたサーボPWMの幅ですが、GWSなどのサーボもフォローできるよう、0.6ms~2.4ms、また1つの制御単位を2.5ms、全体周期を20msという目標で設計を進める事にします。もし、0.1msで割り込み処理ができないような状態になってしまったら、その時スペックダウンする事にします(シリアル通信に捕獲入力ぐらいなら大丈夫かな)。ものによっては、もっと広い範囲を出さないといけないものもありますが、まずはこれで進めてみようと思います。
やっぱり割り込み3回
とは言っても、比較レジスタAによる割り込みを使う以上、先の図のように、比較レジスタAの立ち上がりより後ろに、他の信号の立ち上がりが来る事があります。そのため、比較レジスタAの立ち上がりで「比較一致時HIGH/LOW」の切り替えをする事はできません。
というわけで、お尻の「HIGHだけど事実上のアイドル時間」を使って「比較一致時HIGH/LOW」の切り替えをする事にします。
↓先頭 ~2.5ms↓
A |________----________----
B |__----------__----------
C |_________---_________---
① ② ③ ① ② ③
というわけで、比較レジスタAの立ち上がりによる割り込み分0.1msだけ余裕をみた時間による割り込み、「③」を作る事にします。具体的には0.5msでどうかな、と思います。前回風に処理をまとめると、以下の用になります。
- ①割り込み(サーボ信号をLOW)
それぞれの比較一致レジスタに、2.5ms-サーボPWM指示値を設定。比較一致でHIGHになる設定をする。また、分配信号を出力。 - ②割り込み(サーボ信号をHIGH)
比較レジスタAにはお尻から見て0.5ms手前の時間を設定。他の比較レジスタは触らない。 - ③割り込み(事実上のアイドル)
比較レジスタAのみ、+0.5msを設定(次の周期の先頭になる)。他のレジスタにはサーボPWM指示値を設定。全ての比較一致機能に一致でLOWになる設定をする。
うん!これでうまくいきそうです。それではプログラムを作ってみようと思います。
Your Message