【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:
提取码: 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代码实现
# 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 ;
sbit CC= P2^ 2 ;
sbit BB= P2^ 1 ;
sbit AA= P2^ 0 ;
void delay_ms ( uint16 x)
{
uint16 j, i;
for ( j= 0 ; j< x; j++ )
{
for ( i= 0 ; i< 112 ; i++ ) ;
}
}
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) ;
}
}
int main ( )
{
while ( 1 )
{
MotorStep ( MOTOR_ANTICLOCKWISE, MOTOR_SPEED) ;
}
}
# 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 ;
sbit CC= P2^ 2 ;
sbit BB= P2^ 1 ;
sbit AA= P2^ 0 ;
void delay_ms ( uint16 x)
{
uint16 j, i;
for ( j= 0 ; j< x; j++ )
{
for ( i= 0 ; i< 112 ; i++ ) ;
}
}
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) ;
}
}
int main ( )
{
while ( 1 )
{
MotorStep ( MOTOR_ANTICLOCKWISE, MOTOR_SPEED) ;
}
}
# 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 ;
sbit CC= P2^ 2 ;
sbit BB= P2^ 1 ;
sbit AA= P2^ 0 ;
void delay_ms ( uint16 x)
{
uint16 j, i;
for ( j= 0 ; j< x; j++ )
{
for ( i= 0 ; i< 112 ; i++ ) ;
}
}
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) ;
}
}
int main ( )
{
while ( 1 )
{
MotorStep ( MOTOR_ANTICLOCKWISE, MOTOR_SPEED) ;
}
}
✨不包含代码工程,自行将上面的代码拷贝到新建工程中编译即可。
链接: https:
提取码: vj47