ATmega128のタイマ比較機能を使ってサーボPWM出力・構想編2

公開日:  最終更新日:2014/06/05

すいません m(_ _)m、本記事はブログ引越時に書式が崩れました。順次修正中です。

ℹ️本記事にはPRが含まれています。

というわけで、前回に引き続き構想練っています。今度は逆から考えてみます。


お尻あわせ方式
前回、いろいろ考察しましたが、お尻あわせ方式の方がよさそうです。わりと多くのコントローラは(たぶん)、前回のように、サーボ信号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になる設定をする。

うん!これでうまくいきそうです。それではプログラムを作ってみようと思います。 

  • このエントリーをはてなブックマークに追加
  • Pocket

関連前後記事

Your Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

*

PAGE TOP ↑