单片机课程设计步进电机驱动器Word格式.docx

上传人:b****5 文档编号:19133591 上传时间:2023-01-04 格式:DOCX 页数:29 大小:2.67MB
下载 相关 举报
单片机课程设计步进电机驱动器Word格式.docx_第1页
第1页 / 共29页
单片机课程设计步进电机驱动器Word格式.docx_第2页
第2页 / 共29页
单片机课程设计步进电机驱动器Word格式.docx_第3页
第3页 / 共29页
单片机课程设计步进电机驱动器Word格式.docx_第4页
第4页 / 共29页
单片机课程设计步进电机驱动器Word格式.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

单片机课程设计步进电机驱动器Word格式.docx

《单片机课程设计步进电机驱动器Word格式.docx》由会员分享,可在线阅读,更多相关《单片机课程设计步进电机驱动器Word格式.docx(29页珍藏版)》请在冰豆网上搜索。

单片机课程设计步进电机驱动器Word格式.docx

本次设计是采用步进电机28BYJ48型四相八拍电机,电压为DC5V—DC12V。

当对步进电机施加一系列连续不断的控制脉冲时,它可以连续不断地转动。

每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度(一个步距角)。

当通电状态的改变完成一个循环时,转子转过一个齿距。

四相步进电机可以在不同的通电方式下运行,常见的通电方式有单(单相绕组通电)四拍(A-B-C-D-A。

),双(双相绕组通电)四拍(AB-BC-CD-DA-AB-。

),八拍(A-AB-B-BC-C-CD-D-DA-A。

其相序分配表如下:

2.2步进电机24BYJ48的相关电气参数

1.额定电压:

12VDC(另有电压:

5V、6V、24V)

2.相数:

4

3.减速比:

1/64(另有减速比:

1/16、1/32)

4.步距角:

5.625°

/64

5.驱动方式:

4相8拍

6.直流电阻:

200Ω±

7%(25℃)(按客户要求而定:

80、130欧姆)

7.空载牵入频率:

≥600Hz

8.空载牵出频率:

≥1000Hz

9.牵入转矩:

≥34.3mN.m(120Hz)

10.自定位转矩:

≥34.3mN.m

11.绝缘电阻:

>10MΩ(500V)

12.绝缘介电强度:

600VAC/1mA/1S

13.绝缘等级:

A

14.温升:

<50K(120Hz)

15.噪音:

<40dB(120Hz)

16.重量:

大约40g

17.未注公差按:

GB1804-m

18.转向:

CCW

2.3步进电机的基本术语

2.3.1相数

产生不同对极N、S磁场的激磁线圈对数,常用m表示。

2.3.2拍数

完成一个磁场周期性变化所需脉冲数或导电状态用n表示,或指电机转过一个齿距角所需脉冲数,比如说本次设计中使用的24BYJ48有单(单相绕组通电)四拍(A-B-C-D-A。

2.3.3步距角

对应一个脉冲信号,电机转子转过的角位移用θ表示。

θ=360度(转子齿数J*运行拍数),以常规二相,转子齿为50齿电机为例。

四拍运行时步距角为θ=360度/(50*4)=1.8度(俗称整步),八拍运行时步距角为θ=360度/(50*8)=0.9度(俗称半步)。

2.3.4信号分配

四相步进电机按照其通电方式的不同,可以分为单四拍,双四拍和双八拍三种工作方式。

单四拍与双四拍的步距角相等,均为11.25度,而八拍的步距角则是单四拍与双四拍的一半,5.625度。

单(单相绕组通电)四拍(A-B-C-D-A。

),八拍(A-AB-B-BC-C-CD-D-DA-A。

)。

这里选取的是双相八拍的工作方式。

第3章总体设计思路

3.1方案与设计思路

因为步进电机的控制是通过脉冲信号来控制的,将电脉冲信号转变为角位移或线位移的开环控制元件。

所以怎样产生这个脉冲信号和产生怎样的信号是电机控制的关键。

用单片机来产生这个脉冲信号,通过单片机的P1口输出脉冲信号,因为所选电机是四相的,所以只需要P1口的低四位P1.0~P1.3分别接到电机的四根电线上。

定时器定时来调整电机的转速,通过键盘的按钮,就可以改变定时初值从而改变了电机的转速,单片机上P3.2~P3.5连的是按键,这里键盘上的K1键为启动与停止键,K2键为减速键,K3键为加速键,K4键为方向转换键。

P0以及P2.0~P2.2口接LCD1602,可以显示当前的电机转速、运行状态、运行方向和档位。

具体结构见3-1框图。

3.2总框图

图3-1总体设计方框图

第4章程序设计

4.1主程序

进入主程序,首先是对LCD进行初始化,然后依次进行键盘扫描,调用步进电机相关数据显示子函数,若检测到有键按下,则进去相应的处理。

流程图如下图4-1:

4-1图主程序流程图

4.2LCD及档位显示程序

此次设计使用1602液晶显示步进电机运行状态,其效果比用数码管显示要更加明了,也更容易读取相关状态和数据。

液晶上显示有电机运行的状态(RUNNING或STOP)、当前档位(DW)、运行方向("

<

"

或"

>

)以及其运转速度(r/min)。

其显示原理如下图4-2:

图4-2液晶显示流程图

4.3正反转流程图

步进电机的正反转用K4控制,初始化电机为顺时针转,即“》”,每当按下K4键,电机转向改变,具体流程图如下图4-3:

4.4启动与停止流程图

启动与停止是用K1键来控制的,初始化标志位on_off==0,档按下K1,即将on_off置1,每当按下k1,都将在启动与停止间切换,具体流程图如下图4-4:

图4-4启动与停止流程图

第5章硬件设计

5.1硬件的设计与选取

5.1.1步进电机的驱动

步进电机的驱动采用ULN2003,接到单片机的P1.0~P1.3,具体如

图5-1:

图5-1步进电机驱动及其接口图

5.1.2单片机的选取

目前市面上的通用型单片机种类很多,且适合不同应用场合的新产品不断出现,但目前的应用状况,以8位中档MCS-51系列单片机的应用最为普遍。

基于这次课程设计的要求不高,我们可以选用51系列或52系列单片机,其有可靠性高,易于扩展以及实用性好等特点,完全可以满足我们的控制要求。

其图如下5-2:

图5-2AT89C52单片机

5.1.3液晶LCD1602显示模块

P0接液晶的数据传送口,P2.0~P2.2接液晶的控制端口。

其接线图如下图5-3:

图5-3液晶与单片机接口原理图

5.1.4按键电路设计

键盘接口按不同标准有不同分类方法,按键盘排布,可以分为独立方式(一组相互独立的键盘)和矩阵(一行列组成矩阵)方式。

此次设计只用到了四个按键,故可采用独立按键,P3.2~P3.5分别接到K1~K4。

其原理图如下图5-4:

图5-4按键与单片机接口原理图

5.1.5时针产生电路

时针电路部分晶振为11.0592MHz,其原理图如下:

图5-4时针电路

5.2硬件的总体电路连接

图5-5总体原理图

第6章调试与故障分析

6.1软件编写及调试

此次编程及调试是用keil软件进行的,程序的编写及调试步骤如下:

1.根据步进电机24BYJ48的相序,编好正反转相序表,这个是关键,不能编错。

2.定义各个变量及相关液晶显示符:

ucharcodecdis0[]={"

WELCOMETO"

};

ucharcodecdis1[]={"

STEPPINGMOTOR"

ucharcodecdis2[]={"

CONTROLSYSTEM"

ucharcodecdis3[]={"

STOP"

ucharcodecdis4[]={"

DW:

ucharcodecdis5[]={"

RUNNING"

ucharcodecdis6[]={"

r/min"

3.定义各个按键:

sbitK1=P3^2;

//运行与停止

sbitK2=P3^3;

//加速

sbitK3=P3^4;

//减速

sbitK4=P3^5;

//方向转换

sbitBEEP=P3^6;

//蜂鸣器

4.编写各个子程序。

5.编写主程序,进入主程序即开始进行键盘扫描及调用液晶显示。

6.定时器T0的中断服务程序,进入中断,若满足条件,即向步进电机送8个脉冲。

6.2调试过程及相关显示结果

将程序下载到单片机中,LCD初始化显示如下:

之后进入步进电机初始化的画面显示,电机运行状态显示为STOP,档位为5档,开机转速为2.66r/min,如下:

实物图如下:

按下启动键K1后,转向显示出显示"

》"

即电机顺时针转,显示如下:

按K2键一次,档位加一,高位档为10档,此时对应电机转速为最慢,为1.33r/min,如下图:

实物图显示如下:

按下K3键一次,档位减一,低位档为1档,也是电机转速最快的档,为13.32r/min,显示效果如下图:

6.3故障分析及解决方法

故障一:

首先在设计总体方案时,思路上出现了一些问题,我首先是想在中断里完成许多应在中断之外完成的事,经过老师的指点,后来想清楚了。

只在中断中给电机送相序码,并设定了一个参数对电机的转速进行调控。

故障二:

由于编写程序的经验不多,在计算电机转速,并将其显示在液晶时,遇到了一些问题,速度转换公式是找出来了,但怎样将其小数点表示出来,困惑了好久,最后还是请教了同学,才搞定。

故障三:

在仿真时首先液晶没有接上拉电阻,液晶上显示不出来,我以为是程序方面出了问题,后来尝试接了上拉电阻,就能够正常显示了。

第7章心得体会

为期两周的单片机课程设计在忙碌中已接近尾声,经过这么多天的努力,终于完成了这次课程设计基本设计要求,在充实中也学到了很多知识,是真正将所学知识运用于实践中的一次很好的体验,使人受益匪浅。

由于此次控制要求不是很高,选用51系列或52系列完全能够满足设计需求,最后选用的STC89C52。

接下来就是硬件接口分配问题和如何去驱动电机。

对于步进电机之前没有什么接触,所以我上网查了许多关于步进电机的资料,知道了其基本工作原理以及怎么去实现其控制运转和驱动。

接下来的主要问题就是如何编程去实现控制它了,这次程序的编写和调试对我来说是个不小的挑战,因为之前只编写过一些简短的小程序,对较大的程序总体性方面还不能很好的把握。

经过反复的尝试和调试,用发现一个问题,解决一个问题的方法,还参考了一些别人的经验方法,完成了程序的编写。

这对我以后编写程序是一次很好的经验积累。

仿真时也出了一些小问题,首先LCD完全没有显示,我就尝试接上拉电阻,结果就能正常工作了。

然后是电机也不转,最后我把送进去的脉冲频率减小,才使得电机运转起来,这个仿真过程又使我更加熟练了Proteus软件的用法。

这次课程设计使我认识到,刚学好书上的知识还是不够的,更重要的是我们要能将所学的知识运用到实践中来,这才是我们学习知识的最基本的要求,所以在以后的学习生活中,我们应该更加注意将学习与实践相结合,在实践中去运用好所学知识,更进一步深化和理解所学知识,达到学以致用。

通过这次课程设计,我也了解到了自己的不足,以前自己学习单片机的时候,往往只去看懂别人写的程序,以为看懂了自己就知道写了,但事实并不是这样,虽然这次课程设计程序是完成了,但棘手的地方很多,编程并不像以前认为的简单。

所以在以后的学习中,不能手高眼低,一定要脚踏实地,一步步地走,自己动手去做,这样才能将知识真正学到手。

这次课程设计能得以顺利完成,还要感谢符强老师的指导和同学们的帮助,在老师指导和同学的帮助下,很多问题问题都很好地解决了。

总之,虽然只是短短两周的时间,但也学到了很多,感受很深,是一次很好的经验积累和设计经历。

第8章参考文献

[1]王迎旭.《单片机原理及及应用》.北京:

机械工业出版社

[2]张迎新.《单片微型计算机原理、应用及接口技术》.北京:

国防工业出版社

[3]郭天祥.《新概念51单片机C语言教程》.北京:

电子工业出版社

[4]蔡明文冯先成编著.《单片机课程设计》.北京:

华中科技大学出版社

[5]王晓明.《电动机的单片机控制》.北京航空航天大学出版社

附件

系统原理图

元器件清单

单片机开发板1块

STC89C521片

LCD16021块

ULN20031个

步进电机1个

源程序清单

#include<

reg51.h>

//51芯片管脚定义头文件

intrins.h>

//内部包含延时函数_nop_();

#defineucharunsignedchar

#defineuintunsignedint

#definedelayNOP();

{_nop_();

_nop_();

ucharcodeFFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};

//正转相序编码表

ucharcodeREV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};

//反转相序编码表

sbitLCD_RS=P2^0;

sbitLCD_RW=P2^1;

sbitLCD_EN=P2^2;

biton_off=0;

//运行与停止标志

bitdirection=1;

//方向标志

ucharcodecdis7[]={"

RATE:

ucharm,v=0,q=0,j;

ucharrate=5;

//预设定速度档

uchardata_temP1,data_temp2,data_temp3,data_temp4;

uintzs,data_temp;

/*****************************************************/

voiddelay(uintt)//延时t毫秒函数

{

uchark;

while(t--)

{

for(k=0;

k<

125;

k++)

{}

}

}

/********************************************************/

voiddelayB(ucharx)//x*0.14MS

uchari;

while(x--)

for(i=0;

i<

13;

i++)

voidbeep()//蜂鸣器

ucharj;

for(j=0;

j<

100;

j++)

{

delayB(4);

BEEP=!

BEEP;

//BEEP取反

}

BEEP=1;

//关闭蜂鸣器

delay(170);

/********************************************************/

bitlcd_busy()//检查LCD是否为忙状态,lcd_busy为1时,忙,等待。

为0时,闲,可写指令与数据。

bitresult;

LCD_RS=0;

LCD_RW=1;

LCD_EN=1;

delayNOP();

result=(bit)(P0&

0x80);

LCD_EN=0;

return(result);

voidlcd_wcmd(ucharcmd)//写指令数据到LCD,*RS=L,RW=L,E=高脉冲,D0-D7=指令码。

{while(lcd_busy());

LCD_RW=0;

_nop_();

P0=cmd;

voidlcd_wdat(uchardat)//写显示数据到LCD,RS=H,RW=L,E=高脉冲,D0-D7=数据。

LCD_RS=1;

P0=dat;

voidlcd_init()//LCD初始化设定

delay(30);

lcd_wcmd(0x38);

//16*2显示,5*7点阵,8位数据

delay(5);

lcd_wcmd(0x0c);

//显示开,关光标

lcd_wcmd(0x06);

//移动光标

lcd_wcmd(0x01);

//清除LCD的显示内容

/********************************************************/

voidlcd_pos(ucharpos)//设定显示位置

lcd_wcmd(pos|0x80);

//数据指针=80+地址变量

voidLCD_init_DIS()//LCD1602初始显示子程序

delay(10);

//延时

lcd_init();

//初始化LCD

lcd_pos(0);

//设置显示位置为第一行的第1个字符

m=0;

while(cdis0[m]!

='

\0'

{//显示字符WELCOME

lcd_wdat(cdis0[m]);

m++;

delay(2000);

//清屏

//清屏以后的这个延时不能少,给LCD一定的缓冲,否则下一条指令不一定被执行

lcd_pos(0x10);

//设置显示位置为第一行的第17个地址

while(cdis1[m]!

{//显示字符

lcd_wdat(cdis1[m]);

lcd_pos(0x50);

//设置显示位置为第二行第1个字符

while(cdis2[m]!

lcd_wdat(cdis2[m]);

//显示字符

for(j=0;

16;

lcd_wcmd(0x18);

delay(300);

delay(3000);

//延时

lcd_pos(0x00);

//设置

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 司法考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1