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

2025.5.24 Coskx Lab  

1 はじめに

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


モータドライバIC TC78H653FTGを使用して,小型ステッパモータの「3DプリンターTitan Stepper Motor」を駆動します。モータ駆動電圧は4.1Vです。
TC78H653FTGはステッパモータを対象と考えた場合,2つのHブリッジ回路を持っていて,1つのステッパモータを駆動するモードがあります。
なお電流監視抵抗付加による電流制限機能はありません。
ただし,過電流検出機能で出力部がOFFになることがあります。その場合は電源の再投入か,STBY信号をLにして再度Hにすると回復するとデータシートに記載されています。

参考 モータドライバIC TC78H653FTG(東芝デバイス&ストレージ)
データシート https://toshiba.semicon-storage.com/info/docget.jsp?did=63588&prodName=TC78H653FTG
アプリケーションノート https://toshiba.semicon-storage.com/info/docget.jsp?did=70283&prodName=TC78H653FTG

参考 モータドライバIC TC78H653FTG ステッパモータ制御 入出力ファンクション
   LARGE = L, MODE = H, STBY = H(論理レベル) で使用する
   IN1,IN2とIN3,IN4は別々に指示することができ,それにしたがって,OUT1,OUT2とOUT3,OUT4が別々に動作する。
IN1IN2OUT1OUT2動作
HHHLOUT1→OUT2
HLLHOUT1←OUT2
LXOFF(Hi-Z)OFF(Hi-Z)ストップ

IN3IN4OUT3OUT4動作
HHHLOUT3→OUT4
HLLHOUT3←OUT4
LXOFF(Hi-Z)OFF(Hi-Z)ストップ

参考 モータドライバIC TC78H653FTG 動作範囲
項目最小標準最大
モータ電源電圧1.8V3.0V7.5V
モータ出力電流
small mode
2A
モータ出力電流
small mode
Peak 10ms
2.5A
モータ出力電流
large mode
4A
モータ出力電流
large mode
Peak 10ms
5A
ロジックHレベル2.0V(Vm=5.0のとき)5.5V
ロジックLレベル-0.3V0.5V
ロジック最大周波数500kHz

参考 モータドライバIC TC78H653FTG基板実装(秋月電子販売)
https://akizukidenshi.com/catalog/g/gK-14746/

回路図でわかるように,秋月電子の基板上で,論理系のGNDとモータ駆動系のGNDが接続されています。

参考 使用しているモータ
名称: 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 実験用配線

次のように配線しました。
ESP32のGNDとTC78H653FTGのGNDを接続
TC78H653FTGのLargeはESP32のGNDへ
TC78H653FTGのModeはESP32の3.3Vへ
TC78H653FTGのStbyはESP32の3.3Vへ



実際の配線の様子です。モータ用電源電圧は7.0Vにしました。(考察を参照してください)


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

モータ停止時には,IN1,IN3 は,ともに L します。
モータ駆動時には,IN1,IN3 は,ともに H します。
正回転時には,IN2,IN4 を (H,H)→(H,L)→(L,L)→(L,H)の順に,指定の間隔で変化させます。
逆回転時には,正回転時と逆の順に指定の間隔で変化させます。
なお,これらの動作はクラスとして定義しています。
1ステップは1msecで1000Hz駆動になっています。
ステッパモータは1ステップが1.8度に対応するので200ステップで1回転になります。
なお,停止時にも静止トルクを必要とするため,通電しておくのですが, 電流条件を考慮して,駆動時と同じステップ幅で通電と通電なしを繰り返すようにしています。(考察を参照してください)


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

//steppermotor78H653rtest.ino
// 78H653を想定

class StepperDrive {
  public:
    void initialize(uint8_t i1, uint8_t i2, uint8_t i3, uint8_t i4) {
      in1 = i1;
      in2 = i2;
      in3 = i3;
      in4 = i4;
      pinMode(in1, OUTPUT);
      pinMode(in2, OUTPUT);
      pinMode(in3, OUTPUT);
      pinMode(in4, OUTPUT);
      position = 0;
      digitalWrite(in1, 0);
      digitalWrite(in3, 0);
      digitalWrite(in2, outtable[position][0]);
      digitalWrite(in4, outtable[position][1]);
    }

    void tick(int dir) { //dir = 1 or -1
      position += dir;
      position &= 3;
      digitalWrite(in2, outtable[position][0]);
      digitalWrite(in4, outtable[position][1]);
    }

    void start(){
      digitalWrite(in1, 1);
      digitalWrite(in3, 1);
    }

    void stop(){
      digitalWrite(in1, 0);
      digitalWrite(in3, 0);
    }

  private:
    uint8_t in1;
    uint8_t in2;
    uint8_t in3;
    uint8_t in4;

    int outtable[4][2] = {{1,1},{1,0},{0,0},{0,1}};
    int position = 0;
};

#define directionforward 1
#define directionreverse -1
#define pulselength 1000 //単位マイクロ秒 1000以下で脱調
const int IN1 = D0;
const int IN2 = D1;
const int IN3 = D2;
const int IN4 = D3;

StepperDrive stepper;

void setup() {
  stepper.initialize(IN1, IN2, IN3, IN4);
}

void loop() {
  
  //正転駆動
  stepper.start();
  for (int i=0; i<200; i++) {
    stepper.tick(directionforward);
    delayMicroseconds(pulselength);
  }
  stepper.stop();

  //停止
  for (int i=0; i<200; i++) {
    stepper.start();
    delayMicroseconds(pulselength);
    stepper.stop();
    delayMicroseconds(pulselength);
  }

  //逆転駆動
  stepper.start();
  for (int i=0; i<200; i++) {
    stepper.tick(directionreverse);
    delayMicroseconds(pulselength);
  }
  stepper.stop();

  //停止
  for (int i=0; i<200; i++) {
    stepper.start();
    delayMicroseconds(pulselength);
    stepper.stop();
    delayMicroseconds(pulselength);
  }

}


5 実行の様子

動画は1ステップ1msec設定です。
0.2秒(1msecx200)で1回転します。0.4秒停止した後,0.2秒で逆向きに1回転し,0.4秒停止します。この動作を繰り返します。




6 考察

ステッパモータの一相に着目すると,抵抗とインダクタ(コイル)の直列回路を,正方向と逆方向に切り替えながら,直流電源で駆動していることになります。
これはLR回路の過渡応答が繰り返されていることになります。
正方向に通電している一区間を考えてみます。ただし,直前の逆方向通電の名残は無視できると仮定します。
電流I[A],抵抗R[Ω],インダクタンスL[H],電源電圧E[V]とすると,時定数τ[sec]はR/Lとなっています。電流Iの時間変化は,I(t) = E/R・(1 - exp(-t/τ))で表されます。
過渡応答開始から十分時間が経過したときの電流(単純抵抗と考えた場合の電流)は,Imax = E/R になります。
過渡応答開始からτ経過したときの電流は
I(τ) = E/R・(1 - exp(-1))≒ 0.6 E/R = 0.6 Imaxになります。
このときの電流曲線は次のようになります。



正方向に通電している時間は,駆動周期Pになります。
具体的には
R = 4.1 [Ω]
L = 0.004 [H]
E = 4.1 [V]
Imax = 1.0 [A]
τ = 0.0010 [sec]
になっています。
駆動周波数が1000Hzでしたので,P = 0.001 secになります。
たまたま駆動周期と時定数τが一致しているため,電流最大値は,単純抵抗を駆動しているときの電流(Imax)に比べ最大でも0.6 Imax にしかならず,平均するとかなり小さくなっています。
ということは電源電圧を4.1Vではなく,8V程度にしてもよいことになると思います。
上記駆動テストでは,1000Hz駆動時の電流曲線とTC78H653FTGの絶対定格も考慮して,モータ用電源の電源電圧を7.0Vにしています。

電流値の計算は,1回の通電時間(1ステップの長さ)は1msecを想定していますので,モータ停止期間の停止トルク発生のための通電時間も1msecにします。そのため,プログラムで停止時には,1msecで通電と休止を繰り返しています。


7 まとめ

Xiao ESP32S3およびモータドライバTC78H653FTGでステッパモータを駆動しました。
二相励磁の単純な動作を行いました。
この駆動方式では,無負荷状態で,1000Hzを超える駆動では脱調を時々起こすようになりました。