使用Arduino控制直流电机

ARDUINO的

经过**迪利普·拉贾(Dilip Raja)** 2015年6月7日7

arduino esp32 app控制直流电机驱动 arduino控制直流马达_sed

在本教程中,我们将使DC电动机与Arduino UNO相连,并使用PWM(脉冲宽度调制)概念控制其速度。在UNO中启用此功能可在恒定电压上获得可变电压。在此说明PWM的方法。考虑一个如图所示的简单电路。

arduino esp32 app控制直流电机驱动 arduino控制直流马达_顺时针_02

如果按下按钮(如图所示),则电动机将开始旋转,并且电动机将一直运动,直到按下按钮为止。该按压是连续的,并且在第一波图中表示。如果在某种情况下,考虑按下按钮8ms并在10ms的周期内将其打开2ms,则在这种情况下,由于按钮仅被按下8ms,电动机将无法承受完整的9V电池电压,因此RMS端子电压电机将在7V左右。由于RMS电压降低,电动机将旋转,但速度降低。现在,平均接通时间为10ms =接通时间/(接通时间+断开时间),这称为占空比,为80%(8 /(8 + 2))。

在第二和第三种情况下,与第一种情况相比,按下按钮的时间更少。因此,电机端子上的RMS端子电压甚至进一步降低。由于该降低的电压,电动机速度甚至进一步降低。这种速度下降与占空比连续发生,直到电动机端子电压不足以使电动机转动的那一点为止。

因此,我们可以得出结论,PWM可用于改变电动机速度。

在继续之前,我们需要讨论H-BRIDGE。现在,该电路主要具有两个功能,一个是 从低功率控制信号**驱动直流电动机,** 另一个是 改变直流电动机的旋转方向

arduino esp32 app控制直流电机驱动 arduino控制直流马达_顺时针_03

图1

arduino esp32 app控制直流电机驱动 arduino控制直流马达_sed_04


图2

arduino esp32 app控制直流电机驱动 arduino控制直流马达_sed_05

众所周知,对于直流电动机,要改变旋转方向,就需要改变电动机电源电压的极性。因此,要改变极性,我们使用H桥。现在在上图1中,我们有四个开关。如图2所示,为了使电动机旋转,A1和A2关闭。因此,电流从右向左流过电动机,如图3的第二 部分所示。现在考虑电动机顺时针方向旋转。现在,如果打开了开关A1和A2,则关闭了B1和B2。过电动机电流从左至右,如图1日 图3。电流的流动方向与第一个相反,因此我们在电动机端子上看到的电位与第一个相反,因此电动机逆时针旋转。这是H-BRIDGE的工作方式。但是,低功率电机可以由H-BRIDGE IC L293D驱动。

L293D是设计用于驱动低功率直流电动机的H-BRIDGE IC,如图所示。该IC由两个H桥组成,因此可以驱动两个直流电动机。因此,该IC可用于根据微控制器的信号来驱动机器人的电机。

arduino esp32 app控制直流电机驱动 arduino控制直流马达_引脚_06


现在,如前所述,该IC具有更改直流电动机旋转方向的能力。这是通过控制INPUT1和INPUT2上的电压电平来实现的。

启用引脚

输入引脚1

输入引脚2

电机方向

高的

低的

高的

右转

高的

高的

低的

左转

高的

低的

低的

停止

高的

高的

高的

停止

因此,如上图所示,对于顺时针旋转,应将2A设为高,将1A设为低。同样,对于逆时针方向,1A应该为高,而2A应该为低。

arduino esp32 app控制直流电机驱动 arduino控制直流马达_sed_07

如图所示,Arduino UNO有6个PWM通道,因此我们可以在这六个引脚中的任何一个上获得PWM(可变电压)。在本教程中,我们将使用PIN3作为PWM输出。

硬件: ARDUINO UNO,电源(5v),100uF电容器,LED,按钮(两片),10KΩ电阻(两片)。

软体: arduino IDE(Arduino nightly)。

电路图

arduino esp32 app控制直流电机驱动 arduino控制直流马达_引脚_08

该电路按照上面显示的电路图连接在试验板上。但是,在连接LED端子时必须注意。尽管在这种情况下按钮显示弹跳效果,但不会引起很大的错误,因此我们这次不必担心。

来自UNO的PWM很容易,通常情况下为PWM信号设置ATMEGA控制器并不容易,我们必须定义许多寄存器和设置以获得准确的信号,但是在ARDUINO中我们不必处理所有这些事情。

默认情况下,所有头文件和寄存器都是由ARDUINO IDE预先定义的,我们只需要调用它们,就可以在适当的引脚上获得PWM输出。

现在要在适当的引脚上获得PWM输出,我们需要做三件事:

  1. pinMode(ledPin, OUTPUT)
  2. analogWrite(pin, value)
  3. analogWriteResolution(neededresolutionnumber)

首先,我们需要从六个引脚中选择PWM输出引脚,然后我们需要将该引脚设置为输出。

接下来,我们需要通过调用函数“ analogWrite(pin,value)”来启用UNO的PWM功能。在这里,“引脚”表示需要PWM输出的引脚号,我们将其设置为“ 3”。因此,在PIN3上,我们获得PWM输出。

值是开启占空比,介于0(始终关闭)和255(始终开启)之间。我们将通过按下按钮来递增和递减此数字。

UNO的最大分辨率为“ 8”,因此不能再进一步了,因此其值在0-255之间。但是,可以通过使用命令“ analogWriteResolution()”来降低PWM的分辨率,在方括号中输入一个4-8的值,可以将其值从四位PWM更改为八位PWM。

该开关将改变直流电动机的旋转方向。

volatile int i = 0; //initializing a integer for incrementing and decrementing duty ratio.

void setup()
{
  pinMode(3, OUTPUT);   // sets the pin3 as output
  pinMode(0, INPUT);// sets the pin0 as output
  pinMode(1, INPUT);// sets the pin1 as output
}

void loop()
{
  analogWrite(3, i);  // analogWrite values from 0 to 255
  if (digitalRead(0) == LOW)
  {
    if (i < 255)
    {
      i++;//if pin0 is pressed and the duty ratio value is less than 255
      delay(30);
    }
  }

  if (digitalRead(1) == LOW)
  {
    if (i > 0)
    {
      i--;// if pin1 is pressed and the duty ratio value is greater than 0
      delay(30);
    }
  }
}