改变绕组方向,改变电机转动方向
图左,公共线处连接VCC,3和4,1和2为同一方向,电流单向
图右,1和2处都可以做VCC和GND,电流方向可更改,是双向
双极性步进电机工作原理:
(改变电流方向,从而改变磁场方向)
图左为单向激励,图右为双向激励:
图左(步进角为90°):
1-2-3-4(注:1为高电平,0为低电平)
1图中A+为1,A-为0,B+,B-不工作
2图中B+为1,B-为0,A+,A-不工作,转子旋转90°
3图中A-为1,A+为0,B-,A+不工作,转子旋转90°
4图中B-为1,B+为0,A-,A+不工作,转子旋转90°
图左(步进角为45°):
1-2-3-4
1图中A+为1,B+为1,A-为0,B-为0
2图中A+为0,B+为1,A-为1,B-为0,转子旋转45°
3图中A+为0,B+为0,A-为1,B-为1,转子旋转45°
4图中A+为1,B+为0,A-为0,B-为1,转子旋转45°
单双向激励结合起来为
1图中A+为1,B+为0,A-为0,B-为0,转子旋转0°
2图中A+为1,B+为1,A-为0,B-为0,转子旋转45°
3图中A+为0,B+为1,A-为0,B-为0,转子旋转45°
4图中A+为0,B+为1,A-为1,B-为0,转子旋转45°
5图中A+为0,B+为0,A-为1,B-为0,转子旋转45°
6图中A+为0,B+为0,A-为1,B-为1,转子旋转45°
7图中A+为0,B+为0,A-为0,B-为1,转子旋转45°
8图中A+为1,B+为0,A-为0,B-为1,转子旋转45°
PS:可将A+,B+等的电流大小进行优化,如A+=1,B+=2,偏转角度就不是45°
单极性步进电机工作原理:
(不能改变电流方向改变磁场方向,问问电流方向固定)
图左为单向激励,图右为双向激励:
图左(步进角为90°):
1图中A+为1,B+为0,A-为0,B-为0,转子旋转0°
2图中A+为0,B+为1,A-为0,B-为0,转子旋转90°
3图中A+为0,B+为0,A-为1,B-为0,转子旋转90°
4图中A+为0,B+为0,A-为0,B-为1,转子旋转90°
图右(步进角为45°):
1图中A+为1,B+为1,A-为0,B-为0,转子旋转45°
2图中A+为0,B+为1,A-为1,B-为0,转子旋转90°
3图中A+为0,B+为0,A-为1,B-为1,转子旋转90°
4图中A+为1,B+为0,A-为0,B-为1,转子旋转90°
单双向激励结合起来为:
1图中A+为1,B+为0,A-为0,B-为0,转子旋转0°
2图中A+为1,B+为1,A-为0,B-为0,转子旋转45°
3图中A+为0,B+为1,A-为0,B-为0,转子旋转45°
4图中A+为0,B+为1,A-为1,B-为0,转子旋转45°
5图中A+为0,B+为0,A-为1,B-为0,转子旋转45°
6图中A+为0,B+为0,A-为1,B-为1,转子旋转45°
7图中A+为0,B+为0,A-为0,B-为1,转子旋转45°
8图中A+为1,B+为0,A-为0,B-为1,转子旋转45°
PS:转动角度越小,流畅度越高
第1步时,VCC为高电平,D为低电平,右图电流应在VCC-D(水平方向)
第2步时,VCC为高电平,D,C为低电平,右图电流应在VCC--C/D(可解读为逆时针旋转45°)
若让步进电机反向旋转,则从第8步-->第1步
注:VCC连接红色的线
图左:A2-A4 图右:A5-A7
注:VCC连接红色的线
#include"reg52.h" typedef unsigned char u8; typedef unsigned int u16; //定义ULN2003控制步进电机管脚 sbit IN1_A=P1^0; sbit IN2_B=P1^1; sbit IN3_C=P1^2; sbit IN4_D=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 // 定义步进电机速度,值越小,速度越快 // 最小不能小于1 #define STEPMOTOR_MAXSPEED 1 //最大速度 #define STEPMOTOR_MINSPEED 5 //最小速度 void delay_time(u16 time_delay) { u16 i,j; { for(i=time_delay;i>0;i--) for(j=110;j>0;j--) ; } } //独立按键扫描---mode确定是单扫0还是连续扫描1 //按下返回对应键值 //KEY1_PRESS:K1按下 //KEY2_PRESS:K2按下 //KEY3_PRESS:K3按下 //KEY4_PRESS:K4按下 //KEY_UNPRESS:未有按键按下 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_time(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; } //输出一个数据给ULN2003从而实现向步进电机发送一个脉冲 //完成方向(dir)和步数(step)控制 void step_motor_28BYJ48_send_pulse(u8 step,u8 dir) { u8 temp=step; if(dir==0) //如果为逆时针旋转 temp=7-step;//调换节拍信号.使反向,0-7变为7-0 switch(temp)//8个节拍控制:A->AB->B->BC->C->CD->D->DA { case 0: IN1_A=1;IN2_B=0;IN3_C=0;IN4_D=0;break; case 1: IN1_A=1;IN2_B=1;IN3_C=0;IN4_D=0;break; case 2: IN1_A=0;IN2_B=1;IN3_C=0;IN4_D=0;break; case 3: IN1_A=0;IN2_B=1;IN3_C=1;IN4_D=0;break; case 4: IN1_A=0;IN2_B=0;IN3_C=1;IN4_D=0;break; case 5: IN1_A=0;IN2_B=0;IN3_C=1;IN4_D=1;break; case 6: IN1_A=0;IN2_B=0;IN3_C=0;IN4_D=1;break; case 7: IN1_A=1;IN2_B=0;IN3_C=0;IN4_D=1;break; default: IN1_A=0;IN2_B=0;IN3_C=0;IN4_D=0;break;//停止相序 } } void main() { u8 key=0;//接收按键返回值 u8 dir=0;//默认逆时针方向 u8 speed=STEPMOTOR_MAXSPEED;//默认最大速度旋转---定义宏,方便每次修改 u8 step=0; while(1) { key=key_scan(0); if(key==KEY1_PRESS)//判断KEY1按下,就换向 { dir=!dir; } else if(key==KEY2_PRESS)//判断KEY2按下,状态1,加速 { if(speed>STEPMOTOR_MAXSPEED) speed-=1; } else if(key==KEY3_PRESS)//判断KEY2按下,状态1,减速 { if(speed<STEPMOTOR_MINSPEED) speed+=1; } step_motor_28BYJ48_send_pulse(step++,dir);//循环一次,step+1 if(step==8)step=0;//判断如果超过7,就重新从0开始循环 delay_time(speed); } }