PWM制御の最近のブログ記事

前回の記事のPWMのソースについて実験したのでその結果の報告。

DSC01430.JPG

実験は下記のとおり

(1) if文(従来のもの)
(2) else if文((1)のif文をelse if文に直したもの)
(3) switch文
(4) 配列処理
(5) シフト処理

の5つを、実行速度と、cnt1の値による実行時間の変化をオシロスコープを用いて計測する。
cnt1は0のときと7の時の値を用いる。

結果は下記の通り

cnt1の値 実行時間(μs)
if文 0 11.12
7 11.12
else if文 0 6
7 11.12
switch文 0 8.82
7 8.82
配列 0 5.9
7 5.9
左シフト 0 6.1
7 10

色を付けているのはcnt1が0と7の時で同じ実行時間だったもの。
システムとして実行時間が変化するのは良くないで、else if文とシフトは除外される。

そこで速度で比較すると明らかに配列が高速なことが分かる。
よって配列を用いたPWMの出力を採用しようと思います。

実験に用いたソースは下記の通り。

ファイルをダウンロード - speed.c

--
追記

PWMのソースの新しいのを公開しました。

http://dream-drive.net/robot/pwm.htm

大学でアドバイスもらったり、Shibasakiさんにアドバイスをもらったりでいろいろ最適化されてきたのでそろそろ公開できそうな感じになってきたソース。
皆様には本当に感謝しています。

それで、結局、PWMのところでいろんな案が出てきて結局どれにしようか迷っている。

もともとのソースはこれ。(1)

if (cnt1==0)P1.DR.BYTE=0x01;
if (cnt1==1)P1.DR.BYTE=0x02;
if (cnt1==2)P1.DR.BYTE=0x04;
if (cnt1==3)P1.DR.BYTE=0x08;
if (cnt1==4)P1.DR.BYTE=0x10;
if (cnt1==5)P1.DR.BYTE=0x20;
if (cnt1==6)P1.DR.BYTE=0x40;
if (cnt1==7)P1.DR.BYTE=0x80;

それに対して自分の出した改善策はコレだったのですが・・・。(2)

switch(cnt1){
	case 0:	P1.DR.BYTE=0x01;	break;
	case 1:	P1.DR.BYTE=0x02;	break;
	case 2:	P1.DR.BYTE=0x04;	break;
	case 3:	P1.DR.BYTE=0x08;	break;
	case 4:	P1.DR.BYTE=0x10;	break;
	case 5:	P1.DR.BYTE=0x20;	break;
	case 6:	P1.DR.BYTE=0x40;	break;
	case 7:	P1.DR.BYTE=0x80;	break;
}

こんな案や(3)

static unsigned char byte[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
P1.DR.BYTE = byte[cnt1];

こんな案を頂きました(4)

P1.DR.BYTE = 1 << cnt1;

突っ込みが入るくらいなので、(1)がプログラム的に劣っているのは間違いないのです・・・。
自覚もありました。それで検証してみたのですが・・・。

見た目に関して言えば、(1)、(2)、(3)は人間に分かりやすいという性質がある。
(4)はパッと見た感じ分かりにくいですがインテリジェンスな感じがします。行数が少ないというメリットもありますね。

実行時間で比較した場合、(2)(3)は、アセンブリを見た感じ、どの値をとっても実行したときのクロック数は同じ感じです。
(4)に関しては1ビットシフトをn回分繰り返すということで実行速度にバラつきが出そうな感じです。(1)は当然比較回数が異なるのでバラつきが出ます。

で、結局「-S」のオプションでアセンブリを出したりしてみたもののよく考えたらCISCであるH8は命令ごとにステートが違うので単純に行数では実行速度の比較が出来ない・・・。しかもちょっと分かりにくい。

ちなみにアセンブリの命令一覧を見ていて8ビットのローテーション命令があった。
左シフトしてあふれたケタを右に入れる命令。
これがC言語ではじめから存在したら何も問題はないのに・・・。(実はあるのだろうか?)

来週は実機で激しくループさせてみたり、パソコンで実行時間計ったりしてみたいと思う。
まぁ、ぶっちゃけた話、どのソースを使っても((1)でも)、サーボの動きに見た目の変化はなかったんだけどねw
ここまで来たら徹底的に実験したいと思います。

昨日、大学で行われた公演を聴きに講堂に行ったのですが。

そこで、研究室の先輩(研究員さん?)にばったりあって、HPに公開しているソースを読んでいただいたことが判明。
そこから、深い話に発展していきました。その方は組み込みやモバイルのプログラムに長く携わっている方で「高速化」についていろいろと駄目出しをいただきました。

PWMのソースに関してはif文へのペナルティ、シリアルはバッファのペナルティをはじめ、浮動少数に関するペナルティ・・・「ぜんぜん違うソースになるんちゃうかー!?」ってとこまで、ペナルティがあって、でも、逆にそれを改善したら、かなり進歩出来そうです。

そんなお話をしていたら2時間が経っていました。
公演を聴きに来てたのにロビーで話しているうちに、公演が終わっていた!!
とは言え、公演を聴いていた友達に公演のことを聞いてみると微妙な表情をしていたので、個人的には有意義な時間だったなぁ・・・。と(いいのか!?)

近々、HP上に公開しているソースにもう一度テコ入れしてみようと思います。
(レスコンで実際に使う予定もあるので・・・。)
あと、KUMACOと自作モーターのページもちゃんとまとめたほうがいいかなぁ。

ソフトウェアにより割り込みでの、サーボ制御について考えてみた。

LBC作者のバーニング宮田さんのところの記事では、ソフト制御ではジッターが大きくそのため、3to8ラインデコーダーとラッチ回路を使って〜〜っていう説明になっている。
確かに、ジッターがあると、制御うんぬんもそうだが、消費電力も大きく変わる。

ただ、前に中村博士とお話させていただいたときは、「ソフトでOKだよ」って話になった。

たぶん、ソフト制御でもちゃんとジッターのことを考えた上で組んだ制御なら問題ないのだろう。
用は技量。

ちなみに、うちのサークルで使ってる僕の作った基板もソフト制御。

現在はサークルのロボットのサーボがAX-12にシフトしているのだが、後輩が使っているため、余計にちゃんと実験をしたいと思った。

とりあえず、ジッターを図ってみた。

サークルでジャイロの値を読むために作ったITUのインプットキャプチャのプログラムを流用してみた。
微妙にジッターが出てるのが分かるが、最大で1μsくらい上下に出るようだった。

だいたい600μs〜2200μsくらいの値で、動くサーボにとって2μsのジッターはどれくらいの影響がでるものか。
だいたい0.3度弱くらい。

反応のいいサーボならプルプルしてしまうだろうか・・・。
たしかにRobovie-MSのサーボだと少しジッター出てます。

KONDOの2144だとそんなに分からないんですが・・・。
ジッターで反応するかどうかってのはサーボ次第ってところでしょうか。
GWSのS03T/2BBとかだと、絶対反応しない気がします。

ん〜、SCIで受信割り込みかける限りはこれが、限界なんだろうか・・・。

DSC00570.JPG

ロボットのコンテンツを増やしてみました。

とりあえず、KOKUTENの基板について書いてたのですが・・・。

マニュアルって難しいですね。すぐ挫折してしまったため、すごく中途半端なものになってしましました。

Profile

me.jpg
Name : みっちー
小学校で電子工作にハマり、高校時代はゲームプログラミング、大学時代にロボット製作へどっぷり浸かりました。
社会人になっても、なにかとものを作るのが大好きで、日々ネタと仲間を求めて活動中です。

Dream Drive!!

bana.png
http://dream-drive.net

趣味のロボットとプログラムを中心としたコンテンツのサイトです。

My Robots

kolink2.jpg
KO-LINK2
第2世代 並行リンク足ロボット

kolink.jpg
KO-LINK
並行リンク足ロボット

BusterGX.jpg
BusterGX (Ex Walker)
G-ROBOT + ROBO-XERO

kumaco.jpg
KUMACO
ぬいぐるみロボット

SARUBO.jpg
SARUBO
JX-SYSTEM搭載ぬいぐるみロボット

kokuten3.jpg
KOKUTEN 3
リアルタイム逆運動学制御ロボット

meros.jpg
MEROS
膝なしロボット
(胸部マトリックスLED搭載)
by Mechaniker

kokuten12.jpg
KOKUTEN 1&2
はじめてのロボット
by Mechaniker

協賛広告

最近のコメント

月別 アーカイブ

このアーカイブについて

このページには、過去に書かれたブログ記事のうちPWM制御カテゴリに属しているものが含まれています。

前のカテゴリはDynamixel サーボです。

次のカテゴリは逆運動学と計算歩行です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。