51单片机-步进电机
步进电机又分为 单极性的步进电机和双极性的步进电机。
静态技术指标
- 相数:产生不同对极N、S磁场的激磁线圈对数,也可以理解为步进电机204中线圈的组数,其中两相步进电机步距角为1.8°,三相的步进电机步距角为1.5°,
相数越多的步进电机,其步距角就越小。 - 拍数:完成一个磁场周期性变化所需脉冲数或导电状态用n表示,或指电机转过一个齿距角所需脉冲数,以四相电机为例,有四相四拍运行方式即
AB-BC-CD-DA-AB,四相八拍运行方式即A-AB-B-BC-C-CD-D-DA-A - 步距角:一个脉冲信号所对应的电机转动的角度,可以简单理解为一个脉冲信号驱动的角度,电机上都有写,一般42步进电机的步距角为1.8°•定位转矩:电机在不通电状态下,电机转子自身的锁定力矩(由磁场齿形的谐波以及机械误差造成的)。
- 静转矩:电机在额定静态电压作用下,电机不作旋转运动时,电机转轴的锁定力矩。此力矩是衡量电机体积的标准,与驱动电压及驱动电源等无关。
动态技术指标
- 步距角精度:步进电机转动一个步距角度的理论值与实际值的误差。用百分比表示:误差/步距角*100%。
- 失步:电机运转时运转的步数,不等于理论上的步数。也可以叫做丢步,一般都是因负载太大或者是频率过快。
- 失调角:转子齿轴线偏移定子齿轴线的角度,电机运转必存在失调角,由失调角产生的误差,采用细分驱动是不能解决的。
- 最大空载起动频率:在不加负载的情况下,能够直接起动的最大频率。
- 最大空载的运行频率:电机不带负载的最高转速频率。
- 运行转矩特性:电机的动态力矩取决于电机运行时的平均电流(而非静态电流),平均电流越大,电机输出力矩越大,即电机的频率特性越硬。
- 电机正反转控制:通过改变通电顺序而改变电机的正反转。
28BYJ-48步进电机简介
28BYJ48步进电机自带减速器,为四相无线步进电机。
# include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
//值越小,速度越快,不能低于1
# define SPEED_MAX 1
# define SPEED_MIN 5
//定义步进机管脚
sbit IN1_D=P1^0;
sbit IN2_C=P1^1;
sbit IN3_B=P1^2;
sbit IN4_A=P1^3;
//定义按键管脚
sbit key1=P3^1;
sbit key2=P3^0;
sbit key3=P3^2;
sbit key4=P3^3;
//按下返回键值
# define KEY1_PRESS 1
# define KEY2_PRESS 2
# define KEY3_PRESS 3
# define KEY4_PRESS 4
//没按下返回键值
# define KEY_UNPRESS 0
//延时函数
void delay_ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
{
for(j=110;j>0;j--);
}
}
//按键检测
u8 key_scan(u8 mode)//传1代表长按,传0代表按一次
{
static u8 count=1;
if(mode==1)
{
count=1;//连续按
}
if(count==1&&(key1==0 ||key2==0 ||key3==0 ||key4==0 ))//如果按下
{
delay_ms(10);//消抖
count=0;
if(key1==0)
return KEY1_PRESS;
else if(key2==0)
return KEY2_PRESS;
else if(key3==0)
return KEY3_PRESS;
else if(key4==0)
return KEY4_PRESS;
}
else if(key1==1&&key2==1&&key3==1&&key4==1)
{
count=1;
}
return KEY_UNPRESS;
}
void step_num(u8 step,u8 dir)//序号,方向,1顺序0逆序
{
u8 tmp=step;
if(dir==0)
{
step=7-step;
}
switch(step)
{
case 0:IN1_D=0,IN2_C=1,IN3_B=1,IN4_A=1;break;
case 1:IN1_D=0,IN2_C=0,IN3_B=1,IN4_A=1;break;
case 2:IN1_D=1,IN2_C=0,IN3_B=1,IN4_A=1;break;
case 3:IN1_D=1,IN2_C=0,IN3_B=0,IN4_A=1;break;
case 4:IN1_D=1,IN2_C=1,IN3_B=0,IN4_A=1;break;
case 5:IN1_D=1,IN2_C=1,IN3_B=0,IN4_A=0;break;
case 6:IN1_D=1,IN2_C=1,IN3_B=1,IN4_A=0;break;
case 7:IN1_D=0,IN2_C=1,IN3_B=1,IN4_A=0;break;
}
}
/****************************************************************
* 给步进机一个脉冲让他转动,按key1换向,按key2加速,按key3减速,按key4停止/转动
****************************************************************/
void main()
{
u8 key=0;
u8 dir=1;
u8 step=0;//0开始
u8 flag=1;//1转动,0停止
u8 speed=SPEED_MIN;
while(1)
{
key=key_scan(0);
if(key==KEY1_PRESS)
{
dir=!dir;
}
else if(key==KEY2_PRESS)//加速
{
if(speed>SPEED_MIN)
speed-=1;
}
else if(key==KEY3_PRESS)//减速
{
if(speed<SPEED_MAX)
speed+=1;
}
else if(key!=KEY4_PRESS)//停止/转动
{
flag=!flag;
}
if(flag)
{
step_num(step++,dir);
if(step==8)
{
step=0;
}
delay_ms(speed);//速度
}
}
while(1);
}
注意
将步进电机红色线对接到“步进电机模块”输出端子 J47 的 5V 上,其它相序依次接入。如下所示:




