基于protues步进电机仿真.docx
《基于protues步进电机仿真.docx》由会员分享,可在线阅读,更多相关《基于protues步进电机仿真.docx(15页珍藏版)》请在冰点文库上搜索。
基于protues步进电机仿真
基于protues的步进电机仿真
课程设计
专业及班级__________________________
姓名_____________________________
学号__________________________________
授课老师_____________________________
完成时间____________________________
基于proteus的步进电机仿真
摘要
步进电机是一种将电脉冲转变为角位移的执行机构,可通过控制脉冲数来控制角位移量。
步进电机广泛应用在生产实践的各个领域。
它最大的应用是在数控机床的制造中,因为步进电机不需要A/D转换,能够直接将数字脉冲信号转化成为角位移,所以被认为是理想的数控机床的执行元件。
本设计利用proteus仿真软件进行电路仿真,系统通过设置六个按键分别控制步进电机的起止、方向、步进速度,使用1602液晶显示以上参数。
整个系统具有稳定性好,实用性强,操作界面友好等优点。
关键词:
proteus 仿真 步进电机 1602
一、整体电路分析
如下图,整个设计以STC89C51单片机为中心,由复位电路,时钟电路,电机驱动,步进电机,显示电路等组成,硬件模块如图1所示:
图1硬件模块图
通过按键进行相应的参数设定,单片机接收到信号后经过判断驱动电机驱动模块,然后由驱动电路驱动步进电机运转,并用LCD显示设置的参数。
二、系统硬件电路选择与设计
1、主控器的选择
本次主控单元使用C51单片机对整个系统进行控制。
STC89C51RC包含512字节RAM、32条I/O口线、3个16位定时/计数器、8输入4优先级嵌套中断结构、1个串行I/O口(可用于多机通信、I/O扩展或全双工UART)以及片内振荡器和时钟电路。
电路图如下:
图2单片机最小系统电路图
2、步进电机选择
步进电机是一种能够将电脉冲信号转换成角位移或线位移的机电元件,它实际上是一种单相或多相同步电动机。
单相步进电动机有单路电脉冲驱动,输出功率一般很小,其用途为微小功率驱动。
多相步进电动机有多相方波脉冲驱动,用途很广。
本设计使用的是四相三拍步进电机,连接图如下:
图3步进电机接线图
3、驱动电路的选择
L297、L298是步进电机专用控制器,它能产生4相控制信号,可用于计算机控制的两相双极和四相单相步进电机,能够用单四拍、双四拍、四相八拍方式控制步进电机。
芯片内的PWM斩波器电路可开关模式下调节步进电机绕组中的电机绕组中的电流。
该集成电路采用了SGS公司的模拟/数字兼容的I2L技术,使用5V的电源电压,全部信号的连接都与TFL/CMOS或集电极开路的晶体管兼容。
图4L297L298
4、键盘输入模块电路
设计中,键盘采用非编码键盘系统中的独立式按键结构。
键盘工作方式采用定时扫描方式。
采用定时器TO定时,通过输出数据,识别按键的工作状态。
键盘主要用来提供人机接口,电路如图3所示,采用独立式按键电路。
按键功定义如下:
当P1.5按下时,步进电机开始启动;当INTO按下时,步进电机停止;当P1.0按下时,步进电机开始加速;当P1.1按下时,步进电机开始减速;当P1.2按下时,步进电机开始正转;当P1.3按下时,步进电机开始反转。
连接图如下:
图5按键接连接图
5、显示电路的
LCD显示模块是把LCD显示屏、背景光源、线路板和驱动集成电路等部件构造成1个整体作为1个独立部件使用,只留1个接口与外部通信。
显示模块通过这个接口接收显示的命令和数据,并按指令和数据的要求进行显示,外部电路通过这个接口读出显示模块的工作状态和显示数据。
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:
阿拉伯数字、英文字母的大小写、常用的符号和日文假名等,每1个字符都有1个固定的代码。
用户对模块写入适当的控制命令,即可完成清屏、显示、地址设置等操作。
设计采用并行方式控制,LCD与单片机的通讯接口电路如图6所示。
图61602显示电路接线图
四、系统软件设计
软件流程图
图7系统流程图
五、总结
本次设计利用仿真软件Proteus及KeilC5l进行调试。
系统实现了可程序设定和显示步进角、步进方向和步进速度,支持用开关量单独控制步进电机的启动和停止、转向、转速。
通过此次课程设计,我不仅学会如何用单片机控制步进电动机,而且在查找资料的过程中也了解了许多课外知识,开拓了视野,使自己在专业知识方面和动手能力方面有了很大的提高,更让我学会了理论与实践的结合。
最后,感谢丁老师的悉心教导以及同学的帮助!
六、附录
(1)整体电路图
(2)程序代码
#include"lcd1602.h"
#defineucharunsignedchar
#defineuintunsignedint
/*************************************************************
**功能:
延时1.64ms**
**参数:
无**
*************************************************************/
voiddelay1_64ms(void)
{
uchari;
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
/*************************************************************
**功能:
延时40us**
**参数:
无**
*************************************************************/
/*voiddelay40us(void)
{
uchari;
for(i=0;i<20;i++)
{
;
}
}*/
/*************************************************************
**功能:
判断LCD忙**
**参数:
无**
*************************************************************/
unsignedcharLcd_Wait(void)
{
while
(1)
{
DBPort=0xff;
LcdEn=0;
_nop_();
LcdRs=0;
_nop_();
_nop_();
LcdRw=1;
_nop_();
_nop_();
LcdEn=1;
_nop_();
_nop_();
_nop_();
_nop_();
if((DBPort&0x80)==0)
{
break;
}
LcdEn=0;
}
//delay40us();
returnDBPort;
}
/**************************************************************
**功能:
写LCD函数**
**参数:
style为写命令/数据,0-命令,1-数据;input为写入的8位**
**命令/数据**
**************************************************************/
voidLcd_Write(bitstyle,unsignedcharinput)
{
LcdEn=0;
_nop_();
_nop_();
LcdRs=style;
_nop_();
_nop_();
LcdRw=0;
DBPort=input;
_nop_();
_nop_();
LcdEn=1;
_nop_();
_nop_();
LcdEn=0;
_nop_();
Lcd_Wait();
}
/****************************************************************
**功能:
LCD清屏函数**
**参数:
无**
****************************************************************/
voidClrScreen(void)
{
Lcd_Write(Lcd_Command,Lcd_Clear_Screen);
//delay1_64ms();
}
/****************************************************************
**功能:
LCD归位函数**
**参数:
无**
****************************************************************/
/*voidScreen_home(void)
{
Lcd_Write(Lcd_Command,Lcd_Home);
//delay1_64ms();
}*/
/***************************************************************
**功能:
设置显示模式**
**参数:
**
***************************************************************/
voidLcd_SetDisplay(unsignedcharDisplayMode)
{
Lcd_Write(Lcd_Command,0x08|DisplayMode);
}
/***************************************************************
**功能:
LCD移动设置**
**参数:
取值如下**
**************************************************************
voidLcd_Move(unsignedcharMoveMode)
{
Lcd_Write(Lcd_Command,0x10|MoveMode);
}
/****************************************************************
**功能:
LCD输入设置**
**参数:
取值如下**
****************************************************************/
voidLcd_SetInput(unsignedcharInputMode)
{
Lcd_Write(Lcd_Command,0x04|InputMode);
}
/****************************************************************
**功能:
LCD初始化**
**参数:
取值如下**
****************************************************************/
voidLcd_Init(void)
{
delay1_64ms();
Lcd_Write(Lcd_Command,0x38);//8位数据端口,2行显示,5*7点阵
Lcd_Write(Lcd_Command,0x38);
Lcd_Write(Lcd_Command,0x38);
Lcd_SetDisplay(Lcd_Display_On);//开启显示,无光标|Lcd_Cursor|Lcd_Flash
//Lcd_Move(Lcd_CursorMove|Lcd_Left);
Lcd_SetInput(Lcd_Ac_Up|Lcd_No_Move);//AC递增,画面不动_To
}
/****************************************************************
**功能:
显示位置设置**
**参数:
x-行;y-列**
****************************************************************/
voidGotoXY(unsignedcharx,unsignedchary)
{
if(y==0)
{Lcd_Write(Lcd_Command,0x80|x);
}
if(y==1)
{Lcd_Write(Lcd_Command,0x80|(x+0x40));
}
}
/****************************************************************
**功能:
LCD显示函数**
**参数:
str-要显示的字符串指针**
****************************************************************/
voidPrint(unsignedchar*str)
{
while(*str!
='\0')
{
Lcd_Write(Lcd_Data,*str);
str++;
}
}
voidprint_char(uchara)
{
if(a>=0&&a<=9)
Lcd_Write(Lcd_Data,a+'0');
elseif(a>=0x0a&&a<=0x0f)
Lcd_Write(Lcd_Data,a+0x37);
}