|
了解如何使用Arduino UNO开发板控制步进电机,以便在机器人中实现更精确的运动。
本篇文章将主要向您介绍如何控制步进电机以实现精细旋转和完美的角度控制 - 这是机器人项目的关键技能。
所需的硬件 ● 步进电机 ● ULN2003驱动芯片 ● Arduino Uno开发板 ● 面包板
为何使用步进电机? 步进电机是带有许多内齿的无刷直流电机,可以通过周围的铜线圈磁性锁定到位。与无刷电机不同,向步进电机供电不会使其转动。相反,它锁定到由给定输入指定的位置,并顺时针或逆时针转动一小步。
虽然这使得驱动步进电机更加复杂,但与无刷直流电机相比具有一个主要优势:它们的角位置可以非常精确地指定。例如,如果您希望电机正好旋转270度,那么使用普通直流无刷电机(没有某种形式的反馈)几乎是不可能的,但使用步进电机会很轻松。
步进电机需要多个步进脉冲才能到达您想要的位置。此外,步进电机线圈始终通电,大大增加了保持转矩,但强制转动则很困难。这些优点解释了为什么步进电机常用于许多应用,包括CNC机床和CD / DVD驱动器。
步进电机分为两个相位:单极和双极。单极电机包含连接所有线圈的公共电源,而双极电机具有分离的线圈。
本文仅介绍单极电机,因为双极电机需要以不同的方式驱动。
原理
步进电机原理图
单极输入和步进 单极电机通常具有5根输入线 - 两根成对线控制线圈,第五根线为每个线圈提供公共抽头。
虽然电机颜色因电机而异,但本文中使用的连接如下:
步进电机的接线图
下表显示了如何驱动每个输入以旋转电机。向前移动(即,从步骤1到2)使电动机顺时针转动,而向后移动使电动机逆时针转动。
表1.电机旋转状态
步进电机可能需要远远超过微控制器限制的电流,这就是微控制器必须永远不能直接连接到电机的原因。电动机也会引起反电动势,可能会损坏I / O端口,并且绝对必须使用钳位二极管。
然而,驱动具有四个分立晶体管的步进电机将是浪费和笨重的,这就是ULN2003步进驱动器必需的原因。该IC包含七个达林顿晶体管,每个晶体管都包含二极管保护,能够提供500mA,50V输出(实际上比Arduino Uno可以处理的更多)。
步进电机代码 编程步进电机的步骤可以通过switch语句和一些I / O位完成,但有一种更简单的方法:使用内置的Stepper Library!
虽然Arduino是一个方便而简单的平台,但它的库支持使其成为最好的平台之一 - 市场上的大多数模块都通过Arduino库兼容。对于步进电机,我们可以使用步进库轻松控制它们,无需对每个步骤进行编码。 - #include <Stepper.h>
-
- #define STEPS_PER_REV 513
-
- // Create our stepper motor object
- Stepper motor(STEPS_PER_REV, 2, 3, 4, 5);
-
- void setup() {
- motor.setSpeed(10); // Motor speed of 10 RPM
- }
-
- void loop()
- {
- motor.step(STEPS_PER_REV); // Step clockwise one whole revolution
- motor.step(STEPS_PER_REV / 2); // Step clockwise half revolution
- motor.step(-STEPS_PER_REV); // Step counter clockwise one whole revolution
- }
复制代码
要使用步进电机库,我们首先需要包含步进器库的头文件:
下一步(可选但建议使用)是定义电机在一整圈内旋转的步数。本文中使用的电机有32个步,并连接到比率为1:16的减速齿轮,因此一次旋转的步数为513。 - #define STEPS_PER_REV 513
复制代码现在我们已经定义了多个步骤,我们需要创建一个步进电机对象。该对象初始化为五个变量:每转的步数和连接步进电机的四个引脚。 - Stepper motor(STEPS_PER_REV, 2, 3, 4, 5);
复制代码在setup函数中,我们可以定义希望电机转动的速度(以RPM为单位)。对于本文,我们将RPM设置为10。 - void setup() {
- motor.setSpeed(10); // Motor speed of 10 RPM
- }
复制代码
主loop()函数保存转动电机所需的代码。 正数使电机等于前进的次数,而负数则使电机沿相反方向旋转。
此示例中的三行代码显示了STEPS_PER_RPM如何用于将电机转动已知量。 - motor.step(STEPS_PER_REV); // Step clockwise one whole revolution
- motor.step(STEPS_PER_REV / 2); // Step clockwise half revolution
- motor.step(-STEPS_PER_REV); // Step counter clockwise one whole revolution
复制代码
|