步进电机
步进电机是一种将电脉冲信号转换为角位移的电机。它通过依次激励电机的绕组,使电机的转子以步进的方式旋转。步进电机广泛应用于需要精确控制的场合,如打印机、数控机床和机器人等。
1.绕组
-
绕组是由导线绕制而成的线圈,通常安装在电机的定子上。步进电机的绕组通过通电产生磁场,控制转子的运动。不同的绕组激励顺序会导致转子以不同的步进方式旋转。 2.定子
-
定子是步进电机的静止部分,通常由铁芯和绕组组成。定子的主要功能是产生旋转磁场,吸引或排斥转子,使其旋转。定子的结构和绕组的排列方式直接影响电机的性能和步进精度。 3.转子
-
转子是步进电机的旋转部分,通常由永磁体或软磁材料制成。转子在定子产生的磁场作用下旋转。步进电机的转子设计可以是齿轮型、杯型或盘型等,具体设计取决于电机的应用需求。
两种、
1.电流只能一个方向
2.电流可以双向
旋转的原理
第一种 双向的电路
1.A+=1,A-=0,这时A+=S极、A-=N极
1-2.B+=1,B-=0,这时B+=S极、B-=N极 发生45°旋转
2-3.A+=0,A-=1,这时A-=S极、A+=N极 发生45°旋转
3-4.B+=0,B-=1,这时B-=S极、B+=N极 发生45°旋转
一次只能45°旋转、那么怎么减少角度、让旋转更丝滑
1.A+=1,A-=0,B+=1,B-=0 这时A+=S极、B+=S级、A-=N极 B-=N极、
1-2.A+=0,A-=1,B+=0,B-=1 这时A+=N极、B+=N级、A-=S极 B-=S极、由力的左右、停留在A和B之间、发生22.5°旋转 2-3-4同理
这时变成了22.5°、那么再减少角度怎么减少?
为什么要减少角度?
角度变小、旋转越丝滑、精确度越高。
方法1.通过给A、B不同的电流、更改角度的偏向
方法2.再添加C、D
反向:通过+、- 反着赋值、逆向旋转。
第二种 单向的电路
给A、B、C、D 分别=1,发生旋转 1.通过给A、B、C、D 不同电流更改角度 2.添加 E\F 减少角度
技术指标
静态技术指标
1.相数
2.拍数
完成一个磁场变化的脉冲数、电机旋转一次的脉冲数
4相4拍
A\B\C\D 4相
AB\BC\CD\DA 4拍
AB\BC\CD\DA->AB\BC\CD\DA->循环
3.步距角
1个脉冲信号、电机转动的角度。上面的就是45°、22.5° 4.定位转距
没听懂
5.静转距
没听懂
动态技术指标
1.步距角精度 步距角的理论值和实际值的偏差 2.失步 电机旋转的步数、不等于实际旋转的步数、又称失步
一般频率过快会产生
3.失调角
旋转后、偏移轴线的角度。例如旋转45°、但是却停在46°、这时失调角=1°
4.最大空载起动频率
不添加负载能够启动的最大频率
5.其他...
程序
通过ULN2003 驱动模块控制28BYJ45步进电机方向及速度, 当按下KEY1调整电机旋转方向、KEY2电机加速、KEY3电机减速。
1.Key.c
#include <REGX52.H>
#include "delay.h"
//sbit RXD = 0xB0;
sbit K1 = P3^1;
sbit K2 = P3^0;
sbit K3 = P3^2;
sbit K4 = P3^3;
unsigned char getKeyNum(){
unsigned char KeyNum = 0;
if(!K1){Delay(20);while(!K1);Delay(20);KeyNum = 1;}
if(!K2){Delay(20);while(!K2);Delay(20);KeyNum = 2;}
if(!K3){Delay(20);while(!K3);Delay(20);KeyNum = 3;}
if(!K4){Delay(20);while(!K4);Delay(20);KeyNum = 4;}
return KeyNum;
}
2.main.c
#include <REGX52.H>
#include "Delay.h"
#include "Key.h"
typedef unsigned char u8;
typedef unsigned int u16;
//DCBA 4 相
sbit IND=P1^0;
sbit INC=P1^1;
sbit INB=P1^2;
sbit INA=P1^3;
sbit KEY1=P3^1;
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
#define KEY1_PRESS 1 //按键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
/**
*
* @brief 步进电机脉冲
* @param step 当前的步数 0-7,dir 方向 0逆时针、1顺时针
* @retval
*/
void setp_motor_28BYJ48_send_pulse(u8 step,u8 dir)
{
u8 temp=step;
//方向取反
if(dir==0){
temp = 7-step;
}
switch(temp)
{
case 0:INA=1;INB=1;INC=1;IND =0;break;
case 1:INA=1;INB=1;INC=0;IND =0;break;
case 2:INA=1;INB=1;INC=0;IND =1;break;
case 3:INA=1;INB=0;INC=0;IND =1;break;
case 4:INA=1;INB=0;INC=1;IND =1;break;
case 5:INA=0;INB=0;INC=1;IND =1;break;
case 6:INA=0;INB=1;INC=1;IND =1;break;
case 7:INA=0;INB=1;INC=1;IND =0;break;
}
}
/*
通过ULN2003 驱动模块控制28BYJ45步进电机方向及速度,
当按下KEY1调整电机旋转方向、KEY2电机加速、KEY3电机减速。
*/
void main()
{
u8 key=0;
u8 dir=0;
u8 step=0;
u8 speed=STEPMOTOR_MAXSPEED;
while(1)
{
key=getKeyNum();
if(key==KEY1_PRESS)
{
dir = !dir;
}else if(key==KEY2_PRESS)
{
if(speed>STEPMOTOR_MAXSPEED){//延时不能小于1
speed--;//加速
}
}else if(key==KEY3_PRESS)
{
if(speed<STEPMOTOR_MINSPEED){//延时不能大于5
speed++;//减速
}
}
setp_motor_28BYJ48_send_pulse(step++,dir);
if(step>7)
{
step=0;
}
Delay(speed);
}
}