在当今的自动化世界中,步进电机和伺服电机是嵌入式系统中最常用的两种电机。两者都用于各种自动化机器,如机械臂、CNC 机器、相机等。在本教程中,我们将了解如何将步进电机与 ARM7-LPC2148 连接以及如何控制它的速度。
步进电机
步进电机是无刷直流电机,可以小角度旋转,这些角度称为步进。我们可以通过向其引脚提供数字脉冲来逐步旋转步进电机。步进电机价格便宜且设计坚固。电机的速度可以通过改变数字脉冲的频率来控制。
根据定子绕组的类型,有两种类型的步进电机可用: 单极 和 双极。这里我们使用的是最常用的步进电机UNIPOLAR步进电机。要旋转步进电机,我们需要按顺序为步进电机的线圈通电。根据旋转操作,它们分为两种模式:
全步模式:(4步序列)
单相步进(WAVE STEPPING)
两相步进
半步模式(8 步序列)
要了解有关步进电机及其操作的更多信息,请点击链接。
使用 ARM7-LPC2148 旋转步进电机
在这里,我们将使用FULL STEP: ONE PHASE ON 或 WAVE STEPPING模式使用 ARM7-LPC2148 旋转步进电机
在这种方法中,我们一次只能为一个线圈(LPC2148 的一个引脚)通电。也就是说,如果第一个线圈A通电一小段时间,轴将改变其位置,然后线圈B同样通电,轴将再次改变其位置。与此相同,线圈 C 和线圈 D 通电以进一步移动轴。这使得步进电机的轴通过一次激励一个线圈来逐步旋转。
通过这种方法,我们通过依次为线圈通电来逐步旋转轴。这被称为四步序列,因为它需要四个步骤。
您可以根据下面给出的值使用半步法(8 序列法)旋转步进电机。
所需组件
硬件:
ARM7-LPC2148
ULN2003电机驱动IC
LED – 4
步进电机 (28BYJ-48)
面包板
连接线
软件:
凯尔uVision5
Flasic 魔法工具
步进电机 (28BYJ-48)
28BYJ-48步进电机已如上图所示。它是一个 单极步进 电机,需要 5V 电源。该电机采用 4 线圈单极排列,每个线圈的额定电压为 +5V,因此使用任何微控制器(如 Arduino、Raspberry Pi、STM32、ARM 等)都相对容易控制。
但是我们需要一个像 ULN2003 这样的电机驱动 IC 来驱动它,因为步进电机消耗大电流并且可能会损坏微控制器。
28BYJ-48 的规格在以下数据表中提供:
ULN2003步进电机驱动器
大多数 步进电机 只能在驱动模块的帮助下运行。这是因为控制器模块(在我们的例子中为 LPC2148)将无法从其 I/O 引脚提供足够的电流以供电机运行。所以我们将使用像 ULN2003 模块这样的外部模块作为 步进电机驱动器。
在这个项目中,我们将使用 ULN2003 电机驱动器 IC。IC的管脚图如下:
引脚(IN1 至 IN7)是用于连接微控制器输出的输入引脚,OUT1 至 OUT7 是用于连接步进电机输入的相应输出引脚。COM 提供输出设备和外部电源输入源所需的正电源电压。
电路原理图
下面给出了将步进电机与 ARM-7 LPC2148 连接的电路图
带有 ULN2003 电机驱动器 IC 的 ARM7-LPC2148
LPC2148 的 GPIO 引脚(P0.7 至 P0.10)被视为与 ULN2003 IC 的输入引脚(IN1-IN4)相连的输出引脚。
ULN2003 IC与步进电机的连接(28BYJ-48)
ULN2003 IC 的输出引脚 (OUT1-OUT4) 连接到步进电机引脚(蓝色、粉色、黄色和橙色)。
ULN2003 的 IN1 到 IN4 的 LED
四个 LED(LED1、LED2、LED4、LED 4)阳极引脚分别与 ULN2003 的引脚 IN1、IN2、IN3 和 IN4 连接,LED 的阴极连接到 GND,用于指示来自 LPC2148 的脉冲。我们可以注意到所提供的脉冲模式。模式显示在最后附上的演示视频中。
为步进电机编程 ARM7-LPC2148
要对 ARM7-LPC2148 进行编程,我们需要 keil uVision 和 Flash Magic 工具。我们正在使用 USB 电缆通过微型 USB 端口对 ARM7 Stick 进行编程。我们使用 Keil 编写代码并创建一个 hex 文件,然后使用 Flash Magic 将 HEX 文件闪存到 ARM7 棒。
使用 ARM 7 控制步进电机的完整代码 在本教程的末尾给出,这里我们解释它的几个部分。
1.为了使用完整的 STEP-ONE PHASE ON方法,我们需要包含以下命令。所以我们在程序中使用下面这行
无符号字符顺时针[4] = {0x1,0x2,0x4,0x8};//顺时针旋转命令
unsigned char antilateral[4] = {0x8,0x4,0x2,0x1}; //逆时针旋转命令
2.以下行用于将 PORT0 引脚初始化为输出并将它们设置为 LOW
PINSEL0 = 0x00000000;//设置PORT0引脚
IO0DIR |= 0x00000780; //设置引脚P0.7、P0.8、P0.9、P0.10为OUTPUT
IO0CLR = 0x00000780; //设置P0.7、P0.8、P0.9、P0.10引脚输出为低
3.通过使用此for循环延迟,根据顺时针命令将 PORT 引脚(P0.7 至 P0.10)设置为高电平
for (int j=0; j
for(int i=0; i<4;i++)
{
IOPIN0 = 顺时针[i]<<7; // 左移后将引脚值逐一设置为 HIGH
delay(0x10000); //改变这个值来改变旋转速度
}
}
Anti-clock Wise 也一样
for (int z=0;z
for(int i=0; i<4;i++)
{
IOPIN0 =逆时针[i]<<7;
延迟(0x10000);//改变这个值来改变旋转速度
}
}
4.改变延迟时间改变步进电机的转速
延迟(0x10000);//更改此值以更改旋转速度
(0x10000)-全速
(0x50000)-变慢
(0x90000)-比以前变慢。因此,通过增加延迟,我们降低了旋转速度。
5.一整圈的步数可以用下面的代码改变
int no_of_steps = 550; //将此值更改为所需的旋转步数(550 为一个完整的旋转)
对于我的步进电机,完全旋转有 550 步,半旋转有 225 步。所以根据你的要求改变它。
6.此功能用于创建延迟时间。
void delay(unsigned int value) //产生延迟的函数
{
unsigned int z;
for(z=0;z}