将步进电机与Atmega16连接起来的方法

控制/MCU

1882人已加入

描述

  步进电机是直流无刷电机,可以从 0 0到 360 0步进旋转。步进电机使用电子信号逐步旋转电机,每个信号以固定增量(一步)旋转轴。通过施加一定的信号序列来控制旋转角度。与伺服电机不同,步进电机可以使用微控制器的 GPIO 引脚而不是 PWM 引脚来驱动,并且可以在 (+360 0 ) 和 (-360 0 ) 范围内旋转)。信号的顺序决定了步进电机的顺时针和逆时针方向。为了控制电机的速度,我们只需要改变施加的控制信号的速率。步进电机逐步旋转。步进电机有多种步进模式,如全步、半步和微步。

  在本教程中,我们将使用 Atmel Studio 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(任何颜色)

  步进电机引脚说明

AVR微控制器

  使用 ULN2003 模块进行步进电机控制的电路图

  使用ULN2003时如下图所示连接所有组件。 同样,我们将在下一步中使用 L293D 连接它。我们正在使用 Atmega16 的 PORTA 来连接两个电机驱动器的步进电机。无需连接步进电机的 5V 引脚。仅需要线圈引脚来移动步进电机。引脚顺序对于驱动步进电机非常重要,因为线圈的通电应该是为了获得步进。本项目使用 ULN2003 的四个输入和 ULN2003 的四个输出。输入将连接到 PORTA 引脚,输出将连接到步进电机信号引脚。此外,在复位引脚中连接一个按钮,以便在需要时复位 Atmega16。将 Atmega16 与适当的晶体振荡器电路连接。所有系统将由 5V 电源供电。

AVR微控制器

  下面是ULN2003 电机驱动模块的实际图片:

AVR微控制器

  下面我们给出了 Atmega16 引脚与 ULN2003 和 L293D 的连接,以旋转步进电机。步进电机与 L293D 模块的接口将在后面部分进行说明,请记住,步进电机控制只需要一个模块 ULN2003 或 L293D。

  INPUT 的引脚连接如下:

AVR微控制器

  OUTPUT 的引脚连接如下:

AVR微控制器

AVR微控制器

  使用 L293D 模块控制步进电机的电路图:

AVR微控制器

AVR微控制器

AVR微控制器

  用 AVR ATmega16 控制步进电机

  如前所述,与伺服电机不同,步进电机需要外部驱动器,例如 ULN2003 或 L293D 电机驱动器。所以只需像上面那样连接电路并上传最后给出的 main.c 程序。

  该草图演示了步进电机在两侧旋转,即顺时针和逆时针方向。如果您想沿一个方向旋转步进器,只需在草图中注释掉另一个方向的代码行。

  下面给出了用于控制步进电机的完整 AVR 代码。代码很简单,很容易理解。下面给出了两个代码,一个用于使用 ULN2003 旋转步进电机,第二个用于 L293D 模块。

  连接您的 USBASP v2.0 并按照此链接中的说明使用 USBASP 和 Atmel Studio 7.0 对 Atmega16 AVR 微控制器进行编程。只需使用外部工具链构建草图并上传即可。
#define F_CPU 16000000UL /* 定义 CPU 频率 1MHz */

#include /* 包括 AVR 标准。库文件 */

#include /* 包含延迟头文件 */





诠释主要(无效)

{



//int周期;

DDRA = 0x0F;/* 使 PORTA 低端引脚作为输出 */

整数周期 = 6;/* 设置两个步骤之间的时间段 */



而 (1)

{



/* 以半步序列顺时针旋转步进电机 */

for(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);

}

}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分