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为逆时针旋转;
第二步:创建独立按键检测函数,之前文章有教学小伙伴直接复制粘贴就好啦。成熟的工程师往往都是在拷贝的道路上学习的;独立按键检测函数学习章节!!!
第三步:在主函数中实现按键控制步进电机功能
#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控制步进电机减速度;
驱动步进电机模块
制作不易!喜欢的小伙伴给个小赞赞!喜欢我的小伙伴点个关注!有不懂的地方和需要的资源随时问我哟!