步进电机基础知识

一、基础知识

1、步进电机

它是将电脉冲信号转变为角位移或线位移的开环控制元件。(一个脉冲信号就会使电机转动一定角度)

注:电机的转速、停止的位置仅取决于脉冲信号的频率和脉冲数;

2、步进电机工作原理

  • 转子是永磁体。当电流流过绕组的时候,它会产生一个矢量磁场,该磁场会带动转子旋转一定角度,转子和定子的磁场保持一致,定子随着磁场旋转一定角度时转子也会随之转动,该角度称为步距角。(每输入一个脉冲,转子就会转动一个步距角)
  • 步进电机的角位移与输入的脉冲成正比,旋转的速度脉冲的频率成正比。
  • 改变电机的转动方向:改变绕组的通电顺序(改变电流方向)
  • 步进电机的极性区分

        

  •  步进电机驱动原理

 (1)双极性步进电机:由于A、B其中只有一个有高低电平差得电,例如A+为高电平,A-为低电平,N极与S极会反向,两者之间会产生作用力使得转子转动一定角度,从而带动整个电机转动(单向) 。 而双向,则是改变了步距角,且A与B两组均产生高低电平差异。

    (2) 单极性步进电机:    单极性的电机电流方向不可变,公共端必须一直处于通电状态,然后改变其它端的通电情况即可。

  3、步进电机技术指标 

        1、静态技术指标 :相数(线圈数量)、拍数(完成磁场变化所需的脉冲数)(可以同时通电的组数)、步距角(一个脉冲电机旋转的角度)、定位转距(电机各相绕组不通电且处于开路状态时,由于混合式电机转子上有永磁材料产生磁场,从而产生的转距)、静转距(步进电机在通电但无转动时,定子锁住转子的力距)。

        2、动态技术指标: 步距角精度、失步(负载太大或者频率过快会导致)、失调角、最大空载起动频率、最大空载运行频率、运行转矩特性、电机正反转控制。 

 二、步进电机编程思路

1、各端口电平情况(根据下面图示设置)

2、28BYJ-48步进电机转角脉冲换算

360/5.625*64=4096

3、实现功能

按下KEY1调节电机旋转方向,按下KEY2电机加速,按下KEY3电机减速

三、实现代码

#include <stdio.h>

typedef  unsigned  char  u8;
typedef  unsigned  int  u16;

sbit  IN1_D=P1^0;  
sbit  IN1_C=P1^1;
sbit  IN1_B=P1^2;
sbit  IN1_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

#define  STEPMOTOR_MAXSPEED 1 //表示电机所能允许的最大速度(延时最短)
#define  STEPMOTOR_MINSPEED 5//表示电机所能允许的最小速度(延时最大)

//10us级延时
void  delay_10us(u16  ten_us){
        while(ten_us--);
}

//ms级延时
void  delay_ms(u16 ms){
        u16  i,j;
        for(i=ms;i>0;i--)
            for(j=110;j>0;j--);
}

//按键扫描  mode为0表示单值扫描,为1表示连续扫描
u8  key_scan(u8 mode){
        static  u8  key=1;
        if(mode)  key=1;
        if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))
        {
    	delay_10us(1000); //消抖
	key=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){
	key=1;
        }
        return  KEY_UNPRESS;  //没有按键被按下
}

//step 表示步数  dir表示方向
void  step_motor_28BYJ48_send_pulse_(u8  step,u8  dir){
        u8  temp=step;
        //dir为0表示方向变化,通过temp中间变量让其倒过来,实现反向的功能
        if(dir==0)
                temp=7-step;
        switch(step){
	case 0: IN1_A=1;IN1_B=1;IN1_C=1;IN1_D=0;  break;
                case 1: IN1_A=1;IN1_B=1;IN1_C=0;IN1_D=0;  break;
                case 2: IN1_A=1;IN1_B=1;IN1_C=0;IN1_D=1;  break;
	case 3: IN1_A=1;IN1_B=0;IN1_C=0;IN1_D=1;  break;
	case 4: IN1_A=1;IN1_B=0;IN1_C=1;IN1_D=1;  break;
                case 5: IN1_A=0;IN1_B=0;IN1_C=1;IN1_D=1;  break;
	case 6: IN1_A=0;IN1_B=1;IN1_C=1;IN1_D=1;  break;
	case 7: IN1_A=0;IN1_B=1;IN1_C=1;IN1_D=0;  break;
        }
}

void  main(){
        u8  key=0;  //保存按键返回值
        u8  dir=0;   //表示电机转动方向
        u8  step=0;  //用于记录步骤并循环
        u8  speed=STEPMOTOR_MAXSPEED;  //用于记录速度
        while(1){
                key=key_scan(0);  
                if(key==KEY1_PRESS)
	         dir=!dir;
                else  if(key==KEY2_PRESS){
                        if(speed>STEPMOTOR_MAXSPEED){  //判断速度是否已经到达最大速度(即延时时间不可再减)
                                speed-=1;
                        }
                }  else  if(key==KEY3_PRESS){
	         if(speed<STEPMOTOR_MINSPEED){  //判断速度是否已经到达最小速度(即延时时间不可再加)
                                speed+=1;
                        }
                }
                step_motor_28BYJ48_send_pulse_(step++,dir);
                if(step==8)  step=0;
                delay_ms(speed);
        }

}

  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值