Skip to content

Arduino - 直流电机

A 直流电机(Direct Current motor,简称 DC motor)是最常见的电机类型,广泛应用于玩具、风扇、机器人车轮等各种设备中。本教程将指导您如何使用现代元器件和最佳实践来控制直流电机的开关状态、速度和方向。

重要安全警告:切勿将电机直接连接到 Arduino 的数字引脚。电机是感性负载,其电流消耗远超引脚能提供的电流,并且在关闭时会产生电压尖峰。这样做会永久损坏您的 Arduino。务必始终使用专用的电机驱动电路。

第 1 部分:使用 MOSFET 进行简单的开关控制

Section titled “第 1 部分:使用 MOSFET 进行简单的开关控制”

为了安全地开关电机,我们将使用一个 MOSFET,它是一个坚固耐用的电子控制开关。

  • 1 × Arduino UNO
  • 1 × 小型直流电机(例如 5V-9V)
  • 1 × 逻辑电平 N 沟道 MOSFET(例如 TIP120, IRLZ44N)。TIP120 是一种达林顿晶体管,但在此处工作方式类似。
  • 1 × 1N4001 二极管(或类似型号)。这是至关重要的续流二极管。
  • 1 × 独立的电机电源(例如 9V 电池或 4 节 AA 电池组)。强烈推荐使用独立电源。
  • 跳线和面包板

MOSFET 有三个引脚:栅极(Gate)、漏极(Drain)和源极(Source)。Arduino 通过向栅极发送信号来控制电流从漏极流向源极。

  1. 将 MOSFET 源极连接到面包板的接地排。
  2. 将 Arduino 的 GND 引脚连接到同一个接地排。
  3. 将电机电源的接地连接到同一个接地排。所有接地必须连接在一起。
  4. 将 Arduino 的引脚 9 连接到 MOSFET 栅极。
  5. 将一个电机端子连接到 MOSFET 漏极。
  6. 将另一个电机端子连接到电机电源的正极。
  7. 至关重要的是,将 1N4001 二极管与电机并联。二极管的带条纹一端(阴极)必须连接到正极侧,不带条纹一端(阳极)连接到负极(MOSFET 漏极)侧。这可以保护您的电路免受电压尖峰的影响。
const int motorPin = 9; // 使用一个 PWM 引脚
void setup() {
// 将电机控制引脚设置为输出
pinMode(motorPin, OUTPUT);
}
void loop() {
// 将电机开启至全速
digitalWrite(motorPin, HIGH);
delay(2000); // 运行 2 秒
// 关闭电机
digitalWrite(motorPin, LOW);
delay(2000); // 等待 2 秒
}

第 2 部分:使用 PWM 控制电机速度

Section titled “第 2 部分:使用 PWM 控制电机速度”

我们可以轻松地扩展之前的电路来控制电机速度。通过使用 analogWrite() 函数进行脉冲宽度调制(PWM),我们可以改变供给电机的平均电压,从而控制其速度。

这段代码将使电机从停止加速到全速,然后减速至停止。

const int motorPin = 9; // 必须是 PWM 引脚(在 Uno 上标有 ~ 符号)
void setup() {
pinMode(motorPin, OUTPUT);
}
void loop() {
// 速度逐渐增加
for (int speed = 0; speed <= 255; speed++) {
analogWrite(motorPin, speed);
delay(10);
}
// 速度逐渐降低
for (int speed = 255; speed >= 0; speed--) {
analogWrite(motorPin, speed);
delay(10);
}
}

为了让电机双向旋转,我们需要一个 H 桥。这个电路可以反转施加到电机上的电压极性。L298N 模块是一个常见但效率不高的 H 桥驱动器,非常适合初学者。

尽管我们将使用 L298N,但对于您未来的项目,请考虑使用更现代的驱动器,例如 TB6612FNG。它效率更高(以热量形式浪费的功率更少)、体积更小,并且工作电流要求更低,使其成为更优越的选择。

L298N 模块可以控制两个电机。我们将使用“电机 A”。

  1. 将您的电机连接到 OUT1 和 OUT2 螺丝端子。
  2. 将电机的外部电源连接到 VMS(或 12V)和 GND 螺丝端子。
  3. 如果存在,请移除 5V 使能跳线帽。
  4. 将 L298N 的 GND 连接到 Arduino 的 GND。
  5. 将 L298N 的 IN1 连接到 Arduino 引脚 8。
  6. 将 L298N 的 IN2 连接到 Arduino 引脚 7。
  7. 将 L298N 的 ENA(使能 A)连接到 Arduino 的 PWM 引脚 9。

这段代码使用辅助函数来实现清晰、可读的控制。

// L298N H 桥引脚定义
const int motorEnablePin = 9; // ENA - 必须是 PWM 引脚
const int motorIn1Pin = 8; // IN1
const int motorIn2Pin = 7; // IN2
void setup() {
// 将所有控制引脚设置为输出
pinMode(motorEnablePin, OUTPUT);
pinMode(motorIn1Pin, OUTPUT);
pinMode(motorIn2Pin, OUTPUT);
}
void loop() {
// 以全速向前运行 2 秒
moveMotor(255, true);
delay(2000);
// 停止 1 秒
stopMotor();
delay(1000);
// 以半速向后运行 2 秒
moveMotor(128, false);
delay(2000);
// 刹车 1 秒
brakeMotor();
delay(1000);
}
/**
* @brief 控制电机的速度和方向。
* @param speed 速度,从 0(关闭)到 255(全速)。
* @param forward true 表示向前,false 表示向后。
*/
void moveMotor(int speed, bool forward) {
if (forward) {
digitalWrite(motorIn1Pin, HIGH);
digitalWrite(motorIn2Pin, LOW);
} else {
digitalWrite(motorIn1Pin, LOW);
digitalWrite(motorIn2Pin, HIGH);
}
analogWrite(motorEnablePin, speed);
}
/**
* @brief 通过让电机自由滑行来停止。
*/
void stopMotor() {
// 禁用电机驱动器
analogWrite(motorEnablePin, 0);
}
/**
* @brief 通过短接电机端子来主动制动电机。
*/
void brakeMotor() {
digitalWrite(motorIn1Pin, HIGH);
digitalWrite(motorIn2Pin, HIGH);
analogWrite(motorEnablePin, 255); // 刹车需要被启用
}