« 「誰でもわかるマイコン入門」パルスモーターを回す | トップページ | 「誰でもわかるマイコン入門」スイッチをつける »

2015年1月 7日 (水)

「誰でもわかるマイコン入門」パルスモーターのプログラム説明

遅くなりましたが、パルスモーターのプログラムの説明です。

パルスモーターを回すには、マイクロステップドライバのSTEPという端子にパルス、つまり1と0の繰り返しの信号を送ってやればいいだけです。

mbedには、パルスを出力する機能があります。mbedの右下6本のピンがパルスを出力することができるピンです。(P21~P26)PwmOutと書いてありますね。

PWMというのは単なるパルスではなく、パルス幅を周期に対して0~100%まで変えられる機能です。この機能を使えば、ヒーターの温度調整やDCモータの速度制御ができます。

今回のようにパルスモーターを回すだけなら、パルス幅は周期に対してちょうど半分でいいでしょう。(デューティー比50%)

今回はP21をPWMのパルス出力して使います。その命令が

PwmOut PulseMotor(p21);

です。ちなみにPulseMotorという名称は私が勝手につけました。ですからここはABCでもPMでもなんでもかまいません。ただし、PulseMotorをABCに変えるなら、以後すべてのPulseMotorをABCに変えなければなりません。

次に命令

PulseMotor.period_us(83140);

これは、パルス周期を83140μ秒に設定しています。

なぜ、83140μ秒か説明します。

一恒星日は86164秒です。しかし、モータードライブの場合、恒星時は86200秒が使われます。いわゆるキングスレートです。

いっぽう、赤道儀を一回転させるのに何パルス必要か考えてみます。赤経軸のウオームホイルを144枚、パルスモーターのステップ角を1.8°とすると、モーター内蔵ギア比を1/36とすると、一回転させるのに必要なパルス数は

144×(360/1.8)×36 = 1,036,800

よって、一パルスあたりの時間、つまり周期が出ます。

周期=86200÷1,036,800=0.83140秒

マイクロステップ°ドライバを使っているので、これをさらに1/32にすることができます。ただ、あまり短くすると精度が悪くなります。したがって、今回はマイクロステップを使わず、1/1にしました。どうしても使いたいなら精度を落とさない方法もあります。

さて、最後の命令は、

PulseMotor.pulsewidth_us(83140/2);

これは、もうわかりますね。パルス幅を設定しています。

ところで、LEDのプログラムにも出てきた、

while (1) {

}

 

の意味ですが、これは、この中にある命令を無限に繰り返せという意味です。それで、LEDが永遠にチカチカしていたのですね。

ところが今回のパルスモータを回す命令はこの無限のループの外にあります。この違いはわかりますか?なぜか? ループの中に入れたら間違えです。

前回LEDを点滅させていたのは、マイコンの命令です。マイコンの命令でもって、点灯させたり、消灯させたりしていました。

しかし、PWMというのは違います。これは初期設定こそマイコンの命令で行いますが、一度初期設定をしてしまえば、後は、マイコンの命令とは関係なく、勝手にパルスを出力し続けます。暴走列車みたいなものです。ですから、ループの外にあるわけです。

もし、この2つの命令をループの中に入れてしまうと、正しいパルスは出さないでしょう。

while (1) {

 PulseMotor.period_us(83140);

 PulseMotor.pulsewidth_us(83140/2);

 }

 なぜなら、この2つの命令を実行するには、オーバーヘッドが伴いますので、時間がずれてしまうからです。

さて、次回はこのモーターにスイッチをつけて、方向と速さを変えられるようにします。

|

« 「誰でもわかるマイコン入門」パルスモーターを回す | トップページ | 「誰でもわかるマイコン入門」スイッチをつける »

コメント

プログラムから計算過程まで詳しい解説ありがとうございます。mbedではループの外でパルス出力を指定するのですね。PICと違うところなので最初は間違えてしまいそうです。参考になりました。

投稿: enif883 | 2015年1月 9日 (金) 18時16分

enif883さん、ありがとございます。

ペースがゆっくりですみません。
なるべく早く記事アップするようにしますね。

投稿: ほんまか | 2015年1月 9日 (金) 23時24分

電子工作初心者です。昔は水晶発振で恒星時運転していたと思いますが、現在はPWMで制御しても大丈夫なのですね。勉強になりました。SS-oneもPWM制御なのですか?

ところで、「PulseMotor.pulsewidth_us(83140/2)」の最後の2の意味が解らないので教えてください。

お願いします。

投稿: 初心者 | 2021年1月29日 (金) 09時48分

PWM制御はしていないです。
PWM制御というのは、本来、周期に対するパルスの幅を変えることによって、電力を調整する制御ですが、
ここでは、パルス幅は周期に対して50%と固定して
単にパルスを発生させているだけです。
PWMを単にパルス発生装置として使っているだけです。

たとえば、タイマー割り込みを使って、1と0の信号を交互に出力する方法もありますが、こちらの方が簡単ですね。

最後の/2ですが、
デューティ比50:50のパルスのパルス幅は周期の半分です。
ですから2で割っています。

投稿: ほんまか | 2021年1月29日 (金) 14時55分

ありがとうございます。PWMでパルスを発生させていたので、制御しているのだと解釈していました。 勉強になります。

投稿: 初心者 | 2021年1月29日 (金) 22時06分

コメントを書く



(ウェブ上には掲載しません)




« 「誰でもわかるマイコン入門」パルスモーターを回す | トップページ | 「誰でもわかるマイコン入門」スイッチをつける »