任务58步进电机的驱动资料.docx
- 文档编号:5999892
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:12
- 大小:1.17MB
任务58步进电机的驱动资料.docx
《任务58步进电机的驱动资料.docx》由会员分享,可在线阅读,更多相关《任务58步进电机的驱动资料.docx(12页珍藏版)》请在冰豆网上搜索。
任务58步进电机的驱动资料
任务5.8步进电机的驱动
5.7.1任务介绍
直流电机通电后是连续转动的,转速高,惯性大,不适合于用于准确定位的场合。
步进电机是一种将电脉冲转化成角位移的执行机构,当步进电机驱动器接收到一个脉冲信号,就会驱动步进电机按设定的方向转动一个固定的角度,通过控制脉冲个数,就可以达到准确定位的目的。
步进电机广泛应用于机械、电子、纺织等行业,如切割机、包装机、雕刻机、电脑绣花机、计算器外设、办公自动化等产品都有步进电机的身影。
本节的任务是:
有三个按键,分别用来控制步进电机的启停、转向和转动角度。
按下按键A,步进电机转动,再次按下,步进电机停止;按下按键B,步进电机正转,再次按下,步进电机反转;按键C控制步进电机的转动一次角度,分别为30、60和90。
5.7.2知识准备
1、步进电机的控制原理
步进电机按种类来分有反应式、永磁式和混合式三种。
图5.7.1是单定子反应式步进机
的工作原理图。
图5.7.1反应式步进电机工作原理图
图5.7.1中步进电机分为定子和转子两部分。
定子由定子铁心和定子绕组构成,定子绕组是绕置在定子铁心(6个均匀分布的齿)上的线圈,在直径方向上相对的两个齿上的线圈串联在一起,构成一相控制绕组。
三相控制绕组,任一相绕组通电,便形成一组定子磁极,其方向即图中所示的NS极。
在定子的每个磁极上,即定子铁心上的每个齿上又开了5个小齿,齿槽等宽,齿间夹角为9°。
转子上没有绕组,只有均匀分布的40个小齿,齿槽也是等宽的,齿间夹角也是9°。
由于定子和转子的小齿数目分别是30和40,其比值是一分数,这就产生了所谓的齿错位的情况。
若以A相磁极小齿和转子的小齿对齐,那么B相和C相磁极的齿就会分别和转子齿相错1/3的齿距,即3°。
若给B相通电,B相绕组产生定子磁场,其磁力线穿越B相磁极,并力图按磁阻最小的路径闭合,这就使转子受到反应转矩(磁阻转矩)的作用而转动,直到B磁极上的齿与转子齿对齐,恰好转子转过3°,此时A、C磁极下的齿又分别与转子齿错开三分之一齿距。
接着停止对B相绕组通电,而改为C相绕组通电,同理受反应转矩的作用,转子按顺时针方向再转过3°。
依次类推,当3相绕组按A→B→C→A顺序循环通电时,转子会按顺时针方向,以每个通电脉冲转动3º的规律步进转动起来。
若改变通电顺序,按A→C→B→A顺序循环通电,则转子就按逆时针方向以每个通电脉冲转动3°的规律转动。
2、步进电机的驱动方式
3相绕组按A→B→C→A顺序循环通电,每一瞬间只有一相绕组通电,称为单三拍运行方式,单三拍运行时的步矩角3°。
除了“单3拍”,步进电机还可以以双三拍和单双6拍的方式运行。
双3拍指的是在通电瞬间,两相绕组同时通电,其通电顺序为:
AB→BC→CA→AB,和单3拍相比较,步距角相同,但力矩要大于单3拍。
单双6拍的通电顺序为:
A→AB→B→BC→C→CA→A,实际上是单3拍和双3拍的结合,力矩要比单3拍大,步矩角比单三拍和双三拍减小一半,因此六拍的工作方式既可以保持较高的转矩,又可以调高控制精度。
3、28BYJ-48步进电机
开发板上配置的步进电机型号为28BYJ-48,图5.7.2(a)是28BYJ步进电机的外形,(b)是电机绕组接线方式。
(a)(b)
图5.7.228BYJ步进电机外形及绕组接线方式
它是一个四相八拍电机,电压为5V。
28代表电机的外径为28mm,B表示步进电机,Y表示永磁式,J表示为减速电机,48表示电机为四相八拍(也可以工作在四拍方式下)。
28BYJ-48步进电机共有5根接线,颜色分别是红、橙、黄、粉、蓝。
其中红色接线是4相绕组的公共端,接5V;橙、黄、粉、蓝四根接线分别是4相绕组的另外一端引出线,代表电机的A、B、C和D四相,要给绕组通电,这四相需分别给低电平。
表5.7.1是28BYJ-48步进电机的技术参数,驱动电压为5V,相电阻为300Ω,其中最小步距角度为5.625/64,减速比为1:
64。
5.625为步进电机按照8拍工作方式运行,每相通电后,转子转动的角度,如果按照四拍的方式运行,则转子转动的角度为5.625*2。
28BYJ步进电机内部带有减速齿轮,减速齿轮转动64圈,电机的轴才转动一圈,这样最小步距角度为5.625/64就不难理解了。
表5.7.128BYJ-48步进电机参数
按照8拍驱动方式,每一拍电机转动的角度为5.625/64=0.087890625,程序中一个循环为8拍,则一个循环转动的角度为0.703125,电机转动一圈,需要的循环数为512。
如果按照4拍的驱动方式,则每一拍的角度为加倍,但一个循环中为4拍,拍数减少了一半,需要的循环次数同样为512。
4、高电压、大电流达林顿晶体管阵列ULN2003
单片机驱动步进电机,和之前讲到过的继电器、直流电机的驱动一样,需要借助功率器件得到较大电流以满足负载的需要。
开发板上步进电机驱动器是SOP16封装的高电压、大电流达林顿晶体管阵列ULN2003。
ULN2003由7对NPN达林顿管组成,其逻辑框图和每对达林顿管的示意图如图5.7.3所示。
图5.7.3ULN2003的逻辑框图及示意图
ULN2003共有16个引脚,1B和1C是第一对达林顿管的输入和输出,一共有7对。
8引脚E是芯片的地,每一对达林顿管的输出上接了一个二极管,二极管的负极与达林顿的输出相连,正极连接在一起然互与9引脚COM相连。
从图5.7.3达林顿管的示意图中可以看出,ULN2003的输入和输出之间是一个集电极开路的NPN达林顿管,驱动负载接在电源和达林顿管之间。
输入和输出呈反相关系,当输入为低电平,达林顿管截止,集电极高电平,负载上没有电流;当输入为高电平,达林顿管饱和导通,集电极低电平,负载上有电流通过。
如果负载为感性负载,如继电器、电机等,则9引脚COM需连接负载的电源,这相当于在感性负载两端并接了一个反向的二极管,用于释放反峰电压,防止反峰电压击穿达林顿管。
ULN2003的每对达林顿管的输入都有一个2.7k的串联电阻,可以直接与TTL或COM器件相连。
ULN2003的输出电压最高达到50V,单路集电极额定电流为500mA,特别适合驱动多路小型继电器和多相小电流步进电机。
开发板上ULN2003驱动步进电机的电路如图5.7.4所示。
图5.7.4ULN2003驱动步进电机电路
图5.7.4ULN2003电路
5、28BYJ-48步进电机的程序实现
尽管28BYJ-48步进电机的名称上标识驱动方式为八拍,实际上,单四拍和双四拍依然适用于该步进电机。
我们先从简单的双四拍和单四拍入手,编写简单的程序让电机转动起来,并从中摸索出一些步进电机的特性。
(1)双四拍驱动
表5.7.2是按照双四拍方式(AB→BC→CD→DA)建立的电机驱动码值表,P0口低四位分别与电机的A、B、C、D相连接。
由于ULN2003的输入和输出为反相关系,所以IO口高电平,电机绕组通电,低电平则绕组不通电。
表5.7.2双四拍码值表
对应接口
1
2
3
4
5红(5V)
+
+
+
+
4橙(P00)
1
0
0
1
3黄(P01)
1
1
0
0
2粉(P02)
0
1
1
0
1蓝(P03)
0
0
1
1
P0
0x03
0x06
0x0C
0x09
下面是按照双四拍的驱动方式编写的上电后步进电机旋转一周的程序。
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharcodeTableREV[]={0x03,0x06,0x0c,0x09};//反转码值
ucharcodeTableFWR[]={0x03,0x09,0x0c,0x06};//正转码值
voidDelayMs(uintxms)//ms级延时
{
uinti,j;
for(i=0;i for(j=0;j<122;j++); } voidmain() { uinti=0; ucharj=0; for(i=0;i<512;i++)//转动一周需512个循环 { for(j=0;j<4;j++)//4相循环一次 { P0=TableFWR[j]; DelayMs(5);//每一相之间的延时 } } while (1); } 程序很简单,不需要过多解释。 将程序编译下载后烧录到单片机中,电机并没有如我们所愿转动起来,用手摸一下电机,电机嗡嗡的振动,但电机轴不动。 将程序中的每一相之间5ms的延时改为8ms延时,再编译下载,电机终于终于转动起来,而且正好转动一周。 这说明我们的程序逻辑上没有问题,增大相与相之间延时就能使电机转动。 如果细究起来,涉及到步进电机的两个特性(其它类型电机也有这样的特性)。 第一,步进电机的输出力矩和转速成反比,转速越高,输出力矩越小,反之,转速越低,则力矩越大。 第二,步进电机启动时,要让电机从静止到运动起来,由于惯性的存在,启动力矩要大于运转后的力矩。 程序中延时从5ms改为8ms后,电机的转速降低,输出力矩加大,克服了电机启动时的阻力,电机开始转动。 电机步进电机有一个技术参数: 最大空载启动频率,即步进电机在空载情况下能够正常启动的最大脉冲频率,如果脉冲频率高于该值,电机不能正常启动,可能发生丢步或堵转的现象,延时为5ms时电机嗡嗡响即为电机堵转。 在有负载的情况下,启动力矩更大,启动频率应更低。 如果要使电机达到高速转动,脉冲频率应该有加速过程,即启动频率较低,然后按一定加速度升到所希望的高频(电机转速从低速升到高速)。 在程序中,有两个码值表,其中一个是TableFWR[],另外一个是TableREV[]。 TableREV[]中的数据正好是TableFWR[]中的数据的逆序。 P0口送TableREV[]中的码值,电机反转,如果要让电机正转,只要往P0口送TableFWR[]的码值即可。 (2)单四拍方式驱动 单四拍的驱动方式只需要修改TableFWR[]中的数据即可。 按照单四拍的驱动方式(A→B→C→D),反转码值为{0x01,0x02,0x04,0x08};正转码值为{0x01,0x08,0x04,0x02},相之间延时不作改动,为8ms。 将程序烧录到单片机中,电机没有转动。 将延时加大,改为每相之间20ms的延时,电机转动。 步进电机启动时需要克服的阻力是一定的,在双四拍方式下,8ms的延时,电机就能转动,而在单四拍方式下,只有进一步增大延时,降低电机运行频率来提高电机的输出转矩才能克服阻力让电机转动起来。 这个实验证明了在同样频率下,单四拍的输出转矩要小于双四拍的输出转矩,验证了我们之前讲过的结论。 5.7.3任务实施 1、 (1)步进电机驱动芯片ULN200接口: P0 (2)3个独立按键: 按键A: P2.0;按键B: P2.1;按键C: P2.2 接口定义 2、工程结构和主函数 工程结构如图5.7.5所示: 图5.7.5工程结构图 除了主函数模块,程序中包含了独立按键模块、步进电机驱动模块、按键键值处理模块和定时器模块。 下面是主函数的内容(main.c): #include"MicroDefine.h" #include"Timer0.h" #include"IndependentKey.h" #include"SMotorDrive.h" #include"KeyProcess.h" /************************************************************************** *函数名称: main() *功能: 主函数 *入口参数: 无 *出口参数: 无 *说明: 按键设定方向和转动角度,并使能电机运转 **************************************************************************/ voidmain() { ucharCnt1Ms=0;//1ms计数器 ucharKeyValue=0;//按键键值 Timer0Init();//定时器0初始化 while (1) { if(FlagSystem1Ms==1)//1ms时标信号到 { FlagSystem1Ms=0; if(++Cnt1Ms>=10)//10ms扫描一次按键 { Cnt1Ms=0; KeyValue=KeyGetValue();//读取按键值 KeyProcess(KeyValue);//键值处理 } } } } 3、各个功能模块 1、独立按键检测模块(和之前的一样,3个按键,省略) 2、键值处理模块 KeyProcess.h: #ifndef_KEYPROCESS_H_ #define_KEYPROCESS_H_ #include #include"MicroDefine.h" //变量声明 externbitStepStatus;//电机状态标志位 externbitStepCircleDir;//电机方向标志位 externuintStepCircleNum;//电机转动多少个8拍 //函数声明 externvoidKeyProcess(ucharKeyValue);//键值处理 #endif KeyProcess.c: #include"KeyProcess.h" bitStepStatus=0;//步进电机状态标志位0: 电机停1: 电机转动 bitStepCircleDir=0;//步进电机方向标志位0: 顺时针转动1: 逆时针转动 uintStepCircleNum=128;//步进电机转动多少个8拍,初始值为128个8拍(90度) /*************************************************************************** *函数名称: KeyProcess() *功能: 键值处理函数 *入口参数: 无 *出口参数: 无 *说明: ***************************************************************************/ voidKeyProcess(ucharKeyValue) { staticucharAngleNum=0;//角度计数器 uintStepAngle;//步进角度 if(StepStatus==0)//电机处于停止状态,才可以调整 {//方向和角度 if(KeyValue==0x81)//按键A,改变转动方向 StepCircleDir=! StepCircleDir; if(KeyValue==0x82)//按键B,改变运转角度,3级角度 { AngleNum+=3; AngleNum++; AngleNum%=3; if(AngleNum==0)StepAngle=90; elseif(AngleNum==1)StepAngle=180; elseStepAngle=360;//根据角度,计算多少个8拍 StepCircleNum=(longint)StepAngle*1000000/703125; } if(KeyValue==0x83)//按键C,电机启动 { StepStatus=1;//启动电机 } } } 程序解释: 只有电机停止时,才能对3个独立按键的键值进行处理。 按键A,改变电机转向;按键B,选择电机转动角度(90,180,360);按键C,启动电机。 3、步进电机驱动模块 SMotorDrive.h: #ifndef_SMOTORDRIVE_H_ #define_SMOTORDRIVE_H_ #include #include"MicroDefine.h" #include"KeyProcess.h" #defineStepDataP0 //函数声明 externvoidStepMotorRun();//步进电机转动函数 #endif SMotorDrive.c: #include"SmotorDrive.h" //电机运转使能 ucharcodeTableFWR[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//8拍反转 ucharcodeTableREV[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};//8拍正转 /************************************************************************** *函数名称: StepMotorRun() *功能: 步进电机驱动 *入口参数: 无 *出口参数: 无 *说明: 20ms扫描一次 **************************************************************************/ voidStepMotorRun() { staticuchari=0; staticuintj=0; if(StepStatus==1)//电机使能 { if(StepCircleDir)//根据方向选择码值 StepData=TableFWR[i];//正转 else//反转 StepData=TableREV[i]; if(++i>=8)//一个循环 { i=0; if(++j>=StepCircleNum)//循环到,电机停 { j=0; StepStatus=0; } } } } 程序解释: (1)步进电机以8拍的方式运行,数组TableFWR[]和数组TableREV[]是8拍的状态值。 StepMotorRun()函数放在定时器中断服务函数中运行,间隔20ms运行一次。 (2)按键C按下,电机状态标志位(StepStatus)置1,StepMotorRun()函数中,检测到运行标志位置1,按照电机方向标志位(StepCircleDir),送出码值。 8拍为1个循环,到达设定循环数(StepCircleNum)后,电机状态标志位(StepStatus)清零,电机停止转动。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 任务 58 步进 电机 驱动 资料