ステッピングモータなどの駆動部品の加減速制御
ステッピングモータは「パルスを送った数だけ正確に回る」のが持ち味です。しかし、低速では動作するものの、速度を上げると途中で止まってしまう、目標位置の手前や先で止まる、といった事象が起きやすくなります。主因は脱調で、まず取り組みやすい対策がソフトウェアによる加減速制御です。この記事では、なぜ加減速が必要なのかという特性の話から、台形プロファイルの実装方法、パラメータの決め方までを解説します。なお、特に断りがない限り、本文中の「速度」はパルス周波数(ステップレート)を指します。
- 脱調とは何か:「パルスに付いていけない」状態
- なぜ加減速が必要か:自起動周波数という限界
- 台形プロファイルの考え方
- 実装例:タイマでパルス周期を更新する
- パラメータの決め方
- 運用上の備えとありがちなトラブル
- まとめ
脱調とは何か:「パルスに付いていけない」状態
ステッピングモータは入力パルスに同期して回転します。しかし、急激な速度変化や過負荷があると、ロータがパルスに追従できなくなり、同期が外れ、ステップ抜けが発生します。これが脱調(step-out/ステップ抜け)です。その結果、以後の「送ったパルス数」と「実位置」が一致しなくなります。オープンループで使うステッピングモータは脱調してもシステム側では気づけないため、「送ったパルス数」と「実際の位置」がずれたまま動き続けることになります。位置決め機器ではこれが致命的な問題となります。
なぜ加減速が必要か:自起動周波数という限界
モータには、停止状態から瞬時に(加減速なしで)起動・停止できるパルス速度の上限があります。これは一般に「最大起動周波数(Maximum starting frequency)」や「プルイン(pull-in)領域の上限」として示され、この記事では便宜上これを「自起動周波数」と呼びます。ロータや負荷には慣性モーメントがあるため、いきなり速いパルスを与えても物理的に追従できないのです。さらに重要なのは、この自起動周波数は負荷の慣性が大きいほど低下するという点です。データシートに載る自起動周波数(pull-in:加減速なしに起動・停止できる上限のパルス速度)は、メーカが定めた条件(無負荷または特定の負荷条件、特定のドライバ条件など)での代表値です。実機では負荷の慣性や摩擦、電源条件によって低下するため、起動速度には余裕を持たせてください。
運転パターンは2種類に整理できます。自起動領域内の速度だけで使う「自起動運転(定速プロファイル)」と、加速・減速の時間を設けてパルス速度を徐々に変化させる「加減速運転(台形駆動)」です。台形駆動にすれば、自起動領域を超えたスルー領域(スルーイング領域)の高速域まで使えるようになります。プルアウト特性の範囲内であれば連続回転は可能ですが、停止状態からその周波数で直接起動・停止はできないため加減速が必要です。ただし台形駆動でも、加減速のレートが急峻すぎれば結局追従できずに脱調します。
台形プロファイルの考え方
台形駆動は、移動を「加速区間→定速区間→減速区間」の3つに分けます。速度のグラフが台形になることからこう呼ばれます。実装上のポイントは次の3つです。
- 起動速度:自起動周波数より十分低い速度から始める(負荷で低下することを見込んで余裕を持つ)。
- 加速:1ステップ(または一定時間)ごとにパルス周期を少しずつ短くして目標速度まで上げる。
- 減速開始の判定:残りステップ数が、加速に使ったステップ数以下になったら減速に入る。これでほぼ加速と対称な減速になり、目標位置付近で起動速度まで落ちる。
移動距離が短い場合は、目標速度に達する前に減速開始条件を満たすことがあります。このとき速度グラフは三角形になりますが、上記の判定ロジックなら自動的に正しく動きます。最高速に達して定速区間が長くなった場合も停止位置は合いますが、加減速にかかる時間が最適化されるとは限りません。なお、この記事の例は加速で消費したステップ数を目安に対称減速へ入れる簡易方式です。この方式は実装しやすい一方、現在速度から停止までに必要な減速ステップ数(停止距離)を厳密に満たす保証はありません。脱調が出る場合は、より厳密な停止距離ベースの判定に移行してください。
実装例:タイマでパルス周期を更新する
タイマ割り込みで1パルスずつ出力し、割り込みのたびに次のパルスまでの周期を計算する構成が定番です。線形に周期を変える簡易方式の例を示します。
#include <stdint.h>
typedef struct {
uint32_t total_steps; /* 移動の総ステップ数 */
uint32_t done_steps; /* 送出済みステップ数 */
uint32_t accel_steps; /* 加速に使ったステップ数 */
uint32_t period; /* 現在のパルス周期 [タイマカウント] */
uint32_t start_period; /* 起動速度の周期(自起動周波数より低速) */
uint32_t min_period; /* 目標速度(最高速)の周期 */
uint32_t delta; /* 1ステップあたりの周期変化量 */
} stepper_t;
/* タイマ割り込みから呼ぶ:次のパルス周期を返す */
uint32_t stepper_next_period(stepper_t *m)
{
uint32_t remain = m->total_steps - m->done_steps; /* 今回のパルスを含む残りステップ数(done_steps のインクリメント前) */
m->done_steps++;
if (remain <= m->accel_steps) {
/* 減速区間:残りが加速分以下になったら対称に減速する */
m->period += m->delta;
if (m->period > m->start_period) m->period = m->start_period;
} else if (m->period > m->min_period) {
/* 加速区間 */
m->period -= m->delta;
if (m->period < m->min_period) m->period = m->min_period;
m->accel_steps++;
}
/* どちらでもなければ定速区間 */
return m->period;
}
「周期を線形に変える」方式は厳密な等加速度ではありません(周期の逆数が速度のため)が、実装が簡単なため広く使われています。低速域から高速域まで広い範囲で加減速する場合は誤差が無視できないこともありますが、一般的なFA機器の移動距離・速度範囲であれば実用上は十分です。より滑らかさが必要なら、等加速度になるよう周期を漸化式で更新する方式や、加減速の角を丸めたS字プロファイルへ発展させます。
パラメータの決め方
- 起動速度:データシートの自起動周波数(負荷慣性による低下込み)に対して余裕を持った値にします。迷った場合は低めの値から設定します。
- 最高速度:速度が上がるほどモータの出せるトルク(プルアウトトルク:その速度で連続運転できる上限トルク)は低下します。速度-トルク特性の曲線の内側で、必要トルクに余裕がある範囲に収めます。
- 加速度に相当するパラメータ(delta:1ステップあたりの周期変化量):負荷の慣性モーメントと必要トルクで決まります。選定計算で目安を出したうえで、最終的には実機で「最悪条件(最大負荷・最低電圧・低温)でも脱調しない」ことを確認して決めます。
運用上の備えとありがちなトラブル
- 減速せずに停止させると、慣性で行き過ぎたり脱調したりします。停止時も必ず減速プロファイルに従って制御します。
- オープンループの宿命として、脱調そのものは検出できません。原点センサで定期的に位置を補正する、重要軸はエンコーダ付き構成にする、といった設計で補います。
- 特定の速度域だけ振動が大きくなる共振領域があります。定速区間の速度がそこに当たる場合は速度を変えるか、マイクロステップ駆動を検討します。必要に応じて、機械的なダンパの追加や駆動条件(電流・励磁方式)の見直しもあわせて検討します。
- 適切に選定して余裕のある条件で運転していれば脱調は起きにくい一方、負荷変動、電源電圧の低下、機械的抵抗の増加、温度条件などで運転条件が厳しくなると脱調することがあります。脱調が出た場合は、運転条件(起動速度・加減速レート)と負荷条件を優先的に見直します。
まとめ
ステッピングモータの加減速制御は「起動は自起動周波数より十分低い速度から」「残りステップ数で減速開始を判定」「最悪条件で実機確認」の3点が骨子です。台形プロファイルを一度部品化しておけば、搬送・位置決め・ポンプなど多くの機構にそのまま使い回せます。

