4相5线步进电机驱动原理

本文详细介绍了步进电机的工作原理,强调了其在非超载情况下的速度和位置控制特性。同时,给出了一个针对28BYJ48减速步进电机的C语言驱动程序,包括正反转、速度控制和停止功能。程序中定义了电机的引脚、速度常量和转向常量,并通过切换不同相位实现电机转动。此外,还提醒了在停止时需将所有相位设为高电平以避免电机发热。
摘要由CSDN通过智能技术生成

1 步进电机驱动原理

4相5线步进电机
步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点。使得在速度、位置等控制领域用步进电机来控制变的非常的简单。
步进电机的主要特性:
1、 步进电机必须加驱动才可以运转, 驱动信号必须为脉冲信号,没有脉冲的时候,步进电机静止, 如果加入适当的脉冲信号, 就会以一定的角度(称为步角)转动。转动的速度和脉冲的频率成正比。
2、 黑金刚配套的是 28BYJ48 5V 驱动的 4 相 5 线的步进电机,而且是减速步进电机,减速比为 1:64,步进角为 5.625/64 度。如果需要转动 1 圈,那么需要360/5.625*64=4096 个脉冲信号。
3、 步进电机具有瞬间启动和急速停止的优越特性。
4、 改变脉冲的顺序, 可以方便的改变转动的方向。
在这里插入图片描述
步进电机公共端为高电平,各个相位给低电平则有电流通过产生磁场驱动电机转动。
注意 使用ULN2003作为驱动时,其具有电平反向功能

2 程序编写

#define STEP_MOTOR_A_PIN          P12     /*橙色*/
#define STEP_MOTOR_B_PIN          P13     /*黄色*/
#define STEP_MOTOR_C_PIN          P14     /*粉色*/
#define STEP_MOTOR_D_PIN          P15     /*蓝色*/

#define STEP_MOTOR_SPEED          2

#define STEP_MOTOR_DIRE_FOREWARD  1     /*步进电机正向转:顺时针*/
#define STEP_MOTOR_DIRE_ROLLBACK  2     /*步进电机正向转:逆时针*/

static uint8 MotorStepCount = 0;

/*函数声明*/
static void step_motor_a_output(void);
static void step_motor_ab_output(void);
static void step_motor_b_output(void);
static void step_motor_bc_output(void);
static void step_motor_c_output(void);
static void step_motor_cd_output(void);
static void step_motor_d_output(void);
static void step_motor_da_output(void);
static void step_motor_foreward_output(uint8 step);
static void step_motor_rollback_output(uint8 step);
static void step_motor_foreward(uint8 speed);
static void step_motor_rollback(uint8 speed);
//========================================================================
// 简述: 步进电机驱动
// 参数: dire:步进电机方向   speed:步进电机转速
// 返回: 无
// 详述: 
//========================================================================
void step_motor_drive(uint8 dire,uint8 speed)
{
   switch(dire)
	 {
		 case STEP_MOTOR_DIRE_FOREWARD:
		 {
			  step_motor_foreward(speed);
		    break;
		 }
		 case STEP_MOTOR_DIRE_ROLLBACK:
		 {
			  step_motor_rollback(speed);
		    break;
		 }
		 default:
			  break;
	 }
}

//========================================================================
// 简述: 步进电机停止
// 参数: 无
// 返回: 无
// 详述: (ULN2003有反向功能)
//========================================================================
void step_motor_stop(void)
{
	STEP_MOTOR_A_PIN = 0;
	STEP_MOTOR_B_PIN = 0;
	STEP_MOTOR_C_PIN = 0;
	STEP_MOTOR_D_PIN = 0;
}

//========================================================================
// 简述: 步进电机正转
// 参数: 无
// 返回: 无
// 详述: 顺时针转
//========================================================================
static void step_motor_foreward(uint8 speed)
{ 
	 if((MotorStepCount++) > 7) MotorStepCount = 0;
   step_motor_foreward_output(MotorStepCount);
	 delay_ms(speed);
}

//========================================================================
// 简述: 步进电机反转
// 参数: 无
// 返回: 无
// 详述: 逆时针转
//========================================================================
static void step_motor_rollback(uint8 speed)
{
	 if((MotorStepCount++) > 7) MotorStepCount = 0;
   step_motor_rollback_output(MotorStepCount);
	 delay_ms(speed);
}

//========================================================================
// 简述: 步进电机正向输出
// 参数: 无
// 返回: 无
// 详述: 
//========================================================================
static void step_motor_foreward_output(uint8 step)
{
   switch(step)
	 {
		 case 0:
		 {
			  step_motor_a_output();
		    break;
		 }
		 case 1:
		 {
			  step_motor_ab_output();
		    break;
		 }
		 case 2:
		 {
			  step_motor_b_output();
		    break;
		 }
		 case 3:
		 {
			  step_motor_bc_output();
		    break;
		 }
		 case 4:
		 {
			  step_motor_c_output();
		    break;
		 }
		 case 5:
		 {
			  step_motor_cd_output();
		    break;
		 }
		 case 6:
		 {
			  step_motor_d_output();
		    break;
		 }
		 case 7:
		 {
			  step_motor_da_output();
		    break;
		 }
		 default:
			  break;
	 }
}

//========================================================================
// 简述: 步进电机反向输出
// 参数: 无
// 返回: 无
// 详述: 
//========================================================================
static void step_motor_rollback_output(uint8 step)
{
   switch(step)
	 {
		 case 0:
		 {
			  step_motor_a_output();
		    break;
		 }
		 case 1:
		 {
			  step_motor_da_output();
		    break;
		 }
		 case 2:
		 {
			  step_motor_d_output();
		    break;
		 }
		 case 3:
		 {
			  step_motor_cd_output();
		    break;
		 }
		 case 4:
		 {
			  step_motor_c_output();
		    break;
		 }
		 case 5:
		 {
			  step_motor_bc_output();
		    break;
		 }
		 case 6:
		 {
			  step_motor_b_output();
		    break;
		 }
		 case 7:
		 {
			  step_motor_ab_output();
		    break;
		 }
		 default:
			  break;
	 }
}

//========================================================================
// 简述: 步进电机引脚控制
// 参数: 无
// 返回: 无
// 详述: 步进电机A相输出(ULN2003有反向功能)
//========================================================================
static void step_motor_a_output(void)
{
	STEP_MOTOR_A_PIN = 1;
	STEP_MOTOR_B_PIN = 0;
	STEP_MOTOR_C_PIN = 0;
	STEP_MOTOR_D_PIN = 0;
}

//========================================================================
// 简述: 步进电机引脚控制
// 参数: 无
// 返回: 无
// 详述: 步进电机AB相输出(ULN2003有反向功能)
//========================================================================
static void step_motor_ab_output(void)
{
	STEP_MOTOR_A_PIN = 1;
	STEP_MOTOR_B_PIN = 1;
	STEP_MOTOR_C_PIN = 0;
	STEP_MOTOR_D_PIN = 0;
}

//========================================================================
// 简述: 步进电机引脚控制
// 参数: 无
// 返回: 无
// 详述: 步进电机B相输出(ULN2003有反向功能)
//========================================================================
static void step_motor_b_output(void)
{
	STEP_MOTOR_A_PIN = 0;
	STEP_MOTOR_B_PIN = 1;
	STEP_MOTOR_C_PIN = 0;
	STEP_MOTOR_D_PIN = 0;
}

//========================================================================
// 简述: 步进电机引脚控制
// 参数: 无
// 返回: 无
// 详述: 步进电机BC相输出(ULN2003有反向功能)
//========================================================================
static void step_motor_bc_output(void)
{
	STEP_MOTOR_A_PIN = 0;
	STEP_MOTOR_B_PIN = 1;
	STEP_MOTOR_C_PIN = 1;
	STEP_MOTOR_D_PIN = 0;
}
//========================================================================
// 简述: 步进电机引脚控制
// 参数: 无
// 返回: 无
// 详述: 步进电机C相输出(ULN2003有反向功能)
//========================================================================
static void step_motor_c_output(void)
{
	STEP_MOTOR_A_PIN = 0;
	STEP_MOTOR_B_PIN = 0;
	STEP_MOTOR_C_PIN = 1;
	STEP_MOTOR_D_PIN = 0;
}

//========================================================================
// 简述: 步进电机引脚控制
// 参数: 无
// 返回: 无
// 详述: 步进电机CD相输出(ULN2003有反向功能)
//========================================================================
static void step_motor_cd_output(void)
{
	STEP_MOTOR_A_PIN = 0;
	STEP_MOTOR_B_PIN = 0;
	STEP_MOTOR_C_PIN = 1;
	STEP_MOTOR_D_PIN = 1;
}

//========================================================================
// 简述: 步进电机引脚控制
// 参数: 无
// 返回: 无
// 详述: 步进电机D相输出(ULN2003有反向功能)
//========================================================================
static void step_motor_d_output(void)
{
	STEP_MOTOR_A_PIN = 0;
	STEP_MOTOR_B_PIN = 0;
	STEP_MOTOR_C_PIN = 0;
	STEP_MOTOR_D_PIN = 1;
}

//========================================================================
// 简述: 步进电机引脚控制
// 参数: 无
// 返回: 无
// 详述: 步进电机DA相输出(ULN2003有反向功能)
//========================================================================
static void step_motor_da_output(void)
{
	STEP_MOTOR_A_PIN = 1;
	STEP_MOTOR_B_PIN = 0;
	STEP_MOTOR_C_PIN = 0;
	STEP_MOTOR_D_PIN = 1;
}

3 注意事项

  1. 步进电机停止后需要使四个相位引脚都为高电平,否则步进电机会发热。因为不进电机公共端为高电平,所有引脚都为高电平就不会产生电流,就不会发热。
//========================================================================
// 简述: 步进电机停止
// 参数: 无
// 返回: 无
// 详述: (ULN2003有反向功能)
//========================================================================
void step_motor_stop(void)
{
	STEP_MOTOR_A_PIN = 0;
	STEP_MOTOR_B_PIN = 0;
	STEP_MOTOR_C_PIN = 0;
	STEP_MOTOR_D_PIN = 0;
}
  1. 步进电机电源端电流较小时,其扭矩也会变小

4 接线方式

IN1 —> STEP_MOTOR_A_PIN
IN2 —> STEP_MOTOR_B_PIN
IN3 —> STEP_MOTOR_C_PIN
IN4 —> STEP_MOTOR_D_PIN

5 检查四根引脚有没有正确输出

  1. 使用逻辑分析仪检测(注意这里直接连接MCU引脚,所以电平是高电平,经过ULN2003后,电平会反向)
    在这里插入图片描述
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值