在本次的文章中,我们将会介绍如何使用 Arduino 控制直流有刷电机。

直流有刷电机上生活中最为常见的电动机之一。小时候玩的四驱车采用的就是直流有刷电机。这种直流电机的驱动也是非常简单 ,只要给它接上直流电,电机就能转动,改变电源正负极,电机就能反转。那么我们怎么对电机进行调速并且更方便地切换电机的旋转方向呢?

简单的arduino电机控制(Arduino应用实例用L298N芯片驱动直流电机)(1)

我们知道,一个电机接两节干电池时的转速要比只接一节干电池要快得多。因此我们可以通过简单地控制电机的输入电压来控制直流电机的转速。最常用的方法是使用 pwm 信号控制电机。

PWM 直流电机控制

PWM 脉冲宽度调制(Pulse width modulation,PWM)是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。它相当于我们通过快速打开和关闭电源来调整输入电子设备的电压的平均值。 平均电压取决于占空比,或者信号开启的时间与信号在一个周期内关闭的时间的比值。

简单的arduino电机控制(Arduino应用实例用L298N芯片驱动直流电机)(2)

PWM原理图

因此,根据电机的大小,我们可以简单地将 Arduino PWM 输出连接到晶体管的基极或 MOS管的栅极,并通过控制 PWM 输出来控制电机的速度。 低功率 Arduino PWM 信号打开和关闭 MOS管上的栅极,通过该栅极驱动高功率电机。

简单的arduino电机控制(Arduino应用实例用L298N芯片驱动直流电机)(3)

Arduino驱动直流电机接线图

注意:Arduino与电机电源需共地。

H-桥直流电机控制

我们已经学会了控制电机的速度,下一步就是控制电机的正反转。为了控制旋转方向,我们只需要反转通过电机的电流方向,最常用的方法是使用H桥。 H桥电路包含四个开关元件、晶体管或MOS管,中间的电机形成类似H型的电路。通过同时激活两个特定的开关,我们就可以改变电流的方向,从而改变电机的旋转方向。比如只接通开关1,3电机正转,只接通2,4开关电机就会反转。

简单的arduino电机控制(Arduino应用实例用L298N芯片驱动直流电机)(4)

因此,如果我们将PWM和H桥这两种方法结合起来,我们就自如地控制直流电机了。实际上我们有许多具有这种功能的直流电机驱动器,L298N 就是其中最常用的模块之一。

L298N驱动模块

简单的arduino电机控制(Arduino应用实例用L298N芯片驱动直流电机)(5)

L298N 是双H桥电机驱动器,可同时控制两个直流电机的速度和方向。该模块可以驱动电压在5-35V之间的直流电机,峰值电流可达2A。

该模块左右各有两个螺钉接线端子用于连接电机A和B。中间的螺钉接线端子包括一个接地端,一个电机5-35V的供电端VCC以及一个5V接线端,它可以是输入或输出。这取决于电机 VCC 上使用的电压。 该模块具有板载5V稳压器,可使用跳线启用或禁用该稳压器。 如果电机电源电压高达 12V,我们可以启用5V稳压器,并且 5V 引脚可以用作输出,并为我们的 Arduino 板供电。 但如果电机电压大于 12V,我们必须断开跳线,因为过高的电压会损坏板载 5V 稳压芯片。 在这种情况下,5V 引脚将用作输入,因为我们需要将其连接到 5V 电源才能使 IC 正常工作。

简单的arduino电机控制(Arduino应用实例用L298N芯片驱动直流电机)(6)

接下来是信号端的接线。使能A(EnableA)和使能B(EnableB)引脚用于启用和控制电机速度。如果该引脚上存在跳线,电机将启动并以最大速度工作。我们也拆下跳线帽,将PWM输入此引脚,就可以控制电机的速度。如果我们将此针脚接地,电机将被禁用。

简单的arduino电机控制(Arduino应用实例用L298N芯片驱动直流电机)(7)

接下来,IN1和IN2引脚用于控制马达A的旋转方向,IN3和IN4用于马达B。我们通过这些引脚,来L298N IC内部H桥的开关。如果IN1输入低电平而IN2输入高电平,电机将正转,如果N1输入高电平而IN2输入低电平,电机将反转。如果两个引脚输入相同,电机将停止。这同样适用于IN3和IN4以及电机B。

Arduino L298N电机驱动

现在让我们连接上Arduino 做一个实际应用。我们将使用电位计控制电机的速度,并使用按钮改变旋转方向。下面是电路图。

简单的arduino电机控制(Arduino应用实例用L298N芯片驱动直流电机)(8)

硬件设备:

Arduino代码

/* Arduino 直流电机控制 - PWM | H-Bridge | L298N */ #define enA 9 //定义电机控制端和使能端 #define in1 6 #define in2 7 #define button 4 //定义按键 int rotDirection = 0; //定义旋转方向 int pressed = false; void setup() { pinMode(enA, OUTPUT); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(button, INPUT); // 设置初始旋转方向 digitalWrite(in1, LOW); digitalWrite(in2, HIGH); } void loop() { int potValue = analogRead(A0); // 读取电位计值 int pwmOutput = map(potValue, 0, 1023, 0 , 255); //将电位计值映射到 0- 255 analogWrite(enA, pwmOutput); // PWM信号输出 // 读取按键值 if (digitalRead(button) == true) { pressed = !pressed; } while (digitalRead(button) == true); delay(20); // 如果按键被按下,改变电机旋转方向 if (pressed == true & rotDirection == 0) { digitalWrite(in1, HIGH); digitalWrite(in2, LOW); rotDirection = 1; delay(20); } // 如果按键被按下,改变电机旋转方向 if (pressed == false & rotDirection == 1) { digitalWrite(in1, LOW); digitalWrite(in2, HIGH); rotDirection = 0; delay(20); } }

该实例程序中,我们需要先定义程序所需的管脚和变量。在setup中,我们需要设置引脚模式和电机的初始旋转方向。在loop中,我们首先读取电位计值,然后将从中获得的值(从0到1023)映射为PWM信号的0到255的值,或者是PWM信号的0到100%占空比。然后使用analogWrite()函数将PWM信号发送到L298N板的启用引脚,该引脚实际驱动电机。

接下来,我们检查是否按下了按钮,如果是值是真的,通过反向设置in1和in2状态来改变电机的旋转方向。该按钮将作为电机换向按钮,每次我们按下它,电机的旋转方向就会改变。

,