任务58步进电机的驱动.docx
《任务58步进电机的驱动.docx》由会员分享,可在线阅读,更多相关《任务58步进电机的驱动.docx(15页珍藏版)》请在冰豆网上搜索。
![任务58步进电机的驱动.docx](https://file1.bdocx.com/fileroot1/2022-12/12/159a675d-fb0f-4546-acc4-f3d1a39f5030/159a675d-fb0f-4546-acc4-f3d1a39f50301.gif)
任务58步进电机的驱动
任务5.8步进电机的驱动
5.7.1任务介绍
直流电机通电后是连续转动的,转速高,惯性大,不适合于用于准确定位的场合。
步进电机是一种将电脉冲转化成角位移的执行机构,当步进电机驱动器接收到一个脉冲信号,就会驱动步进电机按设定的方向转动一个固定的角度,通过控制脉冲个数,就可以达到准确定位的目的。
步进电机广泛应用于机械、电子、纺织等行业,如切割机、包装机、雕刻机、电脑绣花机、计算器外设、办公自动化等产品都有步进电机的身影。
本节的任务是:
A,步进电机转
再次按下,步进电机反转;按键
B,步进电机正转,
30、60和90。
有三个按键,分别用来控制步进电机的启停、转向和转动角度。
按下按键动,再次按下,步进电机停止;按下按键C控制步进电机的转动一次角度,分别为
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相磁极,
并力图按磁阻最小的路径闭合,这就使转子受到反应转矩(磁阻转矩)的作用而转动,直到磁极上的齿与转子齿对齐,恰好转子转过3°,此时A、C磁极下的齿又分别与转子齿错开三
分之一齿距。
接着停止对B相绕组通电,而改为C相绕组通电,同理受反应转矩的作用,转
子按顺时针方向再转过3°。
依次类推,当3相绕组按AtBtCtA顺序循环通电时,转子会按顺时针方向,以每个通电脉冲转动30的规律步进转动起来。
若改变通电顺序,按AtCtB
ta顺序循环通电,则转子就按逆时针方向以每个通电脉冲转动3°的规律转动。
2、步进电机的驱动方式
3相绕组按2BtSa顺序循环通电,每一瞬间只有一相绕组通电,称为单三拍运行方式,单三拍运行时的步矩角3°。
除了“单3拍”,步进电机还可以以双三拍和单双6拍的方
式运行。
双3拍指的是在通电瞬间,两相绕组同时通电,其通电顺序为:
AB^BCTCAtAB,
和单3拍相比较,步距角相同,但力矩要大于单3拍。
单双6拍的通电顺序为:
AtAbtBt
BCTCtcata,实际上是单3拍和双3拍的结合,力矩要比单3拍大,步矩角比单三拍和双三拍减小一半,因此六拍的工作方式既可以保持较高的转矩,又可以调高控制精度。
3、28BYJ-48步进电机
开发板上配置的步进电机型号为28BYJ-48,图5.7.2(a)是28BYJ步进电机的外形,(b)
(a)
是电机绕组接线方式。
(b)
图5.7.228BYJ步进电机外形及绕组接线方式
它是一个四相八拍电机,电压为5V。
28代表电机的外径为28mmB表示步进电机,丫表
电机内部带有减速齿轮,减速齿轮转动64圈,电机的轴才转动一圈,这样最小步距角度为
5.625/64就不难理解了。
表5.7.128BYJ-48步进电机参数
电机型号
V
相电阻GITOZ
费距角度
减迷比
起动转矩'
1'.S
£cm
起动顽率
P.P.S
定悅转拒
g・cm
£.cm
电强度
jmj-
5
4
300
5,625/64
1:
64
<300
>550
m300
=*
^35
S00VAC
按照8拍驱动万式,每一拍电机转动的角度为5.625/64=0.087890625,程序中一个循环
为8拍,则一个循环转动的角度为0.703125,电机转动一圈,需要的循环数为512。
如果按
照4拍的驱动方式,则每一拍的角度为加倍,但一个循环中为4拍,拍数减少了一半,需要
的循环次数同样为512。
4、高电压、大电流达林顿晶体管阵列ULN2003
单片机驱动步进电机,和之前讲到过的继电器、直流电机的驱动一样,需要借助功率器
件得到较大电流以满足负载的需要。
开发板上步进电机驱动器是SOP16封装的高电压、大电
流达林顿晶体管阵列ULN2003
ULN2003由7对NPN达林顿管组成,其逻辑框图和每对达林顿管的示意图如图5.7.3所示。
I
ULN2003共有16个引脚,1B和1C是第一对达林顿管的输入和输出,一共有7对。
8引脚E是芯片的地,每一对达林顿管的输出上接了一个二极管,二极管的负极与达林顿的输出相连,
正极连接在一起然互与9引脚COMf连。
从图5.7.3达林顿管的示意图中可以看出,ULN2003的输入和输出之间是一个集电极开路的NPN达林顿管,驱动负载接在电源和达林顿管之间。
输入和输出呈反相关系,当输入为低电平,达林顿管截止,集电极高电平,负载上没有电流;当输入为高电平,达林顿管饱和导通,集电极低电平,负载上有电流通过。
如果负载为感性负载,如继电器、电机等,则9引
2.7k的串联电阻,可以直接与TTL或COM器件单路集电极额定电流为500mA特别适合驱动多路
ULN2003驱动步进电机的电路如图5.7.4所示。
脚COM需连接负载的电源,这相当于在感性负载两端并接了一个反向的二极管,用于释放反峰电压,防止反峰电压击穿达林顿管。
ULN2003的每对达林顿管的输入都有一个相连。
ULN2003的输出电压最高达到50V,小型继电器和多相小电流步进电机。
开发板上
U14
■IB■汨
IC
礼
•7ft
7C
•GND
COM
6
7
巨
TT
VCCJP24
2
4
7
f;
J0
vcc
7
£
图5.7.4ULN2003丸驱动步进电机电路
图5.7.4ULN2003电路
5、28BYJ-48步进电机的程序实现
尽管28BYJ-48步进电机的名称上标识驱动方式为八拍,实际上,单四拍和双四拍依然适用于该步进电机。
我们先从简单的双四拍和单四拍入手,编写简单的程序让电机转动起来,并从中摸索出一些步进电机的特性。
(1)双四拍驱动
表5.7.2是按照双四拍方式(A4CDHDA建立的电机驱动码值表,P0口低四位分
别与电机的AB、CD相连接。
由于ULN2003的输入和输出为反相关系,所以10口高电平,电机绕组通电,低电平则绕组不通电。
表5.7.2双四拍码值表
对应接口
1
2
3
4
5红(5V)
+
+
+
+
4橙(P00)
1
0
0
1
3黄(P01)
1
0
0
2粉(P02)
0
1
1
0
1蓝(P03)
0
0
1
1
P0
0x03
0x06
0x0C
0x09
F面是按照双四拍的驱动方式编写的上电后步进电机旋转一周的程序。
#inelude
#defineuintunsignedint
#defineucharunsignedchar
ucharcodeTableREV[]={0x03,0x06,0x0c,0x09};//ucharcodeTableFWR[]={0x03,0x09,0x0c,0x06};//voidDelayMs(uintxms)
{
uinti,j;
for(i=0;ifor(j=0;j<122;j++);
}
voidmain()
{
uinti=0;
ucharj=0;
for(i=0;i<512;i++)
{
for(j=0;j<4;j++)
{
P0=TableFWR[j];
DelayMs(5);//
}
}
while
(1);
}
反转码值
正转码值
//ms
级延时
//
//4
转动一周需
512个循环
相循环一次
每一相之间的延时
程序很简单,不需要过多解释。
将程序编译下载后烧录到单片机中,电机并没有如我们所愿转动起来,用手摸一下电机,电机嗡嗡的振动,但电机轴不动。
将程序中的每一相之间5ms的延时改为8ms延时,再编译下载,电机终于终于转动起来,而且正好转动一周。
这说明我们的程序逻辑上没有问题,增大相与相之间延时就能使电机转动。
如果细究起来,涉及到步进电机的两个特性(其它类型电机也有这样的特性)。
第一,步
进电机的输出力矩和转速成反比,转速越高,输出力矩越小,反之,转速越低,则力矩越大。
第二,步进电机启动时,要让电机从静止到运动起来,由于惯性的存在,启动力矩要大于运转后的力矩。
程序中延时从5ms改为8ms后,电机的转速降低,输出力矩加大,克服了电机
启动时的阻力,电机开始转动。
电机步进电机有一个技术参数:
最大空载启动频率,即步进电机在空载情况下能够正常启动的最大脉冲频率,如果脉冲频率高于该值,电机不能正常启动,可能发生丢步或堵转的现象,延时为5ms时电机嗡嗡响即为电机堵转。
在有负载的情况下,启动力矩更大,启动频率应更低。
如果要使电机达到高速转动,脉冲频率应该有加速过程,即启动频率较低,然后按一定加速度升到所希望的高频(电机转速从低速升到高速)
在程序中,有两个码值表,其中一个是TableFWR[],另外一个是TableREV[]。
TableREV[]中的数据正好是TableFWR[]中的数据的逆序。
P0口送TableREV[]中的码值,电机反转,如果要让电机正转,只要往P0口送TableFWR[]的码值即可。
(2)单四拍方式驱动
单四拍的驱动方式只需要修改TableFWR[]中的数据即可。
按照单四拍的驱动方式(ZB
;正转码值为{0x01,0x08,0x04,0x02},相之间
电机没有转动。
将延时加大,改为每相之间
73D),反转码值为{0x01,0x02,0x04,0x08}延时不作改动,为8ms3将程序烧录到单片机中,20ms的延时,电机转动。
在双四拍方式下,8ms的延时,电机就能转动,
步进电机启动时需要克服的阻力是一定的,而在单四拍方式下,只有进一步增大延时,降低电机运行频率来提高电机的输出转矩才能克服阻力让电机转动起来。
这个实验证明了在同样频率下,单四拍的输出转矩要小于双四拍的输出转矩,验证了我们之前讲过的结论。
5.7.3任务实施
1、接口定义
(1)步进电机驱动芯片ULN200接口:
P0
(2)3个独立按键:
按键A:
P2.0;按键B:
P2.1;按键C:
P2.2
2、工程结构和主函数
国QTcirgct1自TUser
!
I
;|±|
占已
由
工程结构如图5.7.5所示:
I匀mair.c
Hardware
向IndcpcndentKcy.c園SMotorDrive,c
由園Keyprocess.cbhi-圉TlmerO.c:
图5.7.5工程结构图
除了主函数模块,程序中包含了独立按键模块、步进电机驱动模块、按键键值处理模块和定时器模块。
F面是主函数的内容(main.c):
#include"MicroDefine.h"
#include"Timer0.h"
#include"IndependentKey.h"
#include"SMotorDnve.h"
#include"KeyProcess.h"
/**************************************************************************
*函数名称:
main()
*功能:
主函数
*入口参数:
无
*出口参数:
无
*说明:
按键设定方向和转动角度,并使能电机运转
**************************************************************************/
voidmain()
{
ucharCnt1Ms=0;
ucharKeyValue=0;
Timer0lnit();
while
(1)
{
if(FlagSystem1Ms==1)
{
//
//1ms
//
//1ms
FlagSystem1Ms=0;if(++Cnt1Ms>=10){
Cnt1Ms=0;
KeyValue=KeyGetValue();//
KeyProcess(KeyValue);//
}
//10ms
计数器
按键键值
定时器0初始化
时标信号到
扫描一次按键
读取按键值键值处理
各个功能模块
1、
2、
独立按键检测模块(和之前的一样,
键值处理模块
3个按键,省略)
KeyProcess.h:
#ifndef_KEYPROCESS_H_#define_KEYPROCESS_H#include#include"MicroDefine.h"//变量声明externbitStepStatus;externbitStepCircleDir;externuintStepCircleNum;
//函数声明
externvoidKeyProcess(ucharKeyValue);//#endif
//
//
//
电机状态标志位
电机方向标志位
电机转动多少个8拍
键值处理
KeyProcess.c:
#include"KeyProcess.h"
bitStepStatus=0;//
bitStepCircleDir=0;//
uintStepCircleNum=128;//
步进电机状态标志位
步进电机方向标志位
步进电机转动多少个
0:
电机停1:
电机转动
0:
顺时针转动1:
逆时针转动
8拍,初始值为128个8拍(90度)
/***************************************************************************
*函数名称:
KeyProcess。
*功能:
键值处理函数
*入口参数:
无
*出口参数:
无
*说明:
***************************************************************************/
voidKeyProcess(ucharKeyValue){
staticucharAngleNum=0;uintStepAngle;
if(StepStatus==0)
{
//
//
//
//
if(KeyValue==0x81)
StepCircleDir=!
StepCircleDir;
if(KeyValue==0x82)//
{
AngleNum+=3;
AngleNum++;
AngleNum%=3;
if(AngleNum==0)StepAngle=90;
elseif(AngleNum==1)StepAngle=180;
elseStepAngle=360;//
//
角度计数器
步进角度
电机处于停止状态,才可以调整方向和角度
按键A,改变转动方向
按键B,改变运转角度,3级角度
根据角度,计算多少个8拍
StepCircleNum=(longint)StepAngle*1000000/703125;}if(KeyValue==0x83){
StepStatus=1;
}
//
//
按键C,电机启动
启动电机
程序解释:
只有电机停止时,才能对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"SmotorDnve.h"
//
电机运转使能
ucharcodeTableFWR[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//8ucharcodeTableREV[]={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;
}
}
}
}
一个循环
//
循环到,电机停
StepMotorRun()函数放在定时器中断服务函数中运行,间隔
(2)按键C按下,电机状态标志位(StepStatus)运行标志位置1,按照电机方向标志位(StepCircleDir设定循环数(StepCircleNum)后,电机状态标志位(
程序解释:
(1)步进电机以8拍的方式运行,数组TableFWR[]和数组TableREV[]是8拍的状态值。
I20ms运行一次。
置1,StepMotorRun()函数中,检测到
),送出码值。
8拍为1个循环,到达StepStatus)清零,电机停止转动。