目录
- 1.步进电机简介
- 2步进电机双极性工作原理
- 3.28BYJ-48步进电机
- 4.实现的功能
- [5. 步进电机代码](#5. 步进电机代码)
- 6.步进电机电路图
1.步进电机简介
步进电机是将电脉信号转变为角位移或线位移的开环控制元件。

2步进电机双极性工作原理

1.A正 = 1, A负B正负 = 0
2.A正B正 = 1, B负A负 = 0
3.B正 = 1,B负A正负 = 0
4.B正A负 = 1, A正B负 = 0
5.A负 = 1, A正B正负 = 0
6.A负B负 = 1, A正B正 = 0
- B负 = 1, A正负B正 = 0
8.B负A正 = 1, B正A负 = 0
通过双极性线圈通电从而控制位移角度
3.28BYJ-48步进电机


4.实现的功能
通过ULN2003驱动模块控制28BYJ-48步进电机方向及速度,当按下key1键可调节电机旋转方向,当按下key2键,电机加速,当按下key3键,电机减速。
5. 步进电机代码
c
#include <reg51.h>
typedef unsigned int u16;
typedef unsigned char u8;
sbit IN1D_ORANGE = P1^0; //橙
sbit IN1C_YELLOW = P1^1; //黄
sbit IN1B_POWER = P1^2; //粉
sbit IN1A_BLUE = P1^3; //蓝
sbit KEY1 = P3^0;
sbit KEY2 = P3^1;
sbit KEY3 = P3^2;
#define KEY1_PRESS 1
#define KEY2_PRESS 2
#define KEY3_PRESS 3
#define KEY0_UNPRESS 0
#define STEPTOMOR_MAXSPEED 1
#define STEPTOMOR_MINSPEED 10
void delay_10us(u16 us) {
while(us--);
}
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) {
static u8 key = 1; //单次按下
if (mode) key = 1; //连续按下
if (key == 1 && (KEY1 == 0 || KEY2 == 0 || KEY3 == 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 (KEY1 == 1 && KEY2 == 1 && KEY3 == 1) {
key = 1;
}
return KEY0_UNPRESS;
}
//步进电机
void step_motor_28BYJ48_send_pulse(u8 step, u8 dir) {
u8 temp = step;
if (dir == 0)
temp = 7 - step;
switch(temp) {
case 0: IN1A_BLUE = 1; IN1B_POWER = 1; IN1C_YELLOW = 1; IN1D_ORANGE = 0; break;
case 1: IN1A_BLUE = 1; IN1B_POWER = 1; IN1C_YELLOW = 0; IN1D_ORANGE = 0; break;
case 2: IN1A_BLUE = 1; IN1B_POWER = 1; IN1C_YELLOW = 0; IN1D_ORANGE = 1; break;
case 3: IN1A_BLUE = 1; IN1B_POWER = 0; IN1C_YELLOW = 0; IN1D_ORANGE = 1; break;
case 4: IN1A_BLUE = 1; IN1B_POWER = 0; IN1C_YELLOW = 1; IN1D_ORANGE = 1; break;
case 5: IN1A_BLUE = 0; IN1B_POWER = 0; IN1C_YELLOW = 1; IN1D_ORANGE = 1; break;
case 6: IN1A_BLUE = 0; IN1B_POWER = 1; IN1C_YELLOW = 1; IN1D_ORANGE = 1; break;
case 7: IN1A_BLUE = 0; IN1B_POWER = 1; IN1C_YELLOW = 1; IN1D_ORANGE = 0; break;
}
}
void main() {
u8 key = 0;
u8 dir = 0;
u8 step = 0;
u8 steed = STEPTOMOR_MAXSPEED;
while(1) {
key = key_scan(0);
if (key == KEY1_PRESS)
dir = !dir;
else if (key == KEY2_PRESS) {
if (steed > STEPTOMOR_MAXSPEED)
steed -= 1;
}
else if (key == KEY3_PRESS) {
if (steed < STEPTOMOR_MINSPEED)
steed += 2;
}
step_motor_28BYJ48_send_pulse(step++, dir);
if (step == 8) step = 0;
delay_ms(steed);
}
}
6.步进电机电路图
