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

相关推荐
全栈游侠2 小时前
STM32F103XX 02-电源与备份寄存器
stm32·单片机·嵌入式硬件
Lsir10110_2 小时前
【Linux】中断 —— 操作系统的运行基石
linux·运维·嵌入式硬件
深圳市九鼎创展科技4 小时前
瑞芯微 RK3399 开发板 X3399 评测:高性能 ARM 平台的多面手
linux·arm开发·人工智能·单片机·嵌入式硬件·边缘计算
辰哥单片机设计4 小时前
STM32项目分享:车辆防盗报警系统
stm32·单片机·嵌入式硬件
小龙报6 小时前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机
范纹杉想快点毕业6 小时前
嵌入式与单片机开发核心学习指南——从思维转变到第一性原理的深度实践
单片机·嵌入式硬件
Industio_触觉智能6 小时前
瑞芯微RK3566开发板规格书,详细参数配置,型号EVB3566-V1,基于RK3566核心板SOM3566邮票孔封装
嵌入式硬件·开发板·rk3568·rk3566·核心板·瑞芯微
czwxkn6 小时前
4STM32(stdl)TIM定时器
stm32·单片机·嵌入式硬件
Love Song残响6 小时前
NVIDIA显卡终极优化指南
stm32·单片机·嵌入式硬件
qq_672592757 小时前
电源芯片为什么发热
单片机·嵌入式硬件