Xiao ESP32S3 モータドライバA4988 ステッパモータ駆動

2025.6.1 Coskx Lab  

1 はじめに

Xiao ESP32S3で小型ステッパモータ(ステッピングモータ)を制御します。


ステッパモータドライバIC A4988を使用して,小型ステッパモータの「3DプリンターTitan Stepper Motor」を駆動します。
A4988は1つのステッパモータを駆動しますが,回転方向信号とパルス信号の2つだけをマイコンから送るだけで,二相励磁で動作します。
DCモータ2個またはステッパモータドライバ1個を駆動できるモータドライバでも, モード切替でステッパモータを駆動することもできますが, 正回転・逆回転のための出力をプログラムで生成しなければならず不便です。
また電流制限機能を備えていて,基板上に取り付けられいる可変抵抗で,電流制限値を設定できます。(一相当たり1A弱に設定)

ドライバICへの供給電圧は8Vから35Vとなっています。
(ステッパモータの許容電圧より高い電圧を供給しますが,電流制限されるためステッパモータに問題は起こりません。)
ステッパモータを駆動するには,使いやすく,広く使用されているようです。

参考 ステッパモータドライバIC A4988(Allegro MicroSystems)
データシート https://www.allegromicro.com/~/media/Files/Datasheets/A4988-Datasheet.ashx


参考 モータドライバIC A4988基板実装(秋月電子販売など)


参考 使用しているモータ
名称: 3DプリンターTitan Stepper Motor (AMAZON)
モーターサイズ(L * W * H):42 * 42 * 23 mm
フェーズ:2フェーズ
電圧:4.1V
電流:1A /相
抵抗値:4.1±10%Ω/相
インダクタンス:4.1±20%mH /相
保持トルク:13N.cm以上(18.5oz.in)
ディテントトッグ:2.0N.cm(2.85oz.in)
絶縁材クラス:B
ステップ角:1.8°±5%
重量:132g

2 使用環境

3 実験用配線

次のように配線しました。
MS1,MS2,MS3は,駆動方式の設定に使われていますが,3つともプルダウンされているためLが入力されていることになります。
そのため,何も接続しなくても,動作方式はフルステップモードになっています。
ENABLE,RESET,SLEEPは,それぞれL(GND),H(VDD),H(VDD)に接続します。
なお,モータ用電源は12Vを使いました。(モータの電圧は4.1Vとなっていますが,A4988が電流を制限してくれるので大丈夫です。)


4 電流制限の設定

モータの電流制限は,リファレンス電圧で設定します。
リファレンス電圧は,ドライバ基板に取り付けられている可変抵抗で設定できます。
電流制限値をIlim[A],センス抵抗値をRs[Ω]とすると,設定すべきリファレンス電圧Vreff[V]は次式で得られます。
Vreff = Ilim x 8 x Rs
センス抵抗値は,ドライバ基板のS1,S2と書いてあるチップ抵抗の抵抗値です。(二系統あるので抵抗も2個あります。)
手元のチップ抵抗には「R100」と書いてありましたが,Rを小数点に置き換えて読み取ります。
すなわち「R100」は「.100」であり0.1Ωということでした。ちなみに「R10」は「.10」なのでこれも0.1Ωということになります。
(「R068は0.068Ω、R05やR050は0.05Ωとなります。)
リファレンス電圧Vreff[V]は,VDDを与えた状態で,GNDと可変抵抗の金属部分との間の電圧です。
小型+ドライバで可変抵抗を回しながら,テスタで,計算されたリファレンス電圧Vreff[V]なるように合わせます。

例えばセンス抵抗が0.1Ωで電流制限値を0.8Aに設定したい場合は
Vreff = Ilim x 8 x Rs = 0.8 x 8 x 0.1 =0.64 [V]
に設定します。


5 モータ駆動デモプログラム

A4988のDIRとSTEPに向けて,ESP32S3のD0,D1から信号を出力します。
DIRには回転方向(正転・逆転)を指示します。STEPに1パルス(L→H→L)を与えると,モータが1ステップ(1.8度)回転します。
プログラム中,lengthはパルス幅の半分の値[μsec]です。
length=500[μsec]では1パルス区間(周期)は1000μsec=1msecとなり,周波数は1KHzとなります。
実際の駆動では,無負荷でlength=400[μsec](パルス周期の1/2)が短い設定の限界でした。周波数は1.25KHzとなります。

  ステッパモータの動作テスト用プログラム本体

//steppermotoA4988rtest.ino
// A4988を想定

#define length 400 //パルス幅 単位 μsec
//400μsecでは確動 指では軸の回転を止められない
//300μsecではまれに脱調
//250μsecでは脱調して動かない
//400μsec以上であれば動作できる
//2000μsecで共振状態と思われ,脱調した
const int DIR  = D0;
const int STEP = D1;

void setup() {
  pinMode(DIR, OUTPUT);
  pinMode(STEP, OUTPUT);
  digitalWrite(DIR, LOW);
  digitalWrite(STEP, LOW);
}

void loop() {
  
  digitalWrite(DIR, HIGH);

  for (int i=0; i<200; i++) {
    digitalWrite(STEP, HIGH);
    delayMicroseconds(length);
    digitalWrite(STEP, LOW);
    delayMicroseconds(length);
  }

  delay(1000);

  digitalWrite(DIR, LOW);
  
  for (int i=0; i<200; i++) {
    digitalWrite(STEP, HIGH);
    delayMicroseconds(length);
    digitalWrite(STEP, LOW);
    delayMicroseconds(length);
  }

  delay(1000);

}

6 実行の様子

動画は1ステップ0.6msec設定です。(上記プログラムではlength = 300)
0.12秒(0.6msecx200)で1回転します。1秒停止した後,0.12秒で逆向きに1回転し,1秒停止します。この動作を繰り返します。
この動画撮影時には,1ステップ0.6msec設定で脱調しなかったのですが,この設定ではまれに脱調することがあります。安全に使える設定ではないように思います。(1ステップ0.8msec設定では脱調は起こらないようです。)




7 パルスデューティ比を変化させる

上記プログラムでは,パルス生成でのデューティ比が1/2でした。 プログラム中の駆動部分のFORループを次のように変更して,デュティ比を1/5に変更したが,動作に影響はないことを確認しました。

  for (int i=0; i<200; i++) {
    digitalWrite(STEP, HIGH);
    delayMicroseconds(length*2/5);
    digitalWrite(STEP, LOW);
    delayMicroseconds(length*8/5);
  }


8 1/4マイクロステップを試す

プログラムは元のままで,1/4マイクロステップを設定しました。
A4988には,MS1,MS2,MS3の端子があり,内部プルダウンのため,何もつながないとLを与えていることのになります。この状態は標準のフルステップ駆動で,一パルスで,1.8度回転します。 この3つの端子にH,Lを適当に与えるとマイクロステップ動作になります。 MS2だけにHを与えて1/4マイクロステップの動作を試しました。 1/4マイクロステップの動作では一パルスで,0.45度回転します。 そのため,200パルスでは90度回転するだけになります。 1/4マイクロステップでは,無負荷でlength=100[μsec](パルス周期の1/2)が短い設定の限界でした。周波数は5KHzとなります。

   マイクロステップの設定
MS1MS2MS3動作
LLLフルステップ
HLL1/2マイクロステップ
LHL1/4マイクロステップ
HHL1/8マイクロステップ
HHH1/16マイクロステップ

9 まとめ

Xiao ESP32S3およびモータドライバA4988でステッパモータを駆動しました。
二相励磁の単純な動作を行いました。
この駆動方式(フルステップ)では,無負荷状態で,付与パルス周波数1600Hzを超える駆動では脱調を起こしました。
この駆動方式(フルステップ)では,無負荷状態で,付与パルス周波数1250Hz以下の駆動が安全のようです。
なお1/4マイクロステップでは,無負荷状態で,付与パルス周波数5000Hz以下の駆動が安全のようです。
なお,周波数の上限は,ドライバの設定およびステップモータの性能によって決まるため,実際にテストして決めるのが良いと思います。