步进电机.docx
- 文档编号:11126989
- 上传时间:2023-05-29
- 格式:DOCX
- 页数:27
- 大小:180.43KB
步进电机.docx
《步进电机.docx》由会员分享,可在线阅读,更多相关《步进电机.docx(27页珍藏版)》请在冰点文库上搜索。
步进电机
目录
绪论1
1软件简介1
1.1Keil软件1
1.2Proteus仿真软件1
2设计原理与方法2
2.1单片机概述2
2.2步进电机介绍3
2.3系统设计4
3系统硬件设计5
3.1单片机引脚说明5
3.2驱动芯片ULN20036
3.3LCD1602液晶显示7
3.4按键输入模块8
3.5系统硬件设计9
4程序框图10
5资源分配10
6源程序11
7性能分析20
7.1仿真调试20
7.2性能分析21
8心得体会22
9参考文献23
本科生课程设计成绩评定表24
绪论
工业控制系统中,由于步进电机具有良好的步进电机,最适合于数字控制,通常通过步进电机控制机械部件评议和转动。
单片机以其较小的体积、低成本、高可靠性、高附加值等优点实现了过去一个很复杂的电路所能实现的功能,因而被广泛的应用,也取代了经典的控制系统;步进电机是一种将电脉冲转变为角位移的执行机构,可通过控制脉冲数来控制角位移量,从而达到准确的定位目的,也可通过控制脉冲的频率来控制电机的转速和加速度。
本次课程设计了一种步进电机的控制系统,使用C51单片机控制步进电机,由单片机控制步进电机,由单片机产生驱动脉冲信号,通过键盘设定步进电机的步进方向和步进速度和步进角度,并同时在液晶显示器上显示步进角度、步进速度和步进方向,并通过仿真软件Proteus对系统进行仿真和测试。
整个系统采用模块化设计,结构简单可靠。
1软件简介
1.1Keil软件
KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。
Keil软件的优点:
1.KeilC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。
在开发大型软件时更能体现高级语言的优势。
2.与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
用过汇编语言后再使用C来开发,体会更加深刻。
KeilC51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。
1.2Proteus仿真软件
ProteusISIS是英国Labcenter公司开发的电路分析与实物仿真软件。
它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路,该软件的特点是:
a.实现了单片机仿真和SPICE电路仿真相结合。
b.支持主流单片机系统的仿真。
c.提供软件调试功能。
d.具有强大的原理图绘制功能。
Proteus可提供的资源十分丰富,包括仿真元器件资源:
仿真数字和模拟、交流和直流等数千种元器件,有30多个元件库;仿真仪表资源:
示波器、逻辑分析仪、虚拟终端、SPI调试器、I2C调试器、信号发生器、模式发生器、交直流电压表、交直流电流表。
Proteus还提供了一个图形显示功能,可以将线路上变化的信号,以图形的方式实时地显示出来,其作用与示波器相似,但功能更多。
这些虚拟仪器仪表具有理想的参数指标,例如极高的输入阻抗、极低的输出阻抗。
这些都尽可能减少了仪器对测量结果的影响。
2设计原理与方法
2.1单片机概述
单片机是在一块芯片中集成了CPU、RAM、ROM、定时/计数器和多功能I/O口等计算机所需要的基本功能部件的大规模集成电路,又称MCU。
51系列单片机内包含下列几部件:
(1)一个8位CPU;
(2)一个片内振荡器及时钟电路;
(3)4KBROM程序存储器;
(4)128BRAM数据存储器;
(5)可寻址64KB外部数据存储器和64KB外部程序存储空间的控制电路;
(6)32条可编程的I/O线(4个8位并行I/O端口);
(7)两个16位的定时/计数器;
(8)一个可编程的全双工串行口;
(9)5个中断源、两个优先级嵌套中断结构。
51系列单片机内部结构如图2-1所示。
图2-151系列单片机内部结构框图
2.2步进电机介绍
步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。
在非超载的情况下,电机的转速、停止的位置取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。
这一线性关系的存在,加上步进电机只有周期性的误差而无累计误差等特点,使得步进电机在速度、位置等控制领域的控制操作非常简单。
虽然步进电机应用广泛,但它并不像普通的直流和交流电机那样在常规状态下使用,它必须由双环形脉冲信号、功率驱动电路等组成控制系统方可使用。
因此,用好步进电机也非易事,它涉及机械、电机、电子及计算机等许多专业知识。
步进电机有三线式、五线式、六线式,但其控制方式均相同,都要以脉冲信号电流来驱动。
假设每旋转一圈需要200个脉冲信号来励磁,可以计算出每个励磁信号能使步进电机前进1.8º,其旋转角度与脉冲个数成正比。
步进电机的正、反转由励磁信号产生的顺序来控制。
六线四相步进电机比较常见的,它有四条励磁信号引线
、B、C、D,通过控制这4条引线上励磁脉冲产生的时刻即可控制步进电机的转动。
每出现一个脉冲信号,步进电机只走一步。
因此,只要依序不断送脉冲信号,步进电机就能实现连续转动。
四相四拍运行方式:
AB—BC—CD—DA—AB;
四相八拍运行方式:
A—AB—B—BC—C—CD—D—DA—A;
步进电机的励磁方式有半步励磁与全步励磁两种,对于步进电机四拍运行时为全步励磁方式,步距角为1.8度,八拍运行时为半步励磁方式,步距角为0.9度。
步距角越小控制精度越高。
对于反应式步进电机转速与脉冲频率的关系为:
式中:
为脉冲频率,单位是HZ。
N为电机运行拍数、z为转子齿数。
对于反应式步进电机的步距角
为:
式中:
N为步进电机运行拍数,z为转子齿数。
对于二四相电机齿数一般为50。
2.3系统设计
本设计实现一个基于C51单片机控制的4相步进电机系统,由单片机产生驱动脉冲信号,步进电机的驱动器收到脉冲信号后,步进电机将会按照设定的方向转动一个固定的方向,将电脉冲转化成角位移。
电机运行方式有四相四拍方式和四相八拍方式,步距角不同,通过控制脉冲信号来控制;电机的转速由脉冲信号频率来控制决定,可以通过控制脉冲的个数来控制角位移量,从而达到调速的目的;电机分为正转和反转,通过控制脉冲信号的变换顺序来实现;同时在液晶显示器上显示步进角度、步进速度和步进方向。
其中电机的步进速度并不是准确的速度显示,只是象征性的显示转速来表示步进电机的速度快慢。
系统框图如图2-2所示。
图2-2系统框图
3系统硬件设计
3.1单片机引脚说明
可总线扩展的单片机有44个引脚的方形封装和40个引脚的双列直插式封装形式,最常用的40个引脚封装,如图3-1所示,各个引脚的功能说明如下。
图3-151单片机引脚
Vss:
接地端。
Vcc:
电源端,接+5V。
XTAL1,XTAL2:
接外部晶体或外部时钟信号。
RST/VPD:
①复位信号输入。
②接备用电源。
掉电后,在低功耗条件下保持内部RAM中的数据。
ALE/PROG:
①ALE地址锁存允许。
ALE输出脉冲的频率为振荡频率的1/6。
②PROG对8751单片机片内EPROM编程时,编程脉冲由该引脚引入。
PSEN:
程序存储器允许。
输出读外部程序存储器的选通信号。
EA/VPP:
①EA=0,单片机只访问外部程序存储器。
EA=1,单片机访问内部程序存储器。
②在8751单片机片内EPROM编程期间,此引脚引入21V编程电源VPP。
P0.0~P0.7:
P0口,数据/低八位地址复用总线端口。
P1.0~P1.7:
P1口,静态通用端口。
P2.0~P2.7:
P2口,高八位地址总线端口。
P3.0~P3.7:
P3口,双功能静态端口。
3.2驱动芯片ULN2003
ULN2003是一种高耐压、大电流的达林顿陈列,由七个NPN达林顿管组成。
每一对达林顿都串联一个2.7K的基极电阻,在5V的工作电压下与TTL和CMOS电路直接相连,可以直接处理需要标准缓冲器来处理的数据。
ULN2003的内部结构如图3-2所示,灌电流可达500mA,并且在关态时能够承受50V的电压,可以再高负载电流下并行输出运行。
ULN2003的引脚图如图3-3所示
图3-2ULN2003内部结构
图3-3ULN2003的引脚图
3.3LCD1602液晶显示
1602LCD主要技术参数:
a.显示容量:
16*2个字符;b.芯片工作电压:
4.5—5.5V;
c.工作电流:
2.0mA(5.0V);d.字符尺寸:
2.95*4.35(W*H)mm;
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表2-1所示:
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
数据
2
VDD
电源正极
10
D3
数据
3
VL
液晶显示偏压
11
D4
数据
4
RS
数据/命令选择
12
D5
数据
5
R/W
读/写选择
13
D6
数据
6
E
使能信号
14
D7
数据
7
D0
数据
15
BLA
背光源正极
8
D1
数据
16
BLK
背光源负极
表3-11602LCD引脚说明
1602液晶模块内部的控制器共有11条控制指令,其模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。
指令1:
清显示,指令码01H,光标复位到地址00H位置。
指令2:
光标复位,光标返回到地址00H。
指令3:
光标和显示模式设置I/D:
光标移动方向,高电平右移,低电平左移;S:
屏幕上所有文字是否左移或者右移。
高电平表示有效,低电平则无效。
指令4:
显示开关控制。
D:
控制整体显示的开与关,高电平表示开显示,低电平表示关显示;C:
控制光标的开与关,高电平表示有光标,低电平表示无光标;B:
控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:
光标或显示移位S/C:
高电平时移动显示的文字,低电平时移动光标。
指令6:
功能设置命令DL:
高电平时为4位总线,低电平时为8位总线N:
低电平时为单行显示,高电平时双行显示F:
低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
指令7:
字符发生器RAM地址设置。
指令8:
DDRAM地址设置。
指令9:
读忙信号和光标地址BF:
为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:
写数据。
指令11:
读数据。
1602液晶引脚图如图3-4所示。
图3-41602引脚图
3.4按键输入模块
设计中,按键采用非编码键盘系统中独立式按键结构。
按键工作方式均采用扫描方式,通过扫键盘,进行功能转换。
按键输入模块如图3-5所示。
当P3.0按下时,若此时步进电机为运行状态,则电机暂停,若步进电机暂停,则电机启动开始运行;当P3.1按下时,若此时步进电机为正转,则电机反转,若步进电机为反转,则电机正转;当P3.2按下时,若此时步进电机为四相八拍运行方式,则电机转换为四相四拍运行方式,反之亦然。
当P3.3按下时,步进电机加速;当P3.4按下时,步进电机减速。
按键抖动的消除采用软件消抖实现。
图3-5按键输入模块
3.5系统硬件设计
系统硬件设计图如图3-6所示。
图3-6系统硬件设计图
4程序框图
主程序包括系统初始化和一个死循环系统,循环系统内包括键盘扫描模块和脉冲输出模块。
主程序流程图如图4-1所示。
图4-1程序框图
5资源分配
P0口:
LCD1602液晶显示模块数据端
P2.5:
液晶读写选择端
P2.6:
液晶数据命令选择端
P2.7:
液晶使能端
P1.0~P1.3:
步进电机脉冲输入端
P3.0:
步进电机启动/暂停控制端(S1)
P3.1:
步进电机正转/反转控制端(S2)
P3.2:
步进电机四相八拍/四拍运行控制端(S3)
P3.3:
步进电机加速端(S4)
P3.4:
步进电机减速端(S5)
6源程序
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitlcdrw=P2^5;//读写选择端
sbitlcdrs=P2^6;//数据/命令选择端
sbitlcden=P2^7;//使能端
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(RunSpeed);
}
}
if((flag==1)&&(angle==0))
{for(j=0;j<8;j++)
{P1=table2[j];
clock(RunSpeed);
}
}
if((flag==0)&&(angle==1))
{for(j=0;j<4;j++)
{P1=table3[j];
clock(RunSpeed);
}
}
if((flag==1)&&(angle==1))
{for(j=0;j<4;j++)
{P1=table4[j];
clock(RunSpeed);
}
}
}
else
P1=0x00;
}
//****主函数****//
voidmain()
{
init();
DoSpeed(RunSpeed);
Showstate1();
while
(1)
{keyscan();
pulse();
}
}
7性能分析
7.1仿真调试
调试结果如下:
1)在Proteus软件中运行仿真,液晶显示模块显示初始步进电机运行状态如图7-1所示。
2)按下S1按键后为暂停状态如图7-2所示。
3)使用按键是S2、S3调试后,如图7-3所示。
4)按下S4按键后,步进电机加速,如图7-4所示。
5)按下S5按键后,步进电机减速,如图7-5所示。
图7-1步进电机初始状态(正转,八拍,速度17)
图7-2步进电机停止状态
图7-3步进电机运行状态(反转、四拍、速度34)
图7-4步进电机加速后状态
图7-5步进电机减速后状态
7.2性能分析
在本次设计中,实现了通过键盘控制步进电机的起动、正转、反转、加速、减速、四相四拍和四相八拍转换、停止等功能,同时显示当前运行了步进电机的运行状态状态。
总体看来,设计的结果达到了课程设计的要求,且仿真结果良好。
8心得体会
通过这次的课程设计,我们学会很多技能,很多知识:
首先,通过学习Proteus软件和Keil软件,我们又掌握了一门能力,一种技能.这对我们以后的工作以及学习都是影响深远.
基本掌握了使用Proteus和Keil软件进行仿真,我开始完成本次课设中我的任务:
实现通过键盘或遥控器控制步进电机的起动、正转、反转、设置、停止等功能,同时显示当前运行状态。
首先根据单片机的理论知识设计好电路图,然后进行理论分析,使
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 步进 电机
![提示](https://static.bingdoc.com/images/bang_tan.gif)