【Proteus仿真】51单片机+步进电机驱动

本文介绍了如何使用Proteus进行51单片机控制步进电机的仿真,包括步进电机的工作原理、分类、技术参数和动态指标。此外,详细讲解了步进电机的全步、半步、单步驱动模式,并提供了C51代码示例。还提到了特定型号步进电机(28BYJ-48)的特性以及不同驱动模式下的C51代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【Proteus仿真】51单片机+步进电机驱动


  • 🔖Proteus仿真基础实验-步进电机驱动
  • 🌿Proteus8.12平台

📋步进电机简介

步进电机是一种将电脉冲转换为角位移的开环控制元步进电机。一般地,当步进驱动器接收到脉冲信号时,它将根据设定方向(即步进角)驱动步进电机旋转一定角度。 可以通过控制脉冲量来控制角位移量,从而达到精确定位的目的,同时还可以通过控制脉冲频率来控制电机的转速和加速度,从而达到速度控制的目的。

📑步进电机的分类

  • 永磁体(PM):一般为两相,扭矩和体积均较低,步进角为 7.5 度或 15 度.
  • 反应式(VR):一般为三相,可实现大扭矩输出,步进角度一般为 1.5 度,但噪音和振动相当大.
  • 混合式(HB) : 它结合了永磁体和反应的优点,分为两相和五相:两相步进角为 1.8 度,五相步进角一般为 0.72 度。 这种步进电机使用更广泛。

📓相关技术参数

🏳‍🌈步进电机的静态指标
  • 步距角:
    在每次控制系统发出一个步进脉冲信号,某个永磁步进电机的固定角度为3.75°/ 7.5°(半步驱动值为 3.75°,整步驱动为 7.5°)。步进角可以称为“步进电机的固定角度”,它不一定是工作电机的实际角度,实际角度与驱动器有关。
  • 相数:
    它指的是电机内部的线圈组数。 目前,常用的步进电机是两相,三相,四相和五相电机。 电动机的步进角随相数而变化。通常,两相电动机的步进角为 0.9°/ 1.8°,三相为 0.75°/ 1.5°,五相为 0.36°/ 0.72°。 当没有细分驱动器时,用户主要通过选择不同的相数电机来满足步进角的要求。 如果使用细分驱动程序,相位数的“数字”将变得毫无意义,用户只需要更改细分数量的驱动器,然后可以移动步进角度。
  • 拍数:
    它指的是完成磁场周期性变化所需的脉冲数或导通状态,也可以定义为电机转动一定步进角的脉冲数。让我们以四相电机为例,四相和四拍运行模式,即: AB-BC-CD-DA-AB,四相和八拍运行模式为: A - AB - B - BC - C - CD - D - DA - A
🚩步进电机的动态指标
  • 步进脚精度
    它指的是当电动机转动一定步进角时,实际值与理论值之间的误差。 表示为百分比:角度误差/步进角* 100%。 此值随节拍数量的变化而变化,当电机运行 4 次,应该在 5%以内,8 次在 15%以内
  • 失步
    电机运转时运转的步数,不等于理论上的步数。称之为失步。
  • 失调角
    转子齿轴线偏移定子齿轴线的角度,电机运转必存在失调角,由失调角产生的误差,采用细分驱动是不能解决的。
以步进电机28BYJ-48为例,电压为DC5V—DC12V。当对步进电机施加一系列连续不断的控制脉冲时,它可以连续不断地转动。每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度(一个步距角)。当通电状态的改变完成一个循环时,转子转过一个齿距。

在这里插入图片描述
在这里插入图片描述

  • 参数
    直径:28mm
    电压:5 v
    步角:5.625 x 1/64
    减速比:1/64
    定位转矩 >300g.cm
    步进电机的空载功耗低于50mA,配备 64 倍减速器,即64 驱动脉冲。如果外部皮带旋转一圈,由于电机中的减速齿轮为1:64,步进电机主轴需要旋转64 圈。
    输出扭矩很大,因此可以驱动重负载,适用于开发板。注意:该步进电机配备 64 倍减速器,与没有减速器的情况相比,转速较慢。为了便于观察,可以在输出轴上粘贴一块纸板。
  • 📚四相步进电机模块资料
链接: https://pan.baidu.com/s/1I6bRHVkl8Wm_xotres0LDA
提取码: aiwc

🛠步进电机的驱动方式

步进电机的驱动模式也称为激励模式,分为全步激励和半步激励。 前者也可分为单相(单拍驱动)和两相激励(全步驱动); 后者也指一相二相激励(一步驱动)

驱动模式步距角功率优点和缺点
单步5.6251P控制简单,耗电量低,但输出扭矩最小,振动较大,步进时易疏离
全步5.6252P功耗最大,输出扭矩大,振动小,步进稳定
半步2.81251.5P在单驱动和驱动步骤之间采取的性能,只有步进角的一半,运行平稳,应用最为广泛
三种驱动模式的时序表:
  • 半步(八拍)
线序/步距Step1Step2Step3Step4Step5Step6Step7Step8
蓝色/A11000001
粉色/B01110100
黄色/C00011100
橙色/D00000111
  • 单步(单四拍)
线序/步距Step1Step2Step3Step4
蓝色/A1000
粉色/B0100
黄色/C0010
橙色/D0001
  • 全步(双四拍)
线序/步距Step1Step2Step3Step4
蓝色/A1001
粉色/B1100
黄色/C0110
橙色/D0011

📝不同驱动模式C51代码实现

  • 单四拍
/**************************************************************************************
实验现象:	下载程序后,连接好五线四相步进电机,可以观察到电机转动。			
接线说明: 	1:STC89单片机-->五线四相步进电机模块
		    P20-->IN1
				P21-->IN2
				P22-->IN3
				P23-->IN4
			2:五线四相步进电机模块输出-->五线四相步进电机	
			
注意事项: 时钟选择11.0592MHZ																				  
***************************************************************************************/

#include <STC89C5xRC.H>
#include "intrins.h"

#define MAIN_Fosc		11059200L	//定义主时钟
#define  uint32   unsigned long 
#define  uint16   unsigned int  
#define  uint8    unsigned char  
 

#define MOTOR_CLOCKWISE       1   //正转 顺时针转动
#define MOTOR_ANTICLOCKWISE   0   //反转 逆时针转动
#define MOTOR_SPEED           3   //转速
/**********************
引脚别名定义
***********************/
sbit DD=P2^3; 	//电机控制口,连接电机驱动板IN4 				
sbit CC=P2^2;	//电机控制口,连接电机驱动板IN3 	
sbit BB=P2^1;   //电机控制口,连接电机驱动板IN2 
sbit AA=P2^0;   //电机控制口,连接电机驱动板IN1 

/**************************************
功能描述:延时函数
入口参数:uint16 x ,该值为1时,延时1ms
返回值:无
***************************************/
void delay_ms(uint16 x) 
{  
	uint16 j,i;   
	for(j=0;j<x;j++)   
	{    
		for(i=0;i<112;i++);   
	}  
}

/**************************************
功能描述:步进电机驱动函数
入口参数:X表示正反转;Speed表示转速设置
返回值:无
***************************************/
void MotorStep(uint8 X,uint16 Speed)
{
  if(X==1)   //顺时针转动
	{
		DD=0;CC=0;BB=0;AA=1;	
    delay_ms(Speed);  //转速调节

		DD=0;CC=0;BB=1;AA=0;	
    delay_ms(Speed);  //转速调节

		DD=0;CC=1;BB=0;AA=0;	
    delay_ms(Speed);  //转速调节

		DD=1;CC=0;BB=0;AA=0;	
    delay_ms(Speed);  //转速调节
  }
	else       //逆时针转动
	{
		DD=1;CC=0;BB=0;AA=0;	
    delay_ms(Speed);  //转速调节

		DD=0;CC=1;BB=0;AA=0;	
    delay_ms(Speed);  //转速调节

		DD=0;CC=0;BB=1;AA=0;	
    delay_ms(Speed);  //转速调节

		DD=0;CC=0;BB=0;AA=1;	
    delay_ms(Speed);  //转速调节
  }	
}

/**************************************
功能描述:步进电机停止转动
入口参数:无
返回值:无
***************************************/
/*用到时可添加
void MotorStop(void)
{
 DD=0;CC=0;BB=0;AA=0;
}
*/

//主函数
int main()
{	
 	while(1)
 	{
   		//顺时针住。修改输入参数为MOTOR_ANTICLOCKWISE,电机反转。修改MOTOR_SPEED的值即可调整转速
	 	MotorStep(MOTOR_ANTICLOCKWISE,MOTOR_SPEED);    
 	}
}



  • 双四拍
/**************************************************************************************
实验现象:	下载程序后,连接好五线四相步进电机,可以观察到电机转动。
			
接线说明: 	1:STC89单片机-->五线四相步进电机模块
		    	P20-->IN1
				P21-->IN2
				P22-->IN3
				P23-->IN4
			2:五线四相步进电机模块输出-->五线四相步进电机				
注意事项: 时钟选择11.0592MHZ																				  
***************************************************************************************/

#include <STC89C5xRC.H>
#include "intrins.h"

#define MAIN_Fosc		11059200L	//定义主时钟
#define  uint32   unsigned long 
#define  uint16   unsigned int  
#define  uint8    unsigned char  
 

#define MOTOR_CLOCKWISE       1   //正转 顺时针转动
#define MOTOR_ANTICLOCKWISE   0   //反转 逆时针转动
#define MOTOR_SPEED           3   //转速
/**********************
引脚别名定义
***********************/
sbit DD=P2^3; 	//电机控制口,连接电机驱动板IN4 				
sbit CC=P2^2;	//电机控制口,连接电机驱动板IN3 	
sbit BB=P2^1;   //电机控制口,连接电机驱动板IN2 
sbit AA=P2^0;   //电机控制口,连接电机驱动板IN1 

/**************************************
功能描述:延时函数
入口参数:uint16 x ,该值为1时,延时1ms
返回值:无
***************************************/
void delay_ms(uint16 x) 
{  
	uint16 j,i;   
	for(j=0;j<x;j++)   
	{    
		for(i=0;i<112;i++);   
	}  
}

/**************************************
功能描述:步进电机驱动函数
入口参数:X表示正反转;Speed表示转速设置
返回值:无
***************************************/
void MotorStep(uint8 X,uint16 Speed)
{
  if(X==1)   //顺时针转动
	{
		DD=0;CC=0;BB=1;AA=1;	
    delay_ms(Speed);  //转速调节

		DD=0;CC=1;BB=1;AA=0;	
    delay_ms(Speed);  //转速调节

		DD=1;CC=1;BB=0;AA=0;	
    delay_ms(Speed);  //转速调节

		DD=1;CC=0;BB=0;AA=1;	
    delay_ms(Speed);  //转速调节
  }
	else       //逆时针转动
	{
		DD=1;CC=0;BB=0;AA=1;	
    delay_ms(Speed);  //转速调节

		DD=1;CC=1;BB=0;AA=0;	
    delay_ms(Speed);  //转速调节

		DD=0;CC=1;BB=1;AA=0;	
    delay_ms(Speed);  //转速调节

		DD=0;CC=0;BB=1;AA=1;	
    delay_ms(Speed);  //转速调节
  }	
}

/**************************************
功能描述:步进电机停止转动
入口参数:无
返回值:无
***************************************/
/*用到时可添加
void MotorStop(void)
{
 DD=0;CC=0;BB=0;AA=0;
}
*/

//主函数
int main()
{
 	while(1)
 	{
   		//顺时针住。修改输入参数为MOTOR_ANTICLOCKWISE,电机反转。修改MOTOR_SPEED的值即可调整转速
		 MotorStep(MOTOR_ANTICLOCKWISE,MOTOR_SPEED);    
 	}	
}



  • 八拍
/**************************************************************************************
实验现象:	下载程序后,连接好五线四相步进电机,可以观察到电机转动。
			
接线说明: 	1:STC89单片机-->五线四相步进电机模块
		    	P20-->IN1
				P21-->IN2
				P22-->IN3
				P23-->IN4
			2:五线四相步进电机模块输出-->五线四相步进电机
	
			
注意事项: C时钟选择11.0592MHZ																				  
***************************************************************************************/

#include <STC89C5xRC.H>
#include "intrins.h"



#define MAIN_Fosc		11059200L	//定义主时钟
#define  uint32   unsigned long 
#define  uint16   unsigned int  
#define  uint8    unsigned char  
 

#define MOTOR_CLOCKWISE       1   //正转 顺时针转动
#define MOTOR_ANTICLOCKWISE   0   //反转 逆时针转动
#define MOTOR_SPEED           3   //转速
/**********************
引脚别名定义
***********************/
sbit DD=P2^3; 	//电机控制口,连接电机驱动板IN4 				
sbit CC=P2^2;	//电机控制口,连接电机驱动板IN3 	
sbit BB=P2^1;   //电机控制口,连接电机驱动板IN2 
sbit AA=P2^0;   //电机控制口,连接电机驱动板IN1 

/**************************************
功能描述:延时函数
入口参数:uint16 x ,该值为1时,延时1ms
返回值:无
***************************************/
void delay_ms(uint16 x) 
{  
	uint16 j,i;   
	for(j=0;j<x;j++)   
	{    
		for(i=0;i<112;i++);   
	}  
}

/**************************************
功能描述:步进电机驱动函数
入口参数:X表示正反转;Speed表示转速设置
返回值:无
***************************************/
void MotorStep(uint8 X,uint16 Speed)
{
  if(X==1)   //顺时针转动
	{
		DD=0;CC=0;BB=0;AA=1;	
    delay_ms(Speed);  //转速调节

		DD=0;CC=0;BB=1;AA=1;	
    delay_ms(Speed);  //转速调节

		DD=0;CC=0;BB=1;AA=0;	
    delay_ms(Speed);  //转速调节

		DD=0;CC=1;BB=1;AA=0;	
    delay_ms(Speed);  //转速调节
		
		DD=0;CC=1;BB=0;AA=0;	
    delay_ms(Speed);  //转速调节

		DD=1;CC=1;BB=0;AA=0;	
    delay_ms(Speed);  //转速调节

		DD=1;CC=0;BB=0;AA=0;	
    delay_ms(Speed);  //转速调节

		DD=1;CC=0;BB=0;AA=1;	
    delay_ms(Speed);  //转速调节
  }
	else       //逆时针转动
	{
		DD=1;CC=0;BB=0;AA=1;	
    delay_ms(Speed);  //转速调节

		DD=1;CC=0;BB=0;AA=0;	
    delay_ms(Speed);  //转速调节

		DD=1;CC=1;BB=0;AA=0;	
    delay_ms(Speed);  //转速调节

		DD=0;CC=1;BB=0;AA=0;	
    delay_ms(Speed);  //转速调节
		
		DD=0;CC=1;BB=1;AA=0;	
    delay_ms(Speed);  //转速调节

		DD=0;CC=0;BB=1;AA=0;	
    delay_ms(Speed);  //转速调节

		DD=0;CC=0;BB=1;AA=1;	
    delay_ms(Speed);  //转速调节

		DD=0;CC=0;BB=0;AA=1;	
    delay_ms(Speed);  //转速调节
  }	
}

/**************************************
功能描述:步进电机停止转动
入口参数:无
返回值:无
***************************************/
/*用到时可添加
void MotorStop(void)
{
 DD=0;CC=0;BB=0;AA=0;
}
*/

//主函数
int main()
{

 	while(1)
 	{
   		//顺时针住。修改输入参数为MOTOR_ANTICLOCKWISE,电机反转。修改MOTOR_SPEED的值即可调整转速
	 	MotorStep(MOTOR_ANTICLOCKWISE,MOTOR_SPEED);    
 	}
}



  • 📚Proteus仿真文件

✨不包含代码工程,自行将上面的代码拷贝到新建工程中编译即可。


链接: https://pan.baidu.com/s/1KB-xVrwADAT3JDsTQ1Mf0A
提取码: vj47
<think>嗯,用户想了解关于51步进电机驱动器的代码。首先,我需要明确用户的需求。他们可能是在使用基于8051单片机的项目,需要控制步进电机。可能的应用场景包括机器人、CNC机床或者自动化设备。用户可能已经有一定的电子基础,但对如何编写控制代码还不熟悉。 接下来,我需要考虑51单片机的特性,比如IO口配置、延时函数的使用,以及步进电机的基本驱动原理。步进电机通常有四种励磁方式:单相、双相、半拍和微步,但最常用的是双相和半拍。用户可能需要知道如何实现这些励磁方式的代码。 然后,硬件连接部分也很重要。步进电机驱动器通常需要ULN2003这样的驱动芯片,因为单片机IO口的电流不足以直接驱动电机。需要确认用户是否了解硬件连接,或者是否需要先解释这部分内容。 代码部分,需要展示如何通过IO口输出不同的脉冲序列来控制电机转动。同时,延时函数的调整会影响电机的转速,这也是需要注意的地方。可能还需要提到如何控制转向,比如改变脉冲的顺序。 另外,用户可能遇到的问题,比如电机不转、抖动或发热,这些常见问题也需要在回答中给出解决方法,以帮助用户调试。 最后,确保代码示例正确,符合51单片机的编程规范,比如使用Keil C的语法,端口定义正确,以及延时函数的实现。同时,提醒用户根据实际硬件调整端口和延时时间,保证代码的可移植性和实用性。</think>以下是基于51单片机步进电机驱动代码开发要点解析: 一、硬件基础 1. 典型接线方案: P0口连接ULN2003驱动芯片 ULN2003输出端连接步进电机四相线 VCC需根据电机规格选择(常用5V/12V) 二、代码核心逻辑 1. 四相八拍驱动示例(顺时针): ```c unsigned char code PhaseTable[8] = { 0x08, // 0000 1000 (A相) 0x0C, // 0000 1100 (A+B相) 0x04, // 0000 0100 (B相) 0x06, // 0000 0110 (B+C相) 0x02, // 0000 0010 (C相) 0x03, // 0000 0011 (C+D相) 0x01, // 0000 0001 (D相) 0x09 // 0000 1001 (D+A相) }; void StepMotor_Run(uint16_t steps, uint8_t direction) { static uint8_t index = 0; while(steps--) { if(direction) index = (index+1)%8; // 正转 else index = (index+7)%8; // 反转 P0 = PhaseTable[index]; delay_ms(2); // 调整延时控制转速 } P0 = 0x00; // 停止供电 } ``` 三、关键参数调节 1. 转速控制: 通过调整延时时间改变脉冲频率 $$ \text{转速}(rpm) = \frac{60 \times \text{脉冲频率}(Hz)}{ \text{步数/转} \times \text{驱动模式系数} } $$ 例:200步电机使用四相八拍模式时,系数为8 2. 细分驱动实现: 通过PWM调制实现微步控制 需配合支持细分的驱动芯片(如TMC2208) 四、常见问题处理 1. 电机抖动不转: - 检查供电电压是否达标 - 确认相序是否正确 - 增加加速曲线(梯形/S型) 2. 发热异常: - 降低驱动电流(通过驱动器拨码) - 启用自动半流模式 建议开发步骤: 1. 先用万用表验证线圈导通性 2. 使用示波器观察输出波形 3. 从低速(>100ms/步)开始测试 4. 逐步优化控制算法 完整工程应包含: - 加减速算法 - 限位开关检测 - 过流保护机制 - 串口指令解析模块 实际开发时需根据具体驱动器手册调整时序参数,不同型号的脉冲响应时间可能存在差异。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值