自己做视频网站的流程,保定网站 优,好的办公室设计,微信小程序模版如果您打算组装新的机器人朋友#xff0c;您最终会想要学习如何控制直流电机。控制直流电机最简单且经济的方法是将 L293D 电机驱动器 IC 与 Arduino 连接。它可以控制两个直流电机的速度和旋转方向。 此外#xff0c;它还可以控制单极步进电机#xff08;如 28BYJ-48#… 如果您打算组装新的机器人朋友您最终会想要学习如何控制直流电机。控制直流电机最简单且经济的方法是将 L293D 电机驱动器 IC 与 Arduino 连接。它可以控制两个直流电机的速度和旋转方向。 此外它还可以控制单极步进电机如 28BYJ-48或双极步进电机如 NEMA 17。 控制直流电机 为了完全控制直流电机我们必须控制它的速度和旋转方向。这可以通过结合这两种技术来实现。 PWM——控制速度H-Bridge – 控制旋转方向 PWM——控制速度 直流电机的速度可以通过改变其输入电压来控制。实现此目的的常用技术是使用 PWM脉冲宽度调制。 PWM 是一种通过发送一系列开关脉冲来调整输入电压平均值的技术。 平均电压与称为占空比的脉冲宽度成正比。 占空比越高施加到直流电机的平均电压越高导致速度越高占空比越短施加到直流电机的平均电压越低导致速度较低。 下图显示了具有不同占空比和平均电压的 PWM 技术。 脉宽调制PWM技术 H-Bridge – 控制旋转方向 直流电机的旋转方向可以通过改变其输入电压的极性来控制。实现此目的的常用技术是使用 H 桥。 H 桥电路由四个开关组成电机位于中心形成类似 H 的布置。 同时闭合两个特定开关会反转施加到电机的电压的极性。这会导致电机旋转方向发生变化。 下面的动画显示了 H 桥电路的工作情况。 H桥的工作 L293D电机驱动IC L293D 是一款双通道 H 桥电机驱动器能够驱动一对直流电机或单个步进电机。这意味着它可以单独驱动多达两个电机这使其成为构建两轮机器人平台的理想选择。 L293D 最常用于驱动电机但也可用于驱动任何感性负载例如继电器螺线管或大型开关功率晶体管。 它能够驱动四个螺线管、四个单向直流电机、两个双向直流电机或一个步进电机。 L293D IC 的电源范围为 4.5V 至 36V每通道能够提供 1.2A 峰值输出电流因此它与我们的大多数电机配合良好。 该 IC 还包括内置反冲二极管以防止电机断电时损坏。 技术规格 以下是规格 电机输出电压4.5V – 36V逻辑输入电压5V每通道输出电流600毫安每个通道的峰值输出电流1.2A 欲了解更多详细信息请参阅下面的数据表。 L293D 数据表 L293D 电机驱动器 IC 引脚排列 L293D IC 共有 16 个引脚用于将其与外界连接。引脚排列如下 让我们一一熟悉一下所有的引脚。 电源引脚 L293D 电机驱动器 IC 实际上有两个输入电源引脚 - VS 和 VSS。 VSVcc2引脚为 IC 的内部 H 桥供电以驱动电机。您可以将 4.5 至 36V 之间的任何输入电压连接到该引脚。 VSSVcc1用于驱动内部逻辑电路电压应为5V。 接地引脚是公共接地引脚。所有 4 个 GND 引脚均在内部连接用于散发高负载条件下产生的热量。 输出引脚 L293D 电机驱动器的电机 A 和 B 的输出通道引出至引脚输出1、输出2和输出3、输出4分别。您可以将两个 5-36V 直流电机连接到这些引脚。 IC 上的每个通道均可向直流电机提供高达 600mA 的电流。然而提供给电机的电流量取决于系统的电源。 方向控制引脚 通过方向控制引脚可以控制电机正转还是反转。这些引脚实际上控制 L293D IC 内部 H 桥电路的开关。 该 IC 的每个通道都有两个方向控制引脚。这输入1和输入2引脚控制电机A的旋转方向尽管IN3和IN4控制电机B的旋转方向。 电机的旋转方向可以通过对这些输入施加逻辑高电平5V或逻辑低电平接地来控制。下图显示了这是如何完成的。 输入1输入2旋转方向低(0)低(0)电机关闭高(1)低(0)向前低(0)高(1)落后高(1)高(1)电机关闭 速度控制销 速度控制引脚EMA和ENB用于打开/关闭电机并控制其速度。 将这些引脚拉高将导致电机旋转而将其拉低将停止电机。但是通过脉冲宽度调制 (PWM)您实际上可以控制电机的速度。 将 L293D 电机驱动器 IC 连接到 Arduino 现在我们已经了解了有关 IC 的一切我们可以开始将它连接到我们的 Arduino 了 让我们从将电源连接到电机开始。在我们的实验中我们使用两轮驱动机器人中常见的直流变速箱电机也称为“TT”电机。它们的额定电压为 3 至 12V。因此我们将外部5V电源连接到VSVcc2引脚。 接下来我们需要向 L293D 的逻辑电路提供 5V 电压。将 VSS (Vcc1) 引脚连接到 Arduino 上的 5V 输出。并确保您的电路和 Arduino 共享一个公共地。 现在将 L293D IC 的输入和使能引脚ENA、IN1、IN2、IN3、IN4 和 ENB连接到 6 个 Arduino 数字输出引脚9、8、7、5、4 和 3。请注意Arduino 输出引脚 9 和 3 均启用 PWM。 最后将一个电机连接到 OUT1 和 OUT2将另一个电机连接到 OUT3 和 OUT4。您可以互换电机的连接。从技术上讲没有正确或错误的方法。 完成后您应该看到类似于下图的内容。 Arduino 示例代码 下面的草图将让您全面了解如何使用L293D电机驱动IC来控制直流电机的速度和旋转方向并将作为更多实际实验和项目的基础。 // Motor A connections
int enA 9;
int in1 8;
int in2 7;
// Motor B connections
int enB 3;
int in3 5;
int in4 4;void setup() {// Set all the motor control pins to outputspinMode(enA, OUTPUT);pinMode(enB, OUTPUT);pinMode(in1, OUTPUT);pinMode(in2, OUTPUT);pinMode(in3, OUTPUT);pinMode(in4, OUTPUT);// Turn off motors - Initial statedigitalWrite(in1, LOW);digitalWrite(in2, LOW);digitalWrite(in3, LOW);digitalWrite(in4, LOW);
}void loop() {directionControl();delay(1000);speedControl();delay(1000);
}// This function lets you control spinning direction of motors
void directionControl() {// Set motors to maximum speed// For PWM maximum possible values are 0 to 255analogWrite(enA, 255);analogWrite(enB, 255);// Turn on motor A BdigitalWrite(in1, HIGH);digitalWrite(in2, LOW);digitalWrite(in3, HIGH);digitalWrite(in4, LOW);delay(2000);// Now change motor directionsdigitalWrite(in1, LOW);digitalWrite(in2, HIGH);digitalWrite(in3, LOW);digitalWrite(in4, HIGH);delay(2000);// Turn off motorsdigitalWrite(in1, LOW);digitalWrite(in2, LOW);digitalWrite(in3, LOW);digitalWrite(in4, LOW);
}// This function lets you control speed of the motors
void speedControl() {// Turn on motorsdigitalWrite(in1, LOW);digitalWrite(in2, HIGH);digitalWrite(in3, LOW);digitalWrite(in4, HIGH);// Accelerate from zero to maximum speedfor (int i 0; i 256; i) {analogWrite(enA, i);analogWrite(enB, i);delay(20);}// Decelerate from maximum speed to zerofor (int i 255; i 0; --i) {analogWrite(enA, i);analogWrite(enB, i);delay(20);}// Now turn off motorsdigitalWrite(in1, LOW);digitalWrite(in2, LOW);digitalWrite(in3, LOW);digitalWrite(in4, LOW);
} 代码说明 Arduino 代码非常简单。它不需要任何库即可工作。该草图首先声明 L293D 控制引脚所连接的 Arduino 引脚。 // Motor A connections int enA 9;
int in1 8;
int in2 7;
// Motor B connections
int enB 3;
int in3 5;
int in4 4; 在代码的设置部分所有电机控制引脚方向和速度控制引脚都配置为数字输出方向控制引脚被拉低以关闭两个电机。 void setup() {// Set all the motor control pins to outputspinMode(enA, OUTPUT);pinMode(enB, OUTPUT);pinMode(in1, OUTPUT);pinMode(in2, OUTPUT);pinMode(in3, OUTPUT);pinMode(in4, OUTPUT);// Turn off motors - Initial statedigitalWrite(in1, LOW);digitalWrite(in2, LOW);digitalWrite(in3, LOW);digitalWrite(in4, LOW);
} 在代码的循环部分我们以一秒的间隔调用两个用户定义的函数。 void loop() {directionControl();delay(1000);speedControl();delay(1000);
} 这些功能是 DirectionControl() – 此函数使两个电机以最大速度向前旋转两秒。然后它反转电机的旋转方向并旋转两秒钟。最后它关闭电机。 void directionControl() {// Set motors to maximum speed// For PWM maximum possible values are 0 to 255analogWrite(enA, 255);analogWrite(enB, 255);// Turn on motor A BdigitalWrite(in1, HIGH);digitalWrite(in2, LOW);digitalWrite(in3, HIGH);digitalWrite(in4, LOW);delay(2000);// Now change motor directionsdigitalWrite(in1, LOW);digitalWrite(in2, HIGH);digitalWrite(in3, LOW);digitalWrite(in4, HIGH);delay(2000);// Turn off motorsdigitalWrite(in1, LOW);digitalWrite(in2, LOW);digitalWrite(in3, LOW);digitalWrite(in4, LOW);
} speedControl() – 该函数通过使用AnalogWrite()函数生成 PWM 信号将两个电机从零加速到最大速度然后将它们减速回零。最后它关闭电机。 void speedControl() {// Turn on motorsdigitalWrite(in1, LOW);digitalWrite(in2, HIGH);digitalWrite(in3, LOW);digitalWrite(in4, HIGH);// Accelerate from zero to maximum speedfor (int i 0; i 256; i) {analogWrite(enA, i);analogWrite(enB, i);delay(20);}// Decelerate from maximum speed to zerofor (int i 255; i 0; --i) {analogWrite(enA, i);analogWrite(enB, i);delay(20);}// Now turn off motorsdigitalWrite(in1, LOW);digitalWrite(in2, LOW);digitalWrite(in3, LOW);digitalWrite(in4, LOW);
}