步进电机是直流无刷电机,可以从 0 0到 360 0步进旋转。步进电机使用电子信号逐步旋转电机,每个信号以固定增量(一步)旋转轴。通过施加一定的信号序列来控制旋转角度。与伺服电机不同,步进电机可以使用微控制器的 GPIO 引脚而不是 PWM 引脚来驱动,并且可以在 (+360 0 ) 和 (-360 0 ) 范围内旋转)。信号的顺序决定了步进电机的顺时针和逆时针方向。为了控制电机的速度,我们只需要改变施加的控制信号的速率。步进电机逐步旋转。步进电机有多种步进模式,如全步、半步和微步。
在本教程中,我们将使用AtmelStudio 7.0将 28BYJ-48步进电机与 Atmega16 AVR 微控制器连接起来。步进电机的额定工作电压为 5V。我们将连接步进电机与电机驱动器,即ULN2003 和 L293。两者都将由 5V电源驱动。为了简化接口,我们使用两个电机驱动器的预构建模块。您还可以使用 ULN2003 和 L293D 独立IC。电线和跳线的数量可以更多,所以在连接所有连接时要小心。
所需组件
步进电机(28BYJ-48)
ULN2003模块/L293D电机驱动器
Atmega16微控制器IC
16Mhz 晶体振荡器
两个 100nF电容器
两个 22pF电容器
按钮
跳线
面包板
USBASP v2.0
LED(任何颜色)
步进电机引脚说明
使用 ULN2003 模块进行步进电机控制的电路图
使用ULN2003时如下图所示连接所有组件。 同样,我们将在下一步中使用 L293D 连接它。我们正在使用 Atmega16 的 PORTA 来连接两个电机驱动器的步进电机。无需连接步进电机的 5V 引脚。仅需要线圈引脚来移动步进电机。引脚顺序对于驱动步进电机非常重要,因为线圈的通电应该是为了获得步进。本项目使用 ULN2003 的四个输入和 ULN2003 的四个输出。输入将连接到 PORTA 引脚,输出将连接到步进电机信号引脚。此外,在复位引脚中连接一个按钮,以便在需要时复位 Atmega16。将 Atmega16 与适当的晶体振荡器电路连接。所有系统将由 5V 电源供电。
下面是ULN2003 电机驱动模块的实际图片:
下面我们给出了 Atmega16 引脚与 ULN2003 和 L293D 的连接,以旋转步进电机。步进电机与 L293D 模块的接口将在后面部分进行说明,请记住,步进电机控制只需要一个模块 ULN2003 或 L293D。
INPUT 的引脚连接如下:
OUTPUT 的引脚连接如下:
使用 L293D 模块控制步进电机的电路图:
用 AVR ATmega16 控制步进电机
如前所述,与伺服电机不同,步进电机需要外部驱动器,例如 ULN2003 或 L293D 电机驱动器。所以只需像上面那样连接电路并上传最后给出的 main.c 程序。
该草图演示了步进电机在两侧旋转,即顺时针和逆时针方向。如果您想沿一个方向旋转步进器,只需在草图中注释掉另一个方向的代码行。
下面给出了用于控制步进电机的完整 AVR 代码。代码很简单,很容易理解。下面给出了两个代码,一个用于使用 ULN2003 旋转步进电机,第二个用于 L293D 模块。
连接您的 USBASP v2.0 并按照此链接中的说明使用 USBASP 和 Atmel Studio 7.0 对 Atmega16 AVR 微控制器进行编程。只需使用外部工具链构建草图并上传即可。
#define F_CPU16000000UL /* 定义 CPU 频率 1MHz */
#include
#include
诠释主要(无效)
{
//int周期;
DDRA = 0x0F;/* 使 PORTA 低端引脚作为输出 */
整数周期 = 6;/* 设置两个步骤之间的时间段 */
而 (1)
{
/* 以半步序列顺时针旋转步进电机 */
f
or(int i=0;i<50;i++)
{
端口= 0x09;
_delay_ms(周期);
端口 = 0x08;
_delay_ms(周期);
端口 = 0x0C;
_delay_ms(周期);
端口 = 0x04;
_delay_ms(周期);
端口 = 0x06;
_delay_ms(周期);
端口 = 0x02;
_delay_ms(周期);
端口 = 0x03;
_delay_ms(周期);
端口 = 0x01;
_delay_ms(周期);
}
端口 = 0x09;/* 最后一步到初始位置 */
_delay_ms(周期);
_delay_ms(1000);
/* 以全步序列逆时针旋转步进电机 */
for(int i=0;i<50;i++)
{
端口 = 0x01;
_delay_ms(周期);
端口 = 0x03;
_delay_ms(周期);
端口 = 0x02;
_delay_ms(周期);
端口 = 0x06;
_delay_ms(周期);
端口 = 0x04;
_delay_ms(周期);
端口 = 0x0C;
_delay_ms(周期);
端口 = 0x08;
_delay_ms(周期);
端口 = 0x09;
_delay_ms(周期);
}
端口 = 0x09;
_delay_ms(周期);
_delay_ms(1000);
}
}
评论
查看更多