基于STC89C51和L298N的42步进电机控制

    步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。步进电机必须由双环形脉冲信号、功率驱动电路等组成控制系统方可使用。

    技术指标:

    (1)、相数-----------电机内部的线圈组数。电机相数不同,一般二相电机的步距角为0.9°/1.8°。

    (2)、步距角--------表示控制系统每发一个步进脉冲信号,电机所转动的角度。二相四线步进电机步距角为0.9°/1.8°(表示 半步工作时为0.9°、整步工作时为1.8°),这个步距角称为“电机固有步距角”。

    (3)、拍数-----------完成一个 磁场周期性变化所需要脉冲数或导电状态。

 

    工作原理:

        两相四线步进电机以8拍方式工作,则每个脉冲旋转0.9°,即每旋转一圈需要400个脉冲信号来励磁。步进电机的正、反转由励磁脉冲产生的顺序来控制,它的控制等效电路如图所示:

基于STC89C51和L298N的42步进电机控制_第1张图片

    它有4条励磁信号引线1,2,3,4分别代表A,-A, B, -B。通过控制这4条引线上励磁脉冲产生的时刻,即可控制步进电机的转动。每出现一个脉冲信号,步进电机只走一步。因此,只要依序不断送出脉冲信号,步进电机就能实现连续转动。

    一-二相励磁-----为一相励磁与二相励磁交替导通的方式。每送一个励磁信号,步进电机旋转0.9°。

励磁顺序表:

   STEP              A            -A           B               -B

    1                    1            0            0                0

    2                    1            0            1                0

    3                    0            0            1                0

    4                    0            1            1                0

    5                    0            1            0                0

    6                    0            1            0                1

    7                    0            0            0                1

    8                    1            0            0                1

基于STC89C51和L298N的42步进电机控制_第2张图片

 

L298N引脚图:

基于STC89C51和L298N的42步进电机控制_第3张图片

逻辑输入IN1~IN4分别与单片机的控制引脚相连,输出A和输出B(OUT1~OUT4)分别与电机的A、-A、B、-B相连。

12V供电和GND使用稳压电源(可以电源适配器6-12V,我使用的是8.2V)。

注意:同时GND还要与单片机的GND相连接,这样才能控制。

最后STC89C51的步进电机控制代码代码:

其中IN1~IN4分别与P1.0~P1.3口连接。使用定时器T0实现准确延时。

//*********************************************
//Developer:Saber
//Project:Motor Control
//Time:2018/4/18
//*********************************************
#include 
#define uchar unsigned char
#define uint unsigned int

static unsigned int count;
static unsigned int endcount;
//八拍驱动方式正转表 A-B- --> B- --> B-A --> A --> AB --> B
// --> BA- --> A- --> A-B-
uchar upstep8_table[]={0x05,0x01,0x09,0x08,0x0A,0x02,0x06,0x04};

//四拍驱动方式正转表 A --> B --> A- --> B-
uchar upstep4_table[]={0x08,0x02,0x06,0x01};

void delay(uint ims);               //变量延时函数
void Interrupt0_Init();				//中断0初始化
void MotorSpeedOrDirection(uint var, uchar state);        //控制电机转速和方向
void ConStep(uchar var);			//步进控制器
void MotorStop(void);    			//停止

void main()
{
	unsigned int sum=0;

	P1 = 0x00;
	count = 0;
	Interrupt0_Init();
	while(1)
	{
		MotorSpeedOrDirection(1, 0);
	}
}


//******************************
//		步进电机停止函数
//作用:停止
//******************************
void MotorStop(void)
{
	P1 = 0x00;
}


//******************************
//		外部中断0初始化函数
//作用:初始化外部中断
//******************************
void Interrupt0_Init()
{
	EA = 1;
	TMOD = 0x11;
	ET0 = 1;

//	TH0=0xFF;
//	TL0=0x28;
	TH0=(65536-1000)/256;
	TL0=(65536-1000)%256;

	TR0=1;
}


//******************************
//		中断处理函数
//作用:定时器0的中断处理
//******************************
void timeint(void) interrupt 1
{
//	TH0=0xFF;
//	TL0=0x28;   //216----234us
//  定时器定时1ms
	TH0=(65536-1000)/256;
	TL0=(65536-1000)%256;

	count++;
}


//******************************
//
//延时i ms
//******************************
void delay(uint ims)
{
	endcount=ims;
	count=0;
	do{}while(count0; --i)
		{
			P1=upstep8_table[i];
			delay(var);
		}
	}
}


//******************************
//		步进控制函数
//作用:通过变量var控制旋转圈速
//******************************
void ConStep(uchar var)
{
	uchar i=0,j=0,m=0,k=0;
	while(k++=8)             //每8次一个循环
					j=0;
				delay(1);
			}
		}
	}
}

 

你可能感兴趣的:(步进电机)