|
在本篇文章中,我们将学习到如何使用Arduino开发板控制直流电机。我们将看看控制直流电机的一些基本技术,然后列举两个例子,通过例子我们将学习到如何使用L298N驱动器和Arduino开发板控制直流电机。我们可以通过简单地控制电机的输入电压来控制直流电机的速度,最常用的方法是使用PWM信号。
PWM直流电机控制 PWM或脉冲宽度调制技术允许我们通过快速打开和关闭电源来调整流向电子设备的电压的平均值。平均电压取决于占空比,或信号开启的时间量与信号在单个时间段内关闭的时间量之间的关系。
因此,根据电机的大小,我们可以简单地将Arduino开发板的PWM输出连接到晶体管的基极或MOSFET的栅极,并通过控制PWM输出来控制电机的速度。低功率Arduino的PWM信号接通和断开MOSFET的栅极,通过该栅极驱动大功率电机。
注意:Arduino GND和电机电源GND应连接在一起。
H桥直流电机控制 另一方面,为了控制旋转方向,我们只需要反转通过电机的电流方向,最常用的方法是使用H桥。 H桥电路包含四个开关元件、晶体管或MOSFET,电机位于中心,形成类似H的配置。通过同时激活两个特定开关,我们可以改变电流的方向,从而改变电机的旋转方向。
因此,如果我们将这两种方法(PWM和H桥)结合起来,我们就可以完全控制直流电机。有许多直流电机驱动器具有这些功能,而L298N就是其中之一。
L298N驱动程序 L298N是一款双H桥电机驱动器,可同时控制两个直流电机的速度和方向。该模块可以驱动电压在5到35V之间的直流电机,峰值电流高达2A。
让我们仔细看看L298N模块的引出线,并解释它是如何工作的。该模块有两个用于电机A和B的螺钉接线端子,另一个用于接地引脚的螺钉接线端子,用于电机的VCC和一个5V引脚,可以是输入或输出。
这取决于电机VCC使用的电压。该模块具有板载5V稳压器,可通过跳线启用或禁用。如果电机电源电压高达12V,我们可以启用5V稳压器,5V引脚可以用作输出,例如为我们的Arduino电路板供电。但如果电机电压大于12V,我们必须断开跳线,因为这些电压会对板载5V稳压器造成损坏。在这种情况下,5V引脚将用作输入,因为我们需要将其连接到5V电源,以便IC正常工作。
我们在这里可以注意到,该IC产生的电压降约为2V。因此,例如,如果我们使用12V电源,电机端子的电压将约为10V,这意味着我们将无法从12V直流电机获得最大速度。
接下来是逻辑控制输入。 Enable A和Enable B引脚用于启用和控制电机的速度。如果此引脚上有跳线,电机将启用并以最大速度工作,如果我们移除跳线,我们可以将PWM输入连接到此引脚,从而控制电机的速度。如果我们将此引脚连接到地,则电机将被禁用。
接下来,输入1和输入2引脚用于控制电机A的旋转方向,以及电机B的输入3和4。使用这些引脚,我们实际控制L298N IC内部的H桥开关。如果输入1为低电平且输入2为高电平,则电机将向前移动,反之亦然,如果输入1为高电平且输入2为低电平,则电机将向后移动。如果两个输入相同,无论是低电平还是高电平,电动机都将停止。这同样适用于输入3和4以及电机B。
Arduino和L298N 现在让我们来做一些实际应用。在第一个例子中,我们将使用电位器控制电机的速度,并使用按钮改变旋转方向。以下是电路原理图。
以下是本示例所需的组件:
● L298N驱动芯片 ● 12V高扭矩直流电机 ● Arduino开发板 ● 面包板和跳线
Arduino代码 以下是本例中的Arduino代码: - /* Arduino DC Motor Control - PWM | H-Bridge | L298N - Example 01
- by Dejan Nedelkovski, www.HowToMechatronics.com
- */
- #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);
- // Set initial rotation direction
- digitalWrite(in1, LOW);
- digitalWrite(in2, HIGH);
- }
- void loop() {
- int potValue = analogRead(A0); // Read potentiometer value
- int pwmOutput = map(potValue, 0, 1023, 0 , 255); // Map the potentiometer value from 0 to 255
- analogWrite(enA, pwmOutput); // Send PWM signal to L298N Enable pin
- // Read button - Debounce
- if (digitalRead(button) == true) {
- pressed = !pressed;
- }
- while (digitalRead(button) == true);
- delay(20);
- // If button is pressed - change rotation direction
- if (pressed == true & rotDirection == 0) {
- digitalWrite(in1, HIGH);
- digitalWrite(in2, LOW);
- rotDirection = 1;
- delay(20);
- }
- // If button is pressed - change rotation direction
- 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电路板的Enable引脚,该引脚实际驱动电机。
接下来,我们检查是否按下了按钮,如果按下按钮,我们将通过反向设置输入1和输入2状态来改变电机的旋转方向。 按钮将用作切换按钮,每次按下它时,它将改变电机的旋转方向。 |