witchの日記: (ROBO) 0.01msecのはざまで 7
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)
…相変わらず半年前と同じことをやってるのね…
サーボ制御って (スコア:1)
何か血が騒ぎますねぇ…。
と、なんとなくロジックを考えてしまい、サーボモータすらないののに MPLAB のアイコンにカーソルが移動しそうになる(悪い癖)。
Re:サーボ制御って (スコア:1)
シリアルポートとか、周辺LSIがしっかりしている場合は、
ちゃんとそれなりの設計でやりとりできるんでしょうけど、
最近はチップ内蔵で入った周辺機器を使うか、CPUパワーでゴリゴリやるタイプの実装が多い。
しかし、[割り込みで]ゴリゴリやるのは思った以上に厳しい…ということのようですね。
クロックパルスのデューティ比が大事なのなら、
いっそ、複数本のカウンタを実装した専用のCPLDに
(できるだけ遅めの)クロック流して、CPU側からサーボ制御サイクル指令コードを
書き込んでは…なんてことも考えるのですが、
手間とコスト的に見ると、却下なんだろうなぁ。
Re:サーボ制御って (スコア:1)
> (できるだけ遅めの)クロック流して、CPU側からサーボ制御サイクル指令コードを
> 書き込んでは…なんてことも考えるのですが、
> 手間とコスト的に見ると、却下なんだろうなぁ。
そういうことをされてる方が、少なくとも二人おられます。
Miyata's Robot Factory [geocities.jp]
NT's実験室 [netyou.jp]
私には当分手が出せそうにない領域…
Re:サーボ制御って (スコア:1)
開発環境が高価だとか、入手性の問題だとか敷居が高すぎるですね。
uchachaの日記 [hatena.ne.jp]
今更なのですが (スコア:1)
でも、今更でしょうね。
すみません、役立たずの応援団で。。。
おまけ [seikyou.ne.jp]
uchachaの日記 [hatena.ne.jp]
Re:今更なのですが (スコア:1)
って思ったけど…
USARTその他の機能はソフトウェアで実現する
みたいなことが書かれてるから、ちょっと不安が…
USARTの周期に合わせてサーボ制御すれば良いのかな…
Re:今更なのですが (スコア:1)
はっきりしたことは言えませんけど。
確かに、USARTの制御にサイクルを食われたのでは意味が無い(^^;
uchachaの日記 [hatena.ne.jp]