您现在的位置是:首页 >技术杂谈 >【Proteus仿真】51单片机+步进电机驱动网站首页技术杂谈
【Proteus仿真】51单片机+步进电机驱动
简介【Proteus仿真】51单片机+步进电机驱动
【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.625 | 1P | 控制简单,耗电量低,但输出扭矩最小,振动较大,步进时易疏离 |
全步 | 5.625 | 2P | 功耗最大,输出扭矩大,振动小,步进稳定 |
半步 | 2.8125 | 1.5P | 在单驱动和驱动步骤之间采取的性能,只有步进角的一半,运行平稳,应用最为广泛 |
三种驱动模式的时序表:
- 半步(八拍)
线序/步距 | Step1 | Step2 | Step3 | Step4 | Step5 | Step6 | Step7 | Step8 |
---|---|---|---|---|---|---|---|---|
蓝色/A | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 |
粉色/B | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 0 |
黄色/C | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 |
橙色/D | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
- 单步(单四拍)
线序/步距 | Step1 | Step2 | Step3 | Step4 |
---|---|---|---|---|
蓝色/A | 1 | 0 | 0 | 0 |
粉色/B | 0 | 1 | 0 | 0 |
黄色/C | 0 | 0 | 1 | 0 |
橙色/D | 0 | 0 | 0 | 1 |
- 全步(双四拍)
线序/步距 | Step1 | Step2 | Step3 | Step4 |
---|---|---|---|---|
蓝色/A | 1 | 0 | 0 | 1 |
粉色/B | 1 | 1 | 0 | 0 |
黄色/C | 0 | 1 | 1 | 0 |
橙色/D | 0 | 0 | 1 | 1 |
?不同驱动模式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
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。