51单片机-驱动步进电机模块教程

本章概述思维导图:

51单片机驱动步进电机模块

步进电机简介

步进电机是一种将电脉冲信号转换为角位移或线位移的电动机,其核心特点在于能够通过控制脉冲数量来精确控制转动角度,无需反馈装置即可实现定位;步进电机内部结构图如下:

步进电机内部结构:绕组、定子与转子

1、定子

由硅钢片叠压而成,表面有齿轮状突起(极齿),每个极齿绕有绕组(线圈)。

定子绕组通电后产生磁场,驱动转子旋转。

相数:独立绕组的数量(如两相、三相),决定控制精度和扭矩。

2、转子

永磁式:由永磁体制成,与定子磁场直接对齐,扭矩大但速度/分辨率较低。

反应式(变阻式):由软磁材料制成,通过磁阻变化驱动,速度高但扭矩小。

混合式:结合永磁体和软磁材料,兼具高分辨率(如1.8°步距角)、高速度和大扭矩,应用最广泛。

3、绕组

定子极齿上的线圈,通电后产生磁场,通过电流方向和大小控制磁场极性和强度。

单极性:每个绕组有中心抽头,通过简单电路控制电流方向(但铜损较高)。

双极性:每个绕组仅两端,需H桥电路控制电流方向(效率更高)。


步进电机主要类型

按励磁方式:

磁阻式(VR):结构简单,步距角大,动态性能差。

永磁式(PM):转子为永磁体,步距角大,但启动频率低。

混合式(HB):结合前两者优点,步距角小、输出力矩大,应用最广泛。

按相数:两相、三相、五相,相数越多步距角越小(如两相1.8°,五相0.72°)。


步进电机核心参数

步距角:每个脉冲的转动角度,如1.8°(两相)、0.9°(半步驱动)。

保持转矩:电机静止时锁定的最大力矩,衡量负载能力。

起动频率:直接启动而不失步的最高脉冲频率。

运行频率:连续运行时的最高脉冲频率,与转速相关。

精度:步距角实际值与理论值的偏差,通常在±5%以内。


步进电机应用场景

精确定位:3D打印机(喷头移动)、数控机床(刀具定位)、机器人(关节控制)。

自动化设备:输送带、机械臂、包装机(定长切割)。

医疗设备:注射泵、CT扫描仪(精密驱动)。

消费电子:打印机(打印头移动)、相机(自动对焦)、ATM机(钞票传送)。


步进电机优势

开环控制:无需传感器反馈,系统简单且成本低。

低速大扭矩:适合需要频繁启停的场景。

响应快:启动、停止迅速,适合高速动态控制。


步进电机工作原理

1、步进电机基本原理

磁场对齐:定子绕组通电后产生磁场,转子因磁力作用与磁场对齐。

顺序切换:通过按顺序切换通电绕组,转子逐步旋转。

步距角:每脉冲转动的角度,由电机结构决定。

计算公式:步距角=360°/(转子齿数×运行拍数)

示例:两相混合式步进电机(转子50齿,运行拍数4),步距角为1.8°

2、运行模式

全步模式:一次仅一个相位通电,扭矩大但步距角较大(如90°)

半步模式:交替单、双相通电,步距角减半(如45°),但扭矩波动。

微步模式:通过调节电流大小实现更小步距(如0.1°),但扭矩降低。

3、控制方法:角度、转速、与正反转

转动角度控制:

脉冲计数:每个脉冲驱动转子转动一个步距角,脉冲数决定总角度。

示例:100个脉冲 × 1.8° = 180°。

转速控制:

频率调节:转速(RPM)= (脉冲频率 × 60) / 每转步数。

示例:脉冲频率1000Hz,每转200步,转速为300RPM。

加速/减速策略:高频启动可能导致失步,需采用S形曲线等匀加速算法。

正反转控制:

通电顺序切换:

正转:按A→B→C→D顺序通电。

反转:按D→C→B→A顺序通电。


步进电机极性区分

步进电机极性区分基础

步进电机的极性由绕组设计和电流方向控制方式决定,主要分为两类:

1、单极性

绕组有中心抽头,电流仅需单向流动(通过公共端)。

典型代表:五线四相步进电机。

2、双极性

绕组无中心抽头,电流需双向流动(需H桥电路控制方向)。

典型代表:四线双极性步进电机。

五线四相步进电机(单极性)介绍

1、结构特点

5根引线:1根公共端(COM,通常红色),4根相线(A、B、C、D)。

绕组设计:每个绕组有中心抽头,电流从公共端流向相线。

2、极性区分方法

万用表测量:电阻档测量公共端(COM)与其他4根线:阻值相同,确认公共端。测量相线间阻值:高阻值或无穷大,说明属于不同相。

接线逻辑:公共端接电源正极,相线按顺序连接驱动器输出端(如A→B→C→D)。

3、控制原理

控制原理示意图:1~8顺时针旋转360°

第一步:A相通电,B、C、D不通电;顺时针旋转0°;

第二步:A、B相通电,C、D不通电;顺时针旋转45°;

第三步:B相通电,A、C、D不通电;顺时针旋转90°;

第四步:B、C相通电,A、D不通电;顺时针旋转135°;

第五步:C相通电,A、B、D不通电;顺时针旋转180°;

第六步:C、D相通电,A、B不通电;顺时针旋转225°;

第七步:D相通电,A、B、C不通电;顺时针旋转270°;

第八步:A、D相通电,B、C不通电;顺时针旋转315°;


四线双极性步进电机(双极性)介绍

1、结构特点:

4根引线:无公共端,每相由两根线组成(A+、A-;B+、B-)。

绕组设计:电流需双向流动,需H桥电路控制方向。

2、极性区分方法

万用表测量:电阻档测量任意两根线:低阻值说明同一相(如A+和A-),高阻值为不同相。标记同一相的两根线为A+、A-和B+、B-。

接线逻辑:同一相线连接驱动器输出端(如A+→OUT1,A-→OUT2;B+→OUT3,B-→OUT4)。

3、控制原理

通过H桥电路切换电流方向,实现正反转:

正转:A相通电(A+→正,A-→负),B相通电(B+→正,B-→负)。

反转:A相通电(A+→负,A-→正),B相通电(B+→负,B-→正)。

需专用驱动器(如L298N、TMC2209)支持双极性控制。

控制原理示意图:1~8顺时针旋转360°

第一步:A相通电(A+为高电平,A-为低电平),B相不通电;

第二步:A相通电(A+为高电平,A-为低电平),B相通电(B+为高电平,B-为低电平);

第三步:A相不通电,B相通电(B+为高电平,B-为低电平);

第四步:A相通电(A+为低电平,A-为高电平),B相通电(B+为高电平,B-为低电平);

第五步:A相通电(A+为低电平,A-为高电平),B相不通电;

第六步:A相通电(A+为低电平,A-为高电平),B相通电(B+为低电平,B-为高电平);

第七步:A相不通电;B相通电(B+为低电平,B-为高电平);

第八步:A相通电(A+为高电平,A-为低电平),B相通电(B+为低电平,B-为高电平);


28BYJ-48步进电机简介

28BYJ-48步进电机为五线四相单极步进电机,内置1:64减速齿轮箱;

五线定义:

公共端(COM):红色线,接电源正极(5V)。

四相线:橙、黄、粉、蓝四色线,分别对应A、B、C、D相。

驱动方式:单极性驱动,采用1-2相励磁模式(单相与双相交替通电)。

通电顺序:

全步四拍:A→B→C→D→A,每步转动5.625°(原始步距角)。

半步八拍:A→AB→B→BC→C→CD→D→DA→A,步距角减半至2.8125°,运行更平稳。

转速计算:

公式:转速(RPM)=(脉冲频率 × 60) / 每转步数。

示例:脉冲频率400Hz,每转200步(半步模式),转速= (400×60)/200=120 RPM。


步进电机硬件电路原理图分析

电路原理图分析:

ULN2003芯片的IN输入脚分别连接MCU的IO引脚,IN1-P10、IN2-P11、IN3-P12、IN3-P13、IN5-P25;

ULN2003芯片的OUT输出脚分别引出座子和连接蜂鸣器引脚,OUT1~OUT4引出座子,OUT5连接蜂鸣器(本章不考虑此引脚);

ULC2003芯片的GND引脚连接公共地,COM引脚连接开发板的VCC电源引脚;

这里我们正好可以实现步进电机五线匹配上ULN2003芯片引出的座子进行连接控制;我们将步进电机的红线连接VCC引脚,橙线连接ULN2003芯片的OUT1、黄线连接ULN2003芯片的OUT2、粉线连接ULN2003芯片的OUT3、蓝线连接ULN2003芯片的OUT4;


驱动步进电机模块软件编程设计

我们一起实现控制步进电机转动,并且通过三个独立按键实现对步进电机的控制啦,按键1按下实现步进电机的转向,按键2按下实现步进电机转动加速度,按键3按下实现步进电机转动减速度;

步进电机转动360°示意图:

第一步:我们实现步进电机旋转360°代码并且封装成函数,函数形参str为步数一共有八步,形参xz为步进电机方向0为顺时针旋转,1为逆时针旋转;

第二步:创建独立按键检测函数,之前文章有教学小伙伴直接复制粘贴就好啦。成熟的工程师往往都是在拷贝的道路上学习的;独立按键检测函数学习章节!!!

第三步:在主函数中实现按键控制步进电机功能

cpp 复制代码
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
#define BYJ_48_MAX 1	 //步进电机最快速度
#define BYJ_48_min 5	 //步进电机最慢速度
void Delay_10us(u16 us)//延时函数:输入1大概延时时间为10us
{
	while(us--);
}
void Delay_ms(u16 ms) //毫秒延时函数:输入1大概延时时间为1ms
{
	u16 i,j;
	for(i=ms;i>0;i--)
	{
		for(j=110;j>0;j--)
		{
		
		}
	}
}
#define KEY_matrix	P1
sbit KEY1=P3^1;//定义检测独立按键的各个引脚输入状态
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
#define KEY1_return 1//定义检测独立按键函数检测的状态变量返回值,按键按下分别返回1,2,3,4;没有按键按下返回0;
#define KEY2_return 2
#define KEY3_return 3
#define KEY4_return 4
#define KEY_return 0
u8 KEY_detect(u8 mode)//按键检测函数,返回值为判断是否有按键按下:有按键按下返回值为1-4,无按键按下返回值为:0;
{	
	static u8 flag=1;
	if(mode)
	{
		flag=1;
	}
	if((!KEY1 || !KEY2 || !KEY3 || !KEY4) && flag==1)//一次判断是否有按键按下
	{
		flag=0;
		Delay_10us(1000);//延时消抖
		if(!KEY1)	return KEY1_return;//二次判断
		else if(!KEY2)	return KEY2_return;
		else if(!KEY3)	return KEY3_return;
		else if(!KEY4)	return KEY4_return;
	}
	else if(KEY1 && KEY2 && KEY3 && KEY4)//判断所有按键是否松开
	{
		flag=1;
	}
	return KEY_return;
}
sbit IN1_D=P1^0;
sbit IN2_C=P1^1;
sbit IN3_B=P1^2;
sbit IN4_A=P1^3;
void BYJ_48(u8 str,u8 xz)		//步进电机控制:形参str:选择步数,xz:旋转方向0顺时针旋转,1逆时针旋转
{
	u8 temp=str;
	if(xz == 0)
	{
		temp=7-str;	
	}
	switch(temp)
	{
		case 0:	IN1_D=1;IN2_C=0;IN3_B=0;IN4_A=0;break;//第一步
		case 1: IN1_D=1;IN2_C=1;IN3_B=0;IN4_A=0;break;//第二步	
		case 2: IN1_D=0;IN2_C=1;IN3_B=0;IN4_A=0;break;//第三步
		case 3: IN1_D=0;IN2_C=1;IN3_B=1;IN4_A=0;break;//第四步
		case 4: IN1_D=0;IN2_C=0;IN3_B=1;IN4_A=0;break;//第五步
		case 5: IN1_D=0;IN2_C=0;IN3_B=1;IN4_A=1;break;//第六步	
		case 6: IN1_D=0;IN2_C=0;IN3_B=0;IN4_A=1;break;//第七步
		case 7: IN1_D=1;IN2_C=0;IN3_B=0;IN4_A=1;break;//第八步
	}
}
int main()															 
{
  u8 str=0;//步进电机开始步数
  u8 xz=0;//步进电机旋转方向:0为顺时针 
  u8 sd=BYJ_48_MAX;//步进电机速度控制
  u8 KEY=0;//按键获取 
	while(1)
	{
		KEY=KEY_detect(0);//按键获取
		if(KEY == 1)//按键1按下改变步进电机运行方向
		{
		  xz=!xz;
		}
		if(KEY == 2)//按键2按下加速度
		{
			if(sd > BYJ_48_MAX)
			{
				sd-=1;
			}
		}
		if(KEY == 3)//按键3按下减速度
		{
			if(sd < BYJ_48_min)
			{
				sd+=1;
			}
		}
		BYJ_48(str++,xz);
		if(str == 8) str=0;
		Delay_ms(sd);
	}
}		   

驱动步进电机转动效果展示:1、按键2控制步进电机加速度;2、按键1控制步进电机转向;3、按键3控制步进电机减速度;

驱动步进电机模块


制作不易!喜欢的小伙伴给个小赞赞!喜欢我的小伙伴点个关注!有不懂的地方和需要的资源随时问我哟!

相关推荐
嵌入式分享15 分钟前
嵌入式分享#41:RK3576改UART波特率【精简版】
linux·嵌入式硬件·ubuntu·嵌入式
典则1 小时前
STM32FreeRtos入门(四)——任务状态和调度
stm32·单片机·嵌入式硬件
充哥单片机设计1 小时前
【STM32项目开源】基于STM32的智能天然气火灾监控
stm32·单片机·嵌入式硬件
充哥单片机设计1 小时前
【STM32项目开源】基于STM32的智能仓库火灾检测系统
stm32·单片机·嵌入式硬件
A9better4 小时前
嵌入式开发学习日志38——stm32之看门狗
stm32·嵌入式硬件·学习
小莞尔4 小时前
【51单片机】【protues仿真】基于51单片机智能路灯控制系统
c语言·stm32·单片机·嵌入式硬件·51单片机
A9better14 小时前
嵌入式开发学习日志36——stm32之USART串口通信前述
stm32·单片机·嵌入式硬件·学习
思诺学长14 小时前
BMS(电池管理系统)的主要功能和架构简述
单片机·嵌入式硬件
czhaii14 小时前
全局不关总中断的 RTOS / CosyOS-II for STCAI MCU
单片机
qq_4017004115 小时前
STM32低功耗Tickless模式
stm32·单片机