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

相关推荐
Lester_110120 小时前
STM32 高级定时器PWM互补输出模式--如果没有死区,突然关闭PWM有产生瞬间导通的可能吗
stm32·单片机·嵌入式硬件·嵌入式软件
小李独爱秋21 小时前
“bootmgr is compressed”错误:根源、笔记本与台式机差异化解决方案深度指南
运维·stm32·单片机·嵌入式硬件·文件系统·电脑故障
梁洪飞1 天前
内核的schedule和SMP多核处理器启动协议
linux·arm开发·嵌入式硬件·arm
进击的小头1 天前
实战案例:51单片机低功耗场景下的简易滤波实现
c语言·单片机·算法·51单片机
宵时待雨1 天前
STM32笔记归纳8:时钟
笔记·stm32·单片机·嵌入式硬件
JJRainbow1 天前
SN75176 芯片设计RS-232 转 RS-485 通信模块设计原理图
stm32·单片机·嵌入式硬件·fpga开发·硬件工程
花月mmc1 天前
CanMV K230 波形识别——整体部署(4)
人工智能·python·嵌入式硬件·深度学习·信号处理
宁静致远20211 天前
STM32模拟IIC读取PCF8563
stm32·单片机·嵌入式硬件
三佛科技-134163842121 天前
宠物洗澡打泡机方案,宠物泡泡机MCU方案开发设计分享
单片机·嵌入式硬件·物联网·智能家居·pcb工艺·宠物
芯岭技术1 天前
低成本315/433M接收芯片 XL420 SOP8封装,支持 1527 等常见 OOK编码
单片机·嵌入式硬件