いつもお世話になっております。
ステッピングモーターの台形駆動を行いたいと考えておりますが、
実際にパルスを生成する部分について質問させてください。
前提条件
・AVR(Arduino)か、R8Cあたりを検討中(単に使ったことがあるという理由だけです)
・モーターの電気的な制御はドライバIC(SLA7078)を用いるので、マイコンは正転逆転信号と回転角度に応じたパルスを出力するだけ
・XYのステージを作る前提なので、一応二軸制御が必要(最初は一軸(ただの台形駆動)で考えてそのあと発展させたい)
・現時点では、円弧動作をさせる予定はない。が、最終的には実装したい
・200ステップのステッピングモーターを使い、16分割マイクロステップなので3600パルス/回転 10回転/秒 くらいを理論最高速度とし、最大36kHzのパルスを出力することになる
・Grblライブラリがあることは知っているが、あえて自作してみたい。(どちらかというとかなり趣味寄なので、スキルを磨くためにも自前で実装したい)
当方の技術力は、なんとなく、ふわっと、PWMの生成の仕組み、(というかマイコンのタイマの仕組み)を知っている程度です
このあたりのプログラムを、アプリケーションシートのみを使って一から起こせ、と言われたら無理ですが、すでにある程度書かれているソースの改造くらいならできます
##疑問1
パルスの生成は、PWMを生成するタイマの利用でよいか。
PWMを生成するときは、三角波(またはのこぎり)を使うことは知っています。
このとき、ある値(TOP値?正しい名前を知らないので教えてください)を決めておいて、三角波の値(カウンタ値)がこのTOP値に一致したときに、出力ピンをHighにし、三角波が0(オーバーフロー)したときに出力ピンをLowにする、という考え方であっていますでしょうか。
ステッパの台形駆動をするためには、加減速が必要です(幸い線形ですが)
ということは、加速/減速運動中は、1パルスごとに、パルスの間隔が変化します。
ということは、1発パルスを出すごとに、次のTOP値を計算、セットして、を繰り返せば、少なくともカウンタのビット幅の範囲ではパルス間隔を自由に設定して出力できるかと思います。
この考え方はあっていますでしょうか。
##疑問2
疑問1が正しいとして、非常に間隔の広いパルスはどうすればよいか
私がタイマの各機能を知らないだけだとは思うのですが…
タイマが8bitだとすると、最大値は255になります
16MHのクロックで、分周を400とすれば、
16MHz/(400*256)=156.25HzのPWMが最もゆっくりな出力になります。
けっこう分周しましたが、それでも速すぎです。
しかし、これ以上分周すると、36kHzが出力できません。
1Hz以下のPWM~前提でも述べた36kHzまでリニアに変化できないと困ります。
1Hz以下だと、分周を重ねてもあっという間にオーバーフローするような時間だと思います。
オーバーフローフラグを監視して、何回オーバーフローしたか数えたりするのでしょうか…。
##疑問3
疑問1が正しいとして、パルス間隔の計算はメイン処理で行うか、割り込み処理で行うか
x=0の地点からx=100の地点まで、加速、等速、減速という三つの動きをする際、疑問2のTOP値の計算はメインルーチンで行い、キューにでもスタックするのでしょうか。
それとも、PWMの割り込み処理の中で計算するのでしょうか
メイン処理で行うと、TOP値の計算が一瞬でも遅れれば、直ちに現在位置が想定とズレてしまうと思います(累積パルス数を数えればよいかもしれませんが、そもそも正しいパルス間隔ではないので却下)
ということでメイン処理でやるような計算ではないように思います。
メイン処理は手動操作や、Gコードの解析などもっとほかの仕事をしてほしいです
かといって、二軸以上での制御をするとなれば、計算量はそこそこ増えるはずです。(XとYが同じ速度比で加減速をしなければならないため)
一秒間に数千回~数万回*軸数も次のTOP値を計算するほどの余力はあるのでしょうか(マイコンを見くびっていたらごめんなさい)
色々と検索はしてみたのですが、もっと表面的なところを扱った記事しか見つけることができず、、、
Grblを読み解いてみようとも思いましたが、規模が大きすぎ、また言語の壁(英語)があり、なかなか思うように進まず質問させていただきました
どうぞよろしくお願いいたします。

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。