大家好,欢迎来到IT知识分享网。
一、基础知识
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);
}
}
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/27319.html