51单片机控制步进电机:使用驱动器实现精准操作

文章目录

  • 51单片机驱动器控制步进电机
  • 文章简介
  • 1.驱动器简介
  • 2.驱动器和单片机接线方法
  • 3.单片机程序
  • 4.实物演示视频
  • 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单片机驱动器控制步进电机

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

    物联沃分享整理
    物联沃-IOTWORD物联网 » 51单片机控制步进电机:使用驱动器实现精准操作

    发表评论