スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

昔の話

私の初代マウス「ジボラン」には、PWMモードを使わずに走行させていた記憶がある。無知は恐ろしいよね。

Re: 昔の話

午後ティー先輩
コメントありがとうございます!

PWMモードなしで完走!?はすごすぎです(((( ゚Д゚)))
僕も今年の機体で位相係数モードの存在を知らなくて、とても痛い目を見ました…
無知は本当に怖いです。。

180mm進もう3

今晩は!
昨日今日と東京は雨が降りましたね。
実は関東は冬より夏のほうが雨が降りやすいって知ってました?

さて、今回も180進もうの記事です。
自分で読み返してなかなかによく分からない進行をしていたので少しまとめます。

1.ステッピングモーターはパルス数から距離を導ける。
2.加速度、速度の概念から距離を導いてもぴったり進める。
3.2の具体的なプログラムは? ←今ここ

って感じに進行してるつもりです。
では前回の解答から行きましょう。

問題
小数点以下を四捨五入で丸め込むプログラムをC言語で書きなさい。

解答
やり方は色々あると思いますが、結論として0.5を足してint型にキャストするのが良いようです。
他にもdouble型を引数にして四捨五入した後の整数をint型で戻り値にする関数を作りましたが、実験してみたところ実行時間に大きな差が生まれました。

#define round(A) ((int)(A+0.5))
int roundf(double A){
  return (A+0.5);
}
void main(void){
  double i=0;
  int B=0;
  double C=839.8372;
  for(i=0;i<=100000000;i+=0.1){
//    B=(int)(C+0.5); //5秒 -(1)
//    B=roundf(C); //35秒 -(2)
     B=round(C); //5秒 -(3)
  }
  printf("%d\n",B);
}
(1),(2),(3)で、どれも出力結果は840.000です。
自分で作ったのはどんな感じでしたかー

さて、なんでこんな問題を出したかというと、ステッピングモーターを使うなら是非int型へのキャストを切り捨てでなく四捨五入で行って欲しいからです\(^o^)/
おすすめは(3)のdefineでマクロにするやり方です。
マクロとは関数に似ているdefineです。処理が速いです。(説明不足)
さっきの実験でも予想できるように、関数を使うとそれだけで時間がかかります。
マウスの世界は1[ms]も馬鹿に出来ないので、少しでも処理を早くすることを心掛ける必要があります。


ということで、解答を終わります。round(A)は今後も登場させる予定です。

今日の話は「PWMってなによ?」です。
Mice歴一年生の方はそもそもなんでそんな得体の知れないもんを使うの?って疑問があると思いますので必要性から説明していきます。

ライントレーサーで、モーターをずっとONにするとすごい勢いで壁に突進しました?
僕は2年前それが起きてめっちゃ焦ったのをよく覚えています。
きっと皆さんはモーターの出力をONとOFFに繰り返し切り替えることで減速して走行させたのではないかと思います。
実はこれは疑似PWMと呼ばれていて、皆さんはすでにPWMをさせていたのです。
PWMにはDuty(比)というものがお供についてきます。
例えばずっとモーター出力ONだとDutyは100%、同じ間隔でONとOFFを繰り返すとDutyは50%という具合です。

さて、ライトレの話からPWMの話が出てきましたが、ここでステッピングモーターの場合少し様子が変わります。
この前も書いたようにステッピングモーターはパルスよってモーターが回転するので、ライトレで使ったDCモーターのようにずっとONとか交互にONとOFFとかいう概念はないです。

え、じゃあPWM使わないの?と、思うかもしれませんが使います!
DCモーターの場合大事だったのはDutyでしたが、ステッピングモーターの場合大事になるのはパルス幅です。
ちょっとお絵かき
12211.png
めっちゃ分かりづらい図になっちまったw
DCモーターだと周期あたりのONの時間(赤枠)がモーターの回る速度を決定します。(うん、図がダメだわ)

一方ステッピングモーターの場合wss

左のほうが時間当たりのパルスの間隔が短いのが分かると思います。
つまりDCモーターと違って周期に対するDutyではなくパルスの間隔(間隔が短いか長いか)がモーターの回る速度を決定します。

つまりステッピングモーターでは、PWMの周期自体を変化させることでモーターの速度をかえるということです。

小まとめ
・DCモーター
   周期一定
   Duty変える
・ステッピングモーター
   周期変える
   Duty一定(一般的には50%)

次にPWMの必要性について
上に書いたようにステッピングモーターではパルス幅を変えて速度を変えるのですが、これってどうやると思います?マイコンは正確な時間が分かるので細かく割り込みをかけるってのが一つ思い浮かぶと思います。しかし、割り込みで一々パルスを発生させる(ある端子の出力をONにしてOFFにしてを繰り返す)と処理が重くなるうえにちょっと速く走ろうとするとすぐに処理の限界が来ます。
じゃあどうしようもないのかというと、マイコンさんにはちゃんとPWMモードという素晴らしい機能があります。これは周期やDutyを設定すれば、マイコン内の処理に負荷をかけず、自動的にパルスを生成し続けるという機能です。
マウス製作に入っている人は、手元の参考回路図を見るとモータードライバのclock端子にマイコンのPWMモードが使えるポートが割り当てられているのが確認できるかと思います。

切が悪いですが時間なので今週はここまで。
次週は今度こそ具体的なプログラムに入りたいと思います。
ではでは(*^-^*)

昔の話

私の初代マウス「ジボラン」には、PWMモードを使わずに走行させていた記憶がある。無知は恐ろしいよね。

Re: 昔の話

午後ティー先輩
コメントありがとうございます!

PWMモードなしで完走!?はすごすぎです(((( ゚Д゚)))
僕も今年の機体で位相係数モードの存在を知らなくて、とても痛い目を見ました…
無知は本当に怖いです。。

コメントの投稿

非公開コメント

時計
カテゴリ
最新記事
12月14日開始
RSSリンクの表示
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。