小言_互联网的博客

51单片机控制二相四线步进电机

299人阅读  评论(0)

步进电机按定子上绕组来分,有二相、三相和五相等系列。最受欢迎的是两相混合式步进电机,约占97%以上的市场份额,其原因是性价比高,配上细分驱动器后效果良好。该种电机的基本步距角为1.8°/步,配上半步驱动器后,步距角减少为0.9°,配上细分驱动器后其步距角可细分达256倍(0.007°/微步)。由于摩擦力和制造精度等原因,实际控制精度略低。同一步进电机可配不同细分的驱动器以改变精度和效果。
此篇文档以二相四线制步进电机演示
一、 效果演示

二、 单片机程序
写程序之前,先把前提工作做好了,本次用的是STC89C52RC芯片(用别的也行,改一下头文件),keil软件和烧写软件以及主板驱动CH340程序。
程序解读:
A:
1.0引脚是脉冲引脚
1.1引脚是使能引脚
1.2引脚是方向引脚
2.0引脚控制电机正转
2.1引脚控制电机反转
2.2引脚控制电机加速
2.3引脚控制电机减速
2.4引脚控制电机停止
2.5引脚控制电机步距角加
2.6引脚控制电机步距角减
2.7引脚控制电机以一定步距角转动

sbit CLK  = P1^0;
sbit ENA  = P1^1; 
sbit DIR  = P1^2;		   

sbit P_TS  = P2^0;	      
sbit N_TS  = P2^1;		  
sbit P_ADJ = P2^2;         
sbit N_ADJ = P2^3;         
sbit StopStart  = P2^4;	   
sbit P_Step = P2^5;
sbit N_Step = P2^6;
sbit SS_Step = P2^7;

B:
初始化电机;调用定时器,初始化定时器;调用键控扫描程序

void main()
{
   
	ENA=1;
	CLK=0;
	DIR=0;		   
	Init_time();   
	while(1)
	{
   
		Key_scan();
	}	
}

C:
初始化定时器,给T0装初值,打开中断

void main()
{
   
	ENA=1;
	CLK=0;
	DIR=0;		   
	Init_time();   
	while(1)
	{
   
		Key_scan();
	}	
}

D:
进入定时器中断

void Enter_Timer0() interrupt 1			
{
   
	TH0=(65536-CYCLE)/256; 
	TL0=(65536-CYCLE)%256;
	CLK=~CLK;
	PWM_count++;
	if(PWM_count==(2*cy_count)&&CY_status)
	{
   
		PWM_count=0;
		TR0=0;
		ENA=0;
	}	
}

E:
控制步进电机正反转,以一定步距角转动,调速,调脉冲

void Key_scan()				   	   
{
   
	static char i=0,j=0;
	if(P_TS==0)					   
	{
   
		
		if(P_TS==0)
		{
   
			while(!P_TS);			   
			DIR=1;
		}
	}
	if(N_TS==0)					   
	{
   
		
		if(N_TS==0)
		{
   
			while(!N_TS);			   
			DIR=0;
		}
	}
	if(P_ADJ==0)				 
	{
   
			
		if(P_ADJ==0)
	    {
   
			while(!P_ADJ);
			i--;
			if(i<1)
			i=0;
			CYCLE=Tspeed[i];		
		}
	}
	if(N_ADJ==0)				  
	{
   
		
		if(N_ADJ==0)
		{
   
			while(!N_ADJ);
			i++;
			if(i>2)
			i=2;
			CYCLE=Tspeed[i];
		}
	}
	if(StopStart==0)
	{
   
		
		if(StopStart==0)
		{
   
			while(!StopStart);
			Run_Status=~Run_Status;
			if(Run_Status)
			{
   
				ENA=1;		  
				TR0=1;		 
			}
			else
			{
   
				ENA=0;		  
				TR0=0;		  
				CY_status=0;  
			}
		}
	}
	if(P_Step==0)
	{
   
		
		if(P_Step==0)		  
		{
   
			while(!P_Step);
			j++;
			if(j>3)
			j=3;
			Step(StepAngle[j]);			
		}
	}
	if(N_Step==0)			 
	{
   
	
		if(N_Step==0)
		{
   
			while(!N_Step);
			j--;
			if(j<1)
			j=0;
			Step(StepAngle[j]);			
		}
	}
	if(SS_Step==0)   
	{
   
		
		if(SS_Step==0)
		{
   
			while(!SS_Step);
			Step(StepAngle[j]);
		}
	}
}

F:
角度控制

void Step(unsigned int step_count)
{
   
	PWM_count=0;
	CY_status=1;
	cy_count=step_count;
	ENA=1;
	TR0=1;
}

单片机程序下载:
链接: https://pan.baidu.com/s/1uCTHYBnQcke1_4By6ps_WA
提取码:zplc
三、 实物接线

接线图如图所示
驱动器可采用共阳极接法或共阴极接法,但在这里我们选择共阳极接法
因为驱动器的接口是光驱动的,而选择共阴接法的话,就意味着我们得靠单片机I/0口的电流来驱动里面的发光二极管,我们都知道单片机I/O口的驱动能力非常小,查看手册可知I/O口的拉电流只有几uA根本不足以驱动发光二极管,共阳极接法的灌电流可达15mA,此时足以驱动发光二极管,这就是为什么要选择共阳接法。
Ps:拉电流是逻辑门输出为高电平时的负载电流。
外部电流通过芯片引脚向芯片内‘流入’称为灌电流
实物接线图:

细分:
就是驱动器的6个拨码,它提高了步进电机转角精度和运行平稳性。
不过细分怎么调呢?
下图是细分的调节方式,可以按照自己的需求响应的调整,具体可以参照步进电机驱动器说明书

说明书详情网站:
https://wenku.baidu.com/view/4e003934dcccda38376baf1ffc4ffe473368fd26.html

OK,51单片机控制二相四线制步进电机到这里就结束啦,您学废了吗?


转载:https://blog.csdn.net/qq_45156021/article/details/108483824
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场