直流有刷电机上生活中最为常见的电动机之一。小时候玩的四驱车采取的便是直流有刷电机。这种直流电机的驱动也是非常大略 ,只要给它接上直流电,电机就能迁徙改变,改变电源正负极,电机就能反转。那么我们怎么对电机进行调速并且更方便地切换电机的旋转方向呢?
我们知道,一个电机接两节干电池时的转速要比只接一节干电池要快得多。因此我们可以通过大略地掌握电机的输入电压来掌握直流电机的转速。最常用的方法是利用 PWM 旗子暗记掌握电机。

PWM 脉冲宽度调制(Pulse width modulation,PWM)是一种仿照掌握办法,根据相应载荷的变革来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通韶光的改变,从而实现开关稳压电源输出的改变。这种办法能使电源的输出电压在事情条件变革时保持恒定,是利用微处理器的数字旗子暗记对仿照电路进行掌握的一种非常有效的技能。它相称于我们通过快速打开和关闭电源来调度输入电子设备的电压的均匀值。 均匀电压取决于占空比,或者旗子暗记开启的韶光与旗子暗记在一个周期内关闭的韶光的比值。

PWM事理图
因此,根据电机的大小,我们可以大略地将 Arduino PWM 输出连接到晶体管的基极或 MOS管的栅极,并通过掌握 PWM 输出来掌握电机的速率。 低功率 Arduino PWM 旗子暗记打开和关闭 MOS管上的栅极,通过该栅极驱动高功率电机。
Arduino驱动直流电机接线图
把稳:Arduino与电机电源需共地。
H-桥直流电机掌握我们已经学会了掌握电机的速率,下一步便是掌握电机的正反转。为了掌握旋转方向,我们只须要反转通过电机的电流方向,最常用的方法是利用H桥。 H桥电路包含四个开关元件、晶体管或MOS管,中间的电机形成类似H型的电路。通过同时激活两个特定的开关,我们就可以改变电流的方向,从而改变电机的旋转方向。比如只接通开关1,3电机正转,只接通2,4开关电机就会反转。
因此,如果我们将PWM和H桥这两种方法结合起来,我们就自若地掌握直流电机了。实际上我们有许多具有这种功能的直流电机驱动器,L298N 便是个中最常用的模块之一。
L298N驱动模块L298N 是双H桥电机驱动器,可同时掌握两个直流电机的速率和方向。该模块可以驱动电压在5-35V之间的直流电机,峰值电流可达2A。
该模块旁边各有两个螺钉接线端子用于连接电机A和B。中间的螺钉接线端子包括一个接地端,一个电机5-35V的供电端VCC以及一个5V接线端,它可以是输入或输出。这取决于电机 VCC 上利用的电压。 该模块具有板载5V稳压器,可利用跳线启用或禁用该稳压器。 如果电机电源电压高达 12V,我们可以启用5V稳压器,并且 5V 引脚可以用作输出,并为我们的 Arduino 板供电。 但如果电机电压大于 12V,我们必须断开跳线,由于过高的电压会破坏板载 5V 稳压芯片。 在这种情形下,5V 引脚将用作输入,由于我们须要将其连接到 5V 电源才能使 IC 正常事情。
接下来是旗子暗记真个接线。使能A(EnableA)和使能B(EnableB)引脚用于启用和掌握电机速率。如果该引脚上存在跳线,电机将启动并以最大速率事情。我们也拆下跳线帽,将PWM输入此引脚,就可以掌握电机的速率。如果我们将此针脚接地,电机将被禁用。
接下来,IN1和IN2引脚用于掌握马达A的旋转方向,IN3和IN4用于马达B。我们通过这些引脚,来L298N IC内部H桥的开关。如果IN1输入低电平而IN2输入高电平,电机将正转,如果N1输入高电平而IN2输入低电平,电机将反转。如果两个引脚输入相同,电机将停滞。这同样适用于IN3和IN4以及电机B。
Arduino L298N电机驱动现在让我们连接上Arduino 做一个实际运用。我们将利用电位计掌握电机的速率,并利用按钮改变旋转方向。下面是电路图。
硬件设备:
Arduino UNO掌握器 × 1298N电机驱动模块 × 1直流电机 × 1电位计 × 1按钮 × 112V 电源 × 1杜邦线 × nArduino代码/ 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状态来改变电机的旋转方向。该按钮将作为电机换向按钮,每次我们按下它,电机的旋转方向就会改变。










