28BYJ-48步进电机连续正反转 的控制 [李园7舍_404]

1 硬件

步进电机:28BYJ-48

步进电机驱动:ULN2803

单片机:STC89C52

 

2 步进电机原理、驱动原理

2.128BYJ-48步进电机实物图

28BYJ-48步进电机连续正反转 的控制 [李园7舍_404]_第1张图片

 

图1  28BYJ-48步进电机实物图

我给它缠了一圈胶布。

一般电动机都是连续旋转,但步进电机是一步一步转动的。每输入一个脉冲信号,电动机就转过一个固定的角度(步矩脚),步进电机是一种将电脉冲转化为角位移的执行机构。可以通过脉冲个数来控制角位移量,从而达到准确定位的目的,而且可以通过控制脉冲频率来控制电机转动的速度和加速度。步进电机作为一种控制用的特种电机,其没有积累误差。

 

以下步进电机非介绍128BYJ-48步进电机内部结构图及其工作方式,但是工作原理是一样的。摘自于书本。

 

2.2步进电机工作原理 ( 摘自书本 )

28BYJ-48步进电机连续正反转 的控制 [李园7舍_404]_第2张图片

 

图2 反应式步进电机结构示意图

步进电机的转子为多级分布,定子上嵌有多相星型连接的控制绕组,由专门电源输入脉冲信号,每输入一个脉冲,步进电机的转子就进步一步。

反应式步进电机有均匀分布的6个磁极,磁极上绕有绕组。两个相对的磁极组成一组(如图2所示),如果让每组磁极上的绕组按一定规律通电,就可形成步进的旋转磁场,使转子转动。

 

2.3基本工作方式( 摘自书本 )

28BYJ-48步进电机连续正反转 的控制 [李园7舍_404]_第3张图片

 

图3  A相通电

 

如上图,是步进电机实物图对应的内部结构图。假设A相先通电(B,C两相不通电),产生A-A’轴线方向的磁通,并通过转子形成闭合回路。这时AA’极就成为电磁铁的NS极。在磁场作用下,转子要转到转子的齿对齐AA’极的位置(如图3);然后只有B相通电时,步进电机以相同的方式让转子转动到B-B’极位置,只有C相通电时,步进电机以相同的方式让转子转到C-C’极位置。

根据以上步进电机工作原理,我想到:无论以这种单三拍(A-->B-->C-->A…)的通电方式,还是以六拍(A-->AB—>B-->BC—>C-->CA-->A…)通电方式,还是四相步进电机八拍的工作方式,如果当用脉冲控制电机的转子转到了某个位置,而此时需要电机反转的话就恰好需要从步进电机的上一个脉冲开始倒退回去相继给予对应的脉冲

 

 

3  28BYJ-48步进电机连续正反转控制例子

3.1ULN2803电机驱动

28BYJ-48步进电机连续正反转 的控制 [李园7舍_404]_第4张图片

 

图4  28BYJ-48步进电机驱动ULN2803

 

电机驱动ULN2803的作用是将控制电机的脉冲信号放大。除此之外,由图4可以看出,此驱动芯片还对每个输入信号取反,所以到达对应的电机引脚之上的信号也是经过取反了的。

 

3.2程序例子

采用八拍的方式控制控制28BYJ-48步进电机。即28BYJ-48步进电机正转的脉冲编码为:

 

unsigned char  code FFW[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6};

让这个编码构成一个循环序列就可以使步进电机连续正转。则28BYJ-48步进电机反转的脉冲编码刚好是正转编码的逆序。从步进电机的工作方式得出的结论可知,若使步进电机的正转的当前脉冲为FFW[ i ],其中0 <= i <= 8.如果由于某种原因,此时的电机需要立即反转,则步进电机对应的下一个脉冲应该为FFW[ i – 1 ],并且如果需要连续反转则需要以从FFW[ i – 1 ]开始的逆序脉冲来构成循环序列供电机连续反转。同时,条件再次变化需要步进电机正转时,此时的供电机正转的脉冲应为FFW[ i + 1 ]。

代码笔记如下:

//电机转动
void motor_nagtive_tranlate_test()
{
	unsigned char code plus[]={ 0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6 };
	static index = 0;

	if( translate > 0 ){
		if( index == LOOP -1 ){
			index	= -1;
		}
		index++;
		P1	= plus[index];
		delay_ms( MOTOR_DELAY );		
		
	}else if( translate <= 0 ){
		if( index <= 0 ){
			index	= LOOP;
		}
		index--;
		P1	= plus[index];
		
		delay_ms( MOTOR_DELAY );

	}

}

 

程序中,translate就是控制电机正转和反转的条件,当translate大于0时,电机正转,当translate小于0时,电机反转。在送给电机脉冲信号后,需要用delay_ms来延迟一会儿,让电机充分接收并达到期望的电平信号。为了实现电机在正(反)转后能够基于translate条件的变化后能正常的进行反(正)转,程序首先实现了能够让电机正转、反转的脉冲循环脉冲序列,LOOP的值为8,脉冲信号的维数也刚好为8。脉冲信号的下标索引index的初值为-1.这么设置的目的是为了形成步进电机正、反转的脉冲序列(如果电机只单是正转和反转,也有这样的脉冲满足条件),在步进电机正(反)转的某个状态下正常的切换到步进电机的反(正)转状态之上(步进电机正转状态下需要反转时,从上一个脉冲编码信号开始进入步进电机反转的脉冲编码信号循环序列,从而控制步进电机反转;步进电机反转状态下需要正转时,从下一个脉冲编码信号开始进入步进电机正转转的脉冲编码信号循环序列,从而控制步进电机正转)。

 

此次笔记记录完毕。

你可能感兴趣的:(碚大)