DCモータードライバーDRV8871を使ってみる

12VのDCモーターを回すのにDCモータードライバーDRV8871を使ってみた。マイコンにXIAO ESP32C3を使ってみたら、PWM制御のうちLEDC APIが上手く行かず、DRV8871のオフィシャルサイトのにあるようにanalogWriteを使うことにした。

環境

マイコンSeeed Studio XIAO ESP32C3
DCモータードライバDRV8871搭載 DCモータードライバ
DCモーター12V60RPM
Arduino IDE動作PCAMD Ryzen 9, Windows11
Arduino IDのバージョン2.3.4

接続

動作プログラム

このプログラムは、モーターが停止状態から正転方向に指定された最大出力まで出力を上げた後、出力を下げ、一旦停止したのちに逆転方向に同じ動作を行う。以降、これを繰り返す。

このプログラムでは、PWM出力にanalogWriteを使った。ledcWriteはAruduino IDEのバージョンが2.0になって以前の使い方がエラーになるので、とりあえずanalogWriteを使用。分解能周波数もデフォルト(8bit, 5KHz)を使用した。

XIAO_ESP32C3_DC_motor
/*  XIAO_ESP32C3_DC_motor          2025.1.17

XIAO_ESP32C3とドライバーDRV8871でDCモーターを回す簡単な例

**********************************************************************/

const int motor1Pin1 = 3;   
const int motor1Pin2 = 2; 

const int MAX_SPEED = 255; // 最大スピード
const int MIN_SPEED = 70;  // 最小スピード

void setup()
{
  Serial.begin(115200);

  // testing
  Serial.print("Testing DC Motor...");

  pinMode(motor1Pin1 , OUTPUT);
  pinMode(motor1Pin2 , OUTPUT);
  // 分解能のデフォルトは8ビット(0~255), 周波数のデフォルトは5kHz
  analogWrite(motor1Pin1, 0);
  analogWrite(motor1Pin2, 0); 
  delay(2000);
}

void loop()
{
  int i;

  // ===== 正転
  Serial.println("Moving Forward");

  // 正転-加速
  analogWrite(motor1Pin2, 0);
  for( i = MIN_SPEED; i <= MAX_SPEED; i++){
    analogWrite(motor1Pin1, i);
    delay(10);
  }
  Serial.print("duty:");
  Serial.println(i);

  delay(3000);

  // 正転-減速
  analogWrite(motor1Pin2, 0);
  for(i = MAX_SPEED; i >= MIN_SPEED; i--){
    analogWrite(motor1Pin1, i);
    delay(10);
  }
  Serial.print("duty:");
  Serial.println(i);

  // 2秒停止
  Serial.println("Motor stopped");
  analogWrite(motor1Pin1, 0);
  analogWrite(motor1Pin2, 0);  
  delay(2000);

  // =====  逆転
  Serial.println("Moving Backwards");

  //  逆転-加速
  analogWrite(motor1Pin1, 0);
  for(i = MIN_SPEED; i <= MAX_SPEED; i++){
    analogWrite(motor1Pin2, i);
    delay(10);
  }
  Serial.print("duty:");
  Serial.println(i);

  delay(3000);

  //  逆転-減速
  for(i = MAX_SPEED; i >= MIN_SPEED; i--){
    analogWrite(motor1Pin2, i);
    delay(10);
  }
  Serial.print("duty:");
  Serial.println(i);

  // 2秒停止
  Serial.println("Motor stopped");
  analogWrite(motor1Pin1, 0);
  analogWrite(motor1Pin2, 0);   
  delay(2000);
}

analogWriteを使うときの分解能と周波数のデフォルト値は以下の通り。
分解能:8bit
周波数:5000Hz
analogWriteはESP32でも使える。