51单片机通过驱动器精准控制步进电机

51单片机驱动器控制步进电机

本文写到的实物图

文章简介

本文是前段时间玩步进电机精准控制的总结,关于51单片机驱动步进电机的程序(用脉冲频率控制)及接线方法。

1.驱动器简介

如图所示,以下为两相电机驱动器实物图,ENA+为驱动器使能信号+,ENA-为驱动器使能信号-。PUL+是脉冲信号+,PUL-是脉冲信号-。DIP是方向信号。 DC接供电电源,电压为24V~42V。

驱动器实物图

驱动器还可通过拨码开关调电流和调细分,上方有PU的表格为调细分的,通过拨码开关S1,S2,S3进行控制,下方有PK的表格为调电流的,通过拨码开关S4,S5,S6进行控制。拨码开关往下拨就是ON状态(开启状态)。(其他驱动器可根据规格表对比,基本同理)

驱动器拨码开关图

2.驱动器和单片机接线方法

驱动器上A+、A-、B+、B-端通过电机上说明,按照颜色接即可。

电机实物图

然后驱动器ENA-,DIP-,PUL-三个端共地,接单片机的GND

共地接法

这里是驱动器拨码开关的图在这里插入图片描述

接着PUL+,DIR+两个端根据代码写的端口接到单片机上,下面是实物连接图。

驱动器和单片机实物接线图

3.单片机程序

程序通过用按键控制发送的脉冲频率,通过发送脉冲,给驱动器口PUL驱动电机, 通过按键来控制发送 500 个脉冲,精准控制步进电机在直尺上转动 1cm 。

按键一功能是发送500个脉冲,从而精准控制一厘米,为什么是发送500个脉冲,是因为驱动器可以通过拨动开关调电流,调细分,我用的是200个脉冲转一圈的状态,经过调试200个脉冲刚好转动0.4厘米,经过换算,500个脉冲为1厘米,所以实现精准控制1厘米,同理可得,其他距离的脉冲数。
按键二的功能为使电机反转,通过转换引脚电平,给驱动器DIR口状态取反,DIR控制电机正方转,故按键二控制电机方向。
两个外部中断是响应接近开关,使电机转换方向,防止电机超过限位。

#include <stc15f2k60s2.h>
#include <intrins.h>
#define u8 unsigned char
#define u16 unsigned int
 unsigned int h;		//无符号整形变量

sbit maichong=P1^1;		//定义脉冲输出脚(PUL)
sbit zhuang=P0^3;		//定义方向引脚(DIR)
sbit  K1=P2^0;			//脉冲发送
sbit  K2=P2^1;			//转向
sbit  K3=P2^2;			//调试按键,调试中断是否能进入,可注释掉
sbit  right=P3^2		//右限位
sbit  left=P3^3;		//左限位
sbit  yuan=P0^2;		//坐标原点

/**CSDN博墨**************************************/
/********CSDN博墨********************************/
/****************CSDN博墨************************/
/*************************CSDN博墨***************/
/**********************************CSDN博墨******/


void Delay400us()		//400微秒延时函数	
{
	unsigned char i, j;

	i = 5;
	j = 74;
	do
	{
		while (--j);
	} while (--i);
}

void Delay10ms()		//10毫秒延时函数
{
	unsigned char i, j;

	i = 108;
	j = 145;
	do
	{
		while (--j);
	} while (--i);
}

void right_EXINT0() interrupt 0		//外部中断函数0
{
	if(right==1)
	{
		Delay10ms(); 
		if(right==1)
		{
			zhuang=~zhuang;
		}
	}
}
	
void left_EXINT1() interrupt 2		//外部中断函数1
{
	if(left==1)
	{
		Delay10ms(); 
	if(left==1)
		{
			zhuang=~zhuang;
		}
	}
}	

void EXINT_init()			//外部中断初始化
{

	IT0=0;
	IT1=0;
	IE0=0;
	IE1=1;
	EA =1;
	EX0=1;
	EX1=1;
}

void main ()				//主函数
{
	EXINT_init();
	P0M0=0XFF;
	P0M1=0X00;
	while(1)
	 {
	    if (K1==0)			//按键1判断
		{
			 Delay10ms();   //延时
			 if (K1==0)
			{	
				for(h=0;h<500;h++)//for 循环500次,发送500个脉冲
					{
					maichong=0;           
					Delay400us();      
					maichong=1;            
					Delay400us();
					}  
			}		
		}	 
		if (K2==0)			//判断按键2
			{
			 Delay10ms();  //延时
			 if (K2==0)
				{
				zhuang=~zhuang;		//引脚状态取反
				while(K2==0);		//判断是否松开按键
					
				}
				
			}
	if(K3==0)
	{
		if(K3==0)
		{
			P1=0X00;
		}
	}
	else{
		P1=0Xff;
	}
	}
}
/**CSDN博墨**************************************/
/********CSDN博墨********************************/
/****************CSDN博墨************************/
/*************************CSDN博墨***************/
/**********************************CSDN博墨******/

4.实物演示视频

51单片机驱动器控制步进电机

以上是之前程序调试完的视频,文章中如果有错误的地方,欢迎各位大佬指正。

  • 21
    点赞
  • 216
    收藏
    觉得还不错? 一键收藏
  • 46
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 46
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值