步进电机设计报告能力拓展训练.docx
《步进电机设计报告能力拓展训练.docx》由会员分享,可在线阅读,更多相关《步进电机设计报告能力拓展训练.docx(25页珍藏版)》请在冰点文库上搜索。
武汉理工大学《能力拓展训练》课程设计说明书
课程设计任务书
学生姓名:
专业班级:
指导教师:
工作单位:
题目:
基于电动机的单片机仿真和C语言开发
初始条件:
本课程设计,要求用使用Proteus仿真软件进行系统设计与仿真。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1、课程设计工作量:
1周内完成对系统的设计、仿真。
2、技术要求:
1)设计一种简单的(步进)电动机(MOTOR)控制模块,实现按键对步进电机的启动、转动、停止或调速等控制。
要求进行电路仿真实验,并使用C语言进行程序的开发。
2)要求学生主动思考,自主发挥,实现系统的特色功能。
3、查阅至少5篇参考文献。
按《武汉理工大学课程设计工作规范》要求撰写设计报告书。
全文用A4纸打印,图纸应符合绘图规范。
提交报告的主要内容:
(使用Proteus7.5sp3)
1)题目
2)仿真所完成的主要功能和特色简介——摘要(特别是自己扩展的功能,根据特色功能评优)
3)Proteus仿真的基本流程
4)所使用芯片以及引脚功能简介(需要提供对应芯片DataSheet的下载链接)
5)设计方案与工作原理,给出仿真电路图
6)实验记录与结果分析
时间安排:
1)2012年7月9日,查阅相关资料,学习设计原理。
2)2012年7月10~11日,方案选择和电路设计仿真。
3)2012年7月12日,设计说明书撰写。
4)2012年7月13日,上交报告,同时进行答辩。
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
目录
1、概论 3
2、设计原理和方法 4
2.1设计原理 4
2.2步进电机的工作原理 4
3、芯片介绍 6
3.1AT89C51介绍 6
3.2LM032L介绍 7
4、系统硬件电路设计 8
4.1系统硬件电路设计图 8
4.2系统硬件电路模块 9
4.2.1键盘接口电路 9
4.2.2LCD显示电路 9
4.2.3驱动电路 10
5、系统软件仿真 10
5.1步进电机转速控制仿真 10
5.2步进电机的转动方向仿真 11
5.3步进电机的启动和停止功能 12
6、源程序 14
7、心得体会 23
8、参考文献 24
1、概论
单片机集成度高,功能强,可靠性高,体积小,功耗低,使用方便,价格低廉等一系列优点,目前已经渗入到人们工作和生活的方方面面,几乎无处不在,无所不为。
单片机的应用领域已经从面向工业控制,通讯,交通,智能仪表等迅速发展到家用消费产品,办公自动化,汽车电子,PC机外围一记网络通讯等广大领域。
单片机有两种基本结构形式:
一种是在通用微型计算机中广泛采用的,将程序存储器和数据存储器合用一个存储器空间的结构,成为普林斯机构。
另一种是将程序存储器个数据存储器截然分开,分别寻址的结构,一般需要较大的程序存储器,目前单片机以采用程序存储器截然分开的结构多。
本课题讨论的占空比可调的信号发生器的核心是目前应用极为广泛的51系列单片机。
Proteus软件是英国Labcenterelectronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司)。
它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。
它是目前最好的仿真单片机及外围器件的工具。
虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。
Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。
是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年又增加了Cortex和DSP系列处理器,并持续增加其他系列处理器模型。
在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。
Proteus软件具有其它EDA工具软件(例:
multisim)的功能。
这些功能是:
1.原理布图
2.PCB自动或人工布线
3.SPICE电路仿真
革命性的特点
1.互动的电路仿真
用户甚至可以实时采用诸如RAM,ROM,键盘,马达,LED,LCD,AD/DA,部分SPI器件,部分IIC器件。
2.仿真处理器及其外围电路
可以仿真51系列、AVR、PIC、ARM、等常用主流单片机。
还可以直接在基于原理图的虚拟原型上编程,再配合显示及输出,能看到运行后输入输出的效果。
配合系统配置的虚拟逻辑分析仪、示波器等,Proteus建立了完备的电子设计开发环境。
2、设计原理和方法
2.1设计原理
步进电机控制是一个比较精确的控制,本次选择用AT89C51单片机来控制ULN2003A驱动器来驱动四相步进电机,使步进电机能够有规律的进行起动、正转、反转、设置、停止等功能,同时显示当前运行状态。
单片机采并受到按键的控制,通过扫面按键的状态来控制步进电机工作。
启动/暂停键和控制步进电机转动的启动或暂停,正转/反转键控制步进电机的转动方向,八拍/四拍键、加速键和减速键一起控制步进电机的转动速度。
下面是步进电机控制原理框图:
ULN2003A驱动器
键盘
控制
AT89C51单片机
步进电机
图2.1步进电机控制原理框图
2.2步进电机的工作原理
该步进电机为一四相步进电机,采用单极性直流电源供电。
只要对步进电机的各相绕组按合适的时序通电,就能使步进电机步进转动。
图1是该四相反应式步进电机工作原理示意图。
图1四相步进电机步进示意图
开始时,开关SB接通电源,SA、SC、SD断开,B相磁极和转子0、3号齿对齐,同时,转子的1、4号齿就和C、D相绕组磁极产生错齿,2、5号齿就和D、A相绕组磁极产生错齿。
当开关SC接通电源,SB、SA、SD断开时,由于C相绕组的磁力线和1、4号齿之间磁力线的作用,使转子转动,1、4号齿和C相绕组的磁极对齐。
而0、3号齿和A、B相绕组产生错齿,2、5号齿就和A、D相绕组磁极产生错齿。
依次类推,A、B、C、D四相绕组轮流供电,则转子会沿着A、B、C、D方向转动
当开关SC接通电源,SB、SA、SD断开时,由于C相绕组的磁力线和1、4号齿之间磁力线的作用,使转子转动,1、4号齿和C相绕组的磁极对齐。
而0、3号齿和A、B相绕组产生错齿,2、5号齿就和A、D相绕组磁极产生错齿。
依次类推,A、B、C、D四相绕组轮流供电,则转子会沿着A、B、C、D方向转动。
四相步进电机按照通电顺序的不同,可分为单四拍、双四拍、八拍三种工作方式。
单四拍与双四拍的步距角相等,但单四拍的转动力矩小。
八拍工作方式的步距角是单四拍与双四拍的一半,因此,八拍工作方式既可以保持较高的转动力矩又可以提高控制精度。
单四拍、双四拍与八拍工作方式的电源通电时序与波形分别如图2.a、b、c所示:
a.单四拍b.双四拍c.八拍
图2.步进电机工作时序波形图
步进电机常用的驱动方式是全电压驱动,即在电机移步与锁步时都加载额定电压。
为了防止电机过流及改善驱动特性,需加限流电阻。
由于步进电机锁步时,限流电阻要消耗掉大量的功率,故限流电阻要有较大的功率容量,并且开关管也要有较高的负载能力。
步进电机的另一种驱动方式是高低压驱动,即在电机移步时,加额定或超过额定值的电压,以便在较大的电流驱动下,使电机快速移步;而在锁步时,则加低于额定值的电压,只让电机绕组流过锁步所需的电流值。
这样,既可以减少限流电阻的功率消耗,又可以提高电机的运行速度,但这种驱动方式的电路要复杂一些。
驱动脉冲的分配可以使用硬件方法,即用脉冲分配器实现。
现在,脉冲分配器已经标准化、芯片化,市场上可以买到。
但硬件方法结构复杂,成本也较高。
3、芯片介绍
3.1AT89C51介绍
AT89C51是一种带4K字节FLASH存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机。
AT89C51是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。
AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
引脚排列如图3.1所示。
图3.1AT89C51引脚图
3.2LM032L介绍
LM032L采用标准的14脚接口,其中:
第1脚:
VSS为地电源
第2脚:
VDD接5V正电源
第3脚:
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度
第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
引脚图如图3.2所示。
图3.2LM032L引脚图
4、系统硬件电路设计
4.1系统硬件电路设计图
系统硬件电路原理图如下图4.1所示,5个独立按键分别与单片机相连接控制步进电机的转动速度、方向、启动和停止。
当有按键按下时,键盘扫描程序就会辨认出所按下的键来改变步进电机的工作方式。
通过单片机的P0口连接到LCD032L的数据段,显示步进电机的转动速度、转动方向和八拍四拍工作。
使用ULN2003A驱动器驱动步进电机,接入单片机的P1^0~P1^3端口。
图4.1系统硬件电路设计图
4.2系统硬件电路模块
4.2.1键盘接口电路
小键盘如图4.2.1所示,总共有5个按键。
启动/暂停键接端口P3.0,控制步进电机转动的启动或暂停。
正转/反转键接端口P3.1,控制步进电机的转动方向。
八拍/四拍键接外部中断,控制步进电机的工作方式。
加速键和减速键分别接外部中断1和定时器0,控制步进电机的转动速度。
通过程序实时扫描键盘,并判断当键盘被按下后转到键盘处理子程序中。
图4.2.1键盘接口电路
4.2.2LCD显示电路
LCD选取的是LM032L为20*2的液晶,与单片机的连接电路如下。
其中VSS、VDD接+5V电源,VEE接地。
D0~D7接单片机的P0口。
图4.2.2显示部分电路
4.2.3驱动电路
P1口低四位输出经过非门接入ULN2003A驱动器,来驱动步进电机,如下图4.2.3所示:
图4.2.3步进电机驱动电路
5、系统软件仿真
5.1步进电机转速控制仿真
按下加速键,控制步进电机的转动速度,直到液晶显示器显示SPEED(n/min):
040和AL:
0.9,这个过程中明显看出步进电机转速逐渐增加,如图5.1所示
图5.1.1
同理,按减速键的时候,液晶显示器SPEED(n/min)显示的数字逐渐变小,步进电机转动速度也越来越慢。
控制步进电机转动速度能很好的实现,符合要求。
当然,八拍/四拍键是控制步进电机工作方式的,其作用也是控制步进电机的转动速度。
其中八拍工作方式控制步进电机转动的速度,是四拍工作方式的两倍。
当在八拍工作方式下,控制加速键,使液晶显示器显示SPEED(n/min):
040和AL:
1.8。
如图5.1.2所示
图5.1.2
当再次按下八拍/四拍键,使步进电机的工作方式为四拍,此时液晶显示器显示SPEED(n/min):
020和AL:
0.9。
如图5.1.2所示
图5.1.2
可以明显看出,八拍工作方式控制步进电机转动的速度,是四拍工作方式的两倍。
5.2步进电机的转动方向仿真
步进电机转动方向初始状态为顺时针方向,液晶显示器显示STATE:
ZZ,如图5.2.1所示
图5.2.1
当按下正转/反转键的时候,电动机转动方向为逆时针方向,液晶显示器显示STATE:
FZ,如图5.2.2所示
图5.2.2
再次按下正转/反转键,电动机转动方向改为顺时针方向,从此可以看出,可以很好的控制电动机的顺时针和逆时针转动,符合设计要求。
5.3步进电机的启动和停止功能
当按下启动/暂停键,步进电机停止转动,且液晶显示器显示PAUSE,如下图5.3所示
图5.3.1
当再次按下按下启动/暂停键,步进电机又接着转动,液晶显示器显示和停止之前的内容一样。
如图5.3.2所示
图5.3.2
由此看出,本设计可以很好的控制步进电机的启动和停止功能,符合设计要求。
6、源程序
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitlcdrs=P2^0;//读写选择端
sbitlcdrw=P2^1;//数据/命令选择端
sbitlcden=P2^2;//使能端
ucharSpeedchar[]="SPEED(n/min):
";
ucharStatechar[]="STATE:
";
ucharAnglechar[]="AL:
";
ucharSTATE_CW[]="ZZ";
ucharSTATE_CCW[]="FZ";
ucharAngle1[]="0.9";
ucharAngle2[]="1.8";
ucharSPEED[3]="000";
ucharQT[]="PAUSE";
ucharcodetable1[]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};//八拍正转
ucharcodetable2[]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //八拍反转 、
ucharcodetable3[]={0xf6,0xfc,0xf9,0xf3}; //四拍正转
ucharcodetable4[]={0xf3,0xf9,0xfc,0xf6}; //四拍反转
uintRunSpeed=70;
uinti=0;
uinta=5;
ucharflag=0;//运行状态,正转/反转(0/1)
ucharangle=0;//步距角状态,八拍/四拍(0/1)
ucharpause=0;//启动/暂停(0/1)
voiddelay(uintz)//延时1MS
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_com(ucharcom)//写指令
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_data(uchardate)//写数据
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidinit()//初始化
{
lcdrw=0;
lcden=0;
write_com(0x01);//显示清屏
write_com(0x38);//显示模式设置
write_com(0x0c);//设置开显示,不显示光标
write_com(0x06);//字符时整体不移动
}
//*****LCD状态显示****//
voidShowstate5()
{write_com(0x80+0x0d);
for(i=0;i<3;i++)
{write_data(SPEED[i]);
delay
(1);
}
}
voidShowstate4()
{write_com(0xc9+0x03);
if(angle==0)
{for(i=0;i<3;i++)
{write_data(Angle1[i]);
delay
(1);
}
}
else
{for(i=0;i<3;i++)
{write_data(Angle2[i]);
delay
(1);
}
}
}
voidShowstate3()
{write_com(0xc0+0x06);
if(flag==0)
{for(i=0;i<2;i++)
{write_data(STATE_CW[i]);
delay
(1);
}
}
else
{for(i=0;i<2;i++)
{ write_data(STATE_CCW[i]);
delay
(1);
}
}
}
voidShowstate2()
{write_com(0x01);
write_com(0x80);
for(i=0;i<5;i++)
{write_data(QT[i]);
delay
(1);
}
}
voidShowstate1()
{write_com(0x01);
write_com(0x80);
for(i=0;i<13;i++)
{ write_data(Speedchar[i]);
delay
(1);
}
Showstate5();
write_com(0xc0);
for(i=0;i<6;i++)
{write_data(Statechar[i]);
delay
(1);
}
Showstate3();
write_com(0xc9);
for(i=0;i<3;i++)
{write_data(Anglechar[i]);
delay
(1);
}
Showstate4();
}
//****脉冲延时程序****//
voidclock(uintdelay)
{
for(;delay>0;delay--)
for(i=0;i<220;i++);
}
//***速度显示转化子程序***//
voidDoSpeed(uintspeed)
{SPEED[0]=(200*6/speed/100)+48;
SPEED[1]=(200*6/speed%100/10)+48;
SPEED[2]=(200*6/speed%10)+48;
}
//*****键盘扫描程序******//
voidkeyscan()
{ucharkey;
key=P3;
key=key&0xff;
if(key!
=0xff)
{delay(5);
key=P3;
key=key&0xff;
if(key!
=0xff)
{switch(key)
{case0xfe:
if(pause==0)
{pause=1;
Showstate2();
}
else
{pause=0;
Showstate1();
}
break;
case0xfd:
if(flag==0)
flag=1;
else
flag=0;
Showstate3();
break;
case0xfb:
if(angle==0)
{angle=1;
DoSpeed(RunSpeed/2);
Showstate5();
}
else
{angle=0;
DoSpeed(RunSpeed);
Showstate5();
}
Showstate4();
break;
case0xf7:
if(RunSpeed>=15)
RunSpeed=RunSpeed-a;
if(angle==0)
{DoSpeed(RunSpeed);
Showstate5();
}
else
{DoSpeed(RunSpeed/2);
Showstate5();
}
break;
case0xef:
if(RunSpeed<=100)
RunSpeed=RunSpeed+a;
if(angle==0)
{DoSpeed(RunSpeed);
Showstate5();
}
else
{DoSpeed(RunSpeed/2);
Showstate5();
}
break;
}
while(key!
=0xff)
{ key=P3;
key=key&0xff;
}
}
}
}
//****脉冲输出子程序****//
voidpulse()
{uintj;
if(!
pause)
{if((flag==0)&&(angle==0))
{for(j=0;j<8;j++)
{P1=table1[j];
clock(RunS