51单片机步进电机

目录

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

  1. 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.步进电机电路图

相关推荐
Linux猿14 小时前
基于单片机的自行车里程表设计|附源码
单片机·嵌入式硬件·嵌入式·课程设计
学嵌入式的小杨同学15 小时前
STM32 进阶封神之路(三十九)FreeRTOS 临界区、挂起 / 删除、钩子函数、调度底层原理|从应用到内核深度解析
c++·stm32·单片机·嵌入式硬件·mcu·硬件架构·pcb
恒森宇电子有限公司17 小时前
南麟SA8304 单通道 H 桥直流有刷电机驱动芯片 ESOP8封装
单片机·嵌入式硬件
FreakStudio18 小时前
ESP32 实现在线动态安装库和自动依赖安装-使用uPyPI包管理平台
python·单片机·嵌入式·面向对象·电子diy·sourcetrail
4caf118 小时前
【51单片机】26/4/2 --0416
单片机·嵌入式硬件·51单片机
EmbeddedCore19 小时前
硬核实战:基于 C 语言宏定义的物联网网关命令分发框架设计
单片机·嵌入式
EmbeddedCore20 小时前
轻量级消息防重模块全解析:从原理到高性能优化
linux·运维·服务器·嵌入式硬件
啃玉米的艺术家21 小时前
中断 ------ 中断方式
嵌入式硬件
悠哉悠哉愿意21 小时前
【物联网学习笔记】ADC
笔记·单片机·嵌入式硬件·物联网·学习
foundbug9991 天前
基于STM32的步进电机加减速程序设计(梯形加减速算法)
stm32·单片机·算法