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

環境
マイコン | Seeed Studio XIAO ESP32C3 |
DCモータードライバ | DRV8871搭載 DCモータードライバ |
DCモーター | 12V60RPM |
Arduino IDE動作PC | AMD 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でも使える。