質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

4回答

11443閲覧

ステッパの台形駆動、パルス間隔の計算・設定は割り込み処理で?メイン処理で?(2軸制御も踏まえて)

ElecDove

総合スコア254

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

0グッド

2クリップ

投稿2017/03/14 14:17

編集2017/03/14 14:18

いつもお世話になっております。

ステッピングモーターの台形駆動を行いたいと考えておりますが、
実際にパルスを生成する部分について質問させてください。

前提条件
・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を読み解いてみようとも思いましたが、規模が大きすぎ、また言語の壁(英語)があり、なかなか思うように進まず質問させていただきました

どうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

横からですが、台形制御するためのパルス間隔の計算式をご存じなのですか?
いちいち計算していたらたいした回転数になりませんよ。

投稿2017/03/18 07:28

kabasan

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

とりあえず、パルスモータドライバへの指令パルスの生成は既出なので、以下の点について。

なお、小生は、PWM:Hi時間固定Low時間可変でも、PFM:HI,Low等時間でも可と理解しています。が
オリエンタルモータ運転パターン
では、PWMになってますね。

で、計算タスクは

  • PWM生成タスク:「72khz(以上)割込み」「Hi,Lo切替判断」「加速終了判断」「減速開始判断」

「加速終了判断」「減速開始判断」が無理っぽそうなので、もう一つタスクが居るかも。

  • 駆動処理タスク(通常はPWM生成タスクの整数倍):Gコード解析、「全工程面積」「加速面積」計算
  • メイン(残り時間):手動処理(含む各値設定)、モニタ表示処理

x=0の地点からx=100の地点まで、加速、等速、減速という三つの動きをする際、疑問2のTOP値の計算はメインルーチンで行い、キューにでもスタックするのでしょうか。

まず、

  • 「0」の位置への原点復帰方法は?CCW方向を「-」方向とし、マイクロスイッチを踏んだら、停止・cwのみ許可とする?

  • xの単位はmm?0.001mm?

これにより、フルストロークのパルス生成に必要な演算最小値の最大累積値が決定され、内部レジスタで賄えるか、外部SRAMが必要かが決定出来る。

を押さえた上で、駆動処理タスクで

  • 位置の移動を面積とし「全工程面積」「加速面積」を計算。

それとも、PWMの割り込み処理の中で計算するのでしょうか

上記PWM生成タスク参照。

メイン処理で行うと、TOP値の計算が一瞬でも遅れれば、直ちに現在位置が想定とズレてしまうと思います(累積パルス数を数えればよいかもしれませんが、そもそも正しいパルス間隔ではないので却下)

ということでメイン処理でやるような計算ではないように思います。

それで良いと思います。

メイン処理は手動操作や、Gコードの解析などもっとほかの仕事をしてほしいです

  • Gコードは「メイン」「駆動処理タスク」どちらでも良いでしょう。

かといって、二軸以上での制御をするとなれば、計算量はそこそこ増えるはずです。(XとYが同じ速度比で加減速をしなければならないため)

一秒間に数千回~数万回*軸数も次のTOP値を計算するほどの余力はあるのでしょうか(マイコンを見くびっていたらごめんなさい)

PWM生成タスクの負荷次第です。
その残時間で「駆動処理タスク」
さらにその残時間で「メイン」
です。

何軸あろうが、「全工程面積」「加速面積」を計算終了後「PWM生成タスク」に起動を掛ければよいので、その辺は、Gコード解析から実動作開始までのタイムラグが大きくなるだけです。

直線補間は
各軸比例計算:加減速時に理論直線軌跡からずれる。
2次直線からのxy各軸への変換計算:理論直線軌跡上を進む。が変換演算ロジックに「なんちゃら変換(失念)」を採用して、処理量を少なくしないと「PWM生成タスクの負荷次第です。」の残時間が無くなってします。
訂正:「なんちゃら変換(失念)」は下記の2次補間演算時。直線補間時は第1bitを0.5とみなしての比例計算をしてました。

円弧補間はxy各軸への変換計算を「駆動処理タスク」で行い、3点生成して「PWM生成タスク」で「2次補間」を行うと、綺麗に円弧します。が、CPUの処理能力が追いつくかどうか。。。
象限突起補正も一応、頭の隅において置きたいところ。

p.s.
図にしてみました。(参考にならなければ、読み捨ててください。)

  1. 加速度時間=送り速度まで0.4sと仮定
  2. 加速度レート=0.4ms/36kHz=0.011ms
  3. 加速時36kHz増加数:0.011ms/0.000028ms=393回
  4. 送り速度までの36kHz回数:0.4ms/0.000028ms=14,285回
  5. pwmのLow回数:14,285回/393回=36
  6. 結果、72kHz換算し、pwmのLowを72kHz割込みの28,570回から72回ずつ減らせば、0.4msで送り速度まで加速する。

イメージ説明

投稿2017/03/17 00:05

編集2017/03/23 01:35
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ElecDove

2017/04/02 08:26

お礼が遅くなり大変申し訳ありません ハードの制作で忙しく、なかなかソフトに手が付けられませんでした ハードがほぼ完成したためこれからソフト&回路に手を付けます xの単位は、最小理論分解能を1μmとし、最大は1000mm程度まで考えています(実際に作ったハードはもう少し小さいですが、今後のために) ということで、0~100万、です、 原点復帰方法は、フォトインタラプタを使い、遮られた瞬間に各軸位置カウンタのリセットをしようかな、と考えています。割り込みまでのオーバーヘッドが気にはなりますが…。 移動量を面積で考えるのですね、なるほど、、、 象限突起については知りませんでした 調べてみて、なるほど、、、とは納得しましたが、現状それを補正するほどのコーディング力はおそらくないのでとりあえずは考えないことにします
guest

0

こんにちは。

周期タイマを2つ使えば簡単と思います。

1つはパルス間隔を発生するタイマです。最大36KHzですので、ベース・クロックは倍の72KHzにしたいところです。
そのベース・クロックが指定回数入る度に割り込みを掛けて、その度に次のタイマのカウンタ値Aを72KHzタイマへ設定し、かつ、パルスを出力します。

AVRやR8Cのタイマ構成はもう忘れてしまいましたが、多くの8ビット以上のMPUは2バイトで使えるカウンタを持っています。
できるだけそれを使うのがよいと思います。(頑張ればソフトでも拡張できますが無駄に面倒です。)

もう1つのタイマが速度制御です。これは一定時間毎にタイムアップさせ、タイムアップの度にカウンタ値Aを減らします。この周期と減算値で加速度が決まります。
この処理をメイン処理で行えば72KHzタイマへの遅延を最小限にできます。
加速度制御タイマは割り込みは掛けず、割り込みフラグがONする度にタイムアップ処理するイメージです。
ただし、カウンタ値Aを書き換える時だけは割り込み禁止する等して72KHzタイマとの排他制御が必要です。

ああ、そう言えばPICはステッパ制御用のハードウェアを持っている機種があったと思います。AVRやR8Cにもステッパ制御用ハードウェアを持っているものがあるかも知れません。

2軸制御する場合、どうしても72KHzタイマで2つの割り込みをかけますから、お互いに相手の処理を遅延させます。なので、可能ならばハードウェアで実装した方がパルスの乱れを最小限にできるのでスムーズに動作するだろうと思います。

投稿2017/03/14 16:15

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ElecDove

2017/03/15 13:24

回答ありがとうございます 質問を見返していて、PWMを連呼していますが、 パルス"幅"制御ではなく、パルス"周波数"制御(PFM?)でした どちらにしろ、コンペアマッチ時の動作を変えることで対応はできると思いますが…。 そうですよね、たしかに16bitカウンタを使った方がいいですね ATMega328(Arduino)には16bitが確かにあったので検討してみます 速度制御のほうのタイマですが、 これの周期がパルス生成タイマと異なる時、 パルス一発単位で時間を制御するのではなく、あくまで速度制御タイマの周期に応じた、 加減速は階段状になるということでしょうか。 確かにその方が、二軸以上の時に相対速度を設定しやすそうです。 速度制御タイマは、固定周期のタイマ割込みということになりますでしょうか。 実際に制御してみないとわからないものかもしれませんが、速度設定タイマのほうはどのくらいの周期で割り込むべきでしょうか パルス生成タイマが72kHzで動いており、実際に出力されるパルスが、実用範囲で10kHzくらいにはなると思います。 10kHzくらいで速度設定タイマを動かしてみるのがいいでしょうか。 (そうすれば、ほぼ階段が坂になりますよね…) ステッパ用のハードウェアですが、多軸制御するためのハードではないですよね…? 2相励磁等が楽に組めるよー、といったものはH8のタイマW?あたりが該当すると思いますが。。。
Chironian

2017/03/15 14:16

速度制御タイマは、例えば1周期毎に72KHzタイマ値を-1することで適切な加速度になるような周期を選べばスムーズな制御になると思います。 > 速度制御タイマは、固定周期のタイマ割込みということになりますでしょうか。 加速度固定ならそれで良いと思います。 > 速度設定タイマのほうはどのくらいの周期で割り込むべきでしょうか 加速度次第なのでなんとも。加速度を上げすぎると脱調するので、脱調するより少し低めの加速度を選ぶことになると思います。 > ステッパ用のハードウェアですが、多軸制御するためのハードではないですよね…? 3年以上前の曖昧な記憶ですが、PICで最大2相6軸だったような気がします。2相3軸だったかも知れません。
ElecDove

2017/03/16 05:11

\o90う‘w12|123
ElecDove

2017/03/16 05:17

回答ありがとうございます。 加速度は、変数として設定しておくつもりです。 被動側の慣性モーメント次第ですし…。 ただ、パルス用タイマと同じかそれ以上の周期でも問題はなさそうですね 一回で-1ではなくもっと小さな値でも(整数型だと丸められるので、1になるごとに引いていくイメージ) よさそうでしょうか。 なんとなく、全体がつかめてきました 二相6軸ってすごいですね そんなハードがあったなんて… ちなみにそのpicはどのくらいの大きさですか? まさかDIPであるとは思えないですが…。
Chironian

2017/03/17 01:27

> 一回で-1ではなくもっと小さな値でも(整数型だと丸められるので、1になるごとに引いていくイメージ) よさそうでしょうか。 周期を伸ばせばよいだけなので、そこまで手間をかける必要はないように感じます。 そのような処理は固定小数点で行うことが多いですが、それはそれなりに手間ですから。 > ちなみにそのpicはどのくらいの大きさですか? まさかDIPであるとは思えないですが…。 たぶんQFPとは思いますが、バッケージやピン数は未確認です。 タイマ数の多いPICを探していた時だったので。
guest

0

ある値(TOP値?正しい名前を知らないので教えてください)

しきい値といいます(閾値)
英語だとthreshold

投稿2017/03/22 11:24

hillacken

総合スコア359

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ElecDove

2017/04/02 08:31

あっ、なるほど 特にこれといって決められた名前があるわけではないのですね 普通に閾値を使います ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問