パスワードを忘れた? アカウント作成
676375 journal

witchの日記: (ROBO) 0.01msecのはざまで 7

日記 by witch

PIC(ワンチップマイコンね)でのサーボ制御パルス生成処理…
ラジコンサーボの制御角度指示のために 20msec 間隔で 0.5msec~2.5msec幅のパルスを送っています。
(マイコンでラジコンの受信機から出る信号を真似している)

で、当初
「こんなのタイマー割込みで処理すれば同時に何個のサーボでも制御できるじゃん」
と思っていたのですが…

ここへきて、その考えが甘かったことが判明(あと2か月なんですが…)

0.5~2.5msec の範囲でパルス幅を変えることで、サーボモータの角度を -90度から+90度の範囲の任意の位置に変化させることができます。
パルス幅と角度はだいたい比例しているので、角度を1度変化させるには、パルス幅を0.01msec 変化させればいい。

で、20MHzクロックのPICだと0.01msec で50step実行できるのですが…
 補足)
 PICは4クロックで1命令実行するので
 1stepは ( 1 / (20*10^6) ) * 4 = 2*10^-7 = 0.2μsec

パルス制御処理を 0.01msec間隔のタイマー割り込みで実装する場合、割り込みの最初と最後のレジスタ待避で 20step、割り込み回数のカウンタの処理とかで16step かかるので
サーボの制御に使える時間は14step。

ここで、1つのサーボへのパルスを制御(経過時間と比較してON/OFF)するには最低4step必要(いまのロジックだとね)

…一回の割込みで面倒をみられるサーボはたったの3つ
3つのサーボを1グループにして、2.5msec毎に制御するグループを切り替えていくとすると、20msecの間に8つのグループを制御できるから…

全体として24個のサーボを1度単位で制御できる…

とはならないんだよね…

このロジックだと、PICがメインCPUと通信する余裕がないのでした。

あうぅ…
やっぱり先人の残したロジックを真似するしかないのか…

---
参考:先人のプログラム (witchの日記 2002/11/14)

…相変わらず半年前と同じことをやってるのね…

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by plustree (9153) on 2003年06月04日 23時05分 (#329680) 日記
    私はまるで素人なので、こういうきわどい世界での制御ということは知りませんでした。

    何か血が騒ぎますねぇ…。

    と、なんとなくロジックを考えてしまい、サーボモータすらないののに MPLAB のアイコンにカーソルが移動しそうになる(悪い癖)。
    • 割り込みってのは、やっぱペナルティが大きいみたいですな。

      シリアルポートとか、周辺LSIがしっかりしている場合は、
      ちゃんとそれなりの設計でやりとりできるんでしょうけど、
      最近はチップ内蔵で入った周辺機器を使うか、CPUパワーでゴリゴリやるタイプの実装が多い。
      しかし、[割り込みで]ゴリゴリやるのは思った以上に厳しい…ということのようですね。

      クロックパルスのデューティ比が大事なのなら、
      いっそ、複数本のカウンタを実装した専用のCPLDに
      (できるだけ遅めの)クロック流して、CPU側からサーボ制御サイクル指令コードを
      書き込んでは…なんてことも考えるのですが、
      手間とコスト的に見ると、却下なんだろうなぁ。
      親コメント
  • by ucha (10757) on 2003年06月05日 1時09分 (#329741) 日記
    SXの75MHz版 [memec.co.jp]なら間に合うのかも。
    でも、今更でしょうね。

    すみません、役立たずの応援団で。。。

    おまけ [seikyou.ne.jp]
    --
    uchachaの日記 [hatena.ne.jp]
typodupeerror

にわかな奴ほど語りたがる -- あるハッカー

読み込み中...