单片机课程设计步进电机的控制.docx
《单片机课程设计步进电机的控制.docx》由会员分享,可在线阅读,更多相关《单片机课程设计步进电机的控制.docx(17页珍藏版)》请在冰豆网上搜索。
![单片机课程设计步进电机的控制.docx](https://file1.bdocx.com/fileroot1/2023-2/4/288b33bd-3bee-48dd-8b67-29d20cc54988/288b33bd-3bee-48dd-8b67-29d20cc549881.gif)
单片机课程设计步进电机的控制
单片机课程设计
——步进电机的控制
Forpersonaluseonlyinstudyandresearch;notforcommercialuse
学院:
姓名:
班级:
学号:
一、实验任务_
1.从键盘上输入正、反转命令,转速参数(16级)和转动步数显示在LED显示器上。
_
显示器上显示:
第一位为0表示正转,为1表示反转;
第二位0~F为转速等级;
第三到第六位设定步数。
_
2.单片机显示器上显示的正、反转命令,转速级数和转动步数进行相应动作,转动步数减为零时停止转动。
_
二、基本原理
1.步进电机基本原理_
_
如图,当有一相绕组被通电激励时,磁通从正相齿,经过软铁芯的转子,并以最短路径流向负相齿,为使磁通路径最短,在磁场力的作用下,转子被迫移动,使最近的一对齿与被激励的一相对准。
那么,通过对它每相线圈中电流的顺序切换可使电机作步进式旋转。
相数:
产生不同对极N、S磁场的激磁线圈对数。
拍数:
指电机转过一个齿距角所需脉冲数,以四相电机为例,有四相四拍运行方式即AB-BC-CD-DA-AB或A-B-C-D-A,四相八拍运行方式即A-AB-B-BC-C-CD-D-DA-A.
步距角:
对应一个脉冲信号电机转子转过的角位移。
步距角=360/(转子齿数*拍数)
系统中使用20BY-0型号步进电机,它使用+5V直流电源,步距角为18度,电机线圈由A、B、C、D四相组成。
步进电机驱动原理是通过对它每相线圈中的电流的顺序切换来使电机作步进式旋转,驱动电路由脉冲信号来控制,所以调节脉冲信号的频率便可改变步进电机的转速。
BA、BB、BC、BD即为脉冲信号输入插孔,驱动器输出A、B、C、D接步进电机。
步进电机原理接线图如图所示:
步进电机模块插头接实验系统J3插座,(顺接)
把P1.0~P1.3分别接到BA~BD插孔。
2.数码管显示和键盘
(1)数码管显示字形
LED显示器是由发光二极管构成的字段组成的显示器。
显示程序任务:
●设置显示缓冲区(7EH-79H),存放待显示数据和字符(位置码)。
●显示译码:
程序存储器中建立字形码常数表,查表得出对应数据和字符的字形码。
●输出显示:
输出字形码到显示端口。
(2)字位口表(从高位起)
(3)键盘显示原理图
三、内存使用分配表
0FFDCH
字形口
0FFDDH
字位口/键扫口
0FFDEH
键入口
ACC(A)、R0~R7
存放中间值
79H~7EH
显示缓冲单元,存放显示器的显示数据
四、设计说明及流程
1.显示子程序模块
●采用动态显示方式,即一位一位地轮流点亮(扫描)6位显示器。
●在8032RAM存储器中设置六个显示缓冲区单元7EH-79H,分别存放6位显示器的显示数据(从高到低)。
2.键盘输入模块
●实验系统有4×8的键盘结构(见键扫显示原理图)。
●键盘的行线通过电阻接+5V,当键盘上没有键闭合时所有的行线和列线都断开,行线都为高电平。
当键盘上某一键闭合时,则该键所对应的行线和列线都短路。
●CPU逐行逐列地检查键盘的状态,可判断键盘上有无键闭合。
CPU对键盘上闭合键的键号确定,可根据行线和列线的状态计算求得,也可以根据行线和列线的状态查表求得。
3.步进电机控制模块
●四相四拍运行方式即AB-BC-CD-DA-AB或A-B-C-D-A
●激励一相即对该相置“1”
●控制每一拍的间隔时间用延时子程序实现
判断步数是否减为0的流程图
5、程序清单
ORG0000H
LJMPMAIN
ORG100H
MAIN:
MOV79H,#00H;主程序部分
MOV7AH,#00H
MOV7BH,#00H
MOV7CH,#00H
MOV7DH,#00H
MOV7EH,#00H
MOVR0,#7EH;取显示内存缓充区的第一位
MAIN1:
ACALLKEY1;调用按键程序
MOV@R0,A;获得的值存放到7EH中
CJNER0,#78H,KS;是否到78H,不到转KS
CJNEA,#16H,AGAIN;是否按下EXEC键,若是则跳转到RUN
LJMPRUN;调转到步进电机控制部分
AGAIN:
LJMPMAIN1
KS:
DECR0
LJMPMAIN1
RUN:
MOVA,7EH;取(7EH)当前所存
JZZHENG;跳转到正转
JNZFAN;跳转到反转
ZHENG:
MOVP1,#03H;给AB两相脉冲
ACALLDELAY;调用延时子程序
MOVP1,#06H;给BC两相脉冲
ACALLDELAY;调用延时子程序
MOVP1,#0CH;给CD两相脉冲
ACALLDELAY;调用延时子程序
MOVP1,#09H;给DA两相脉冲
ACALLDELAY;调用延时子程序
ANL79H,#0FH;取7EH低四位
ANL7AH,#0FH;取7DH低四位
ANL7BH,#0FH;取7CH低四位
ANL7CH,#0FH;取7BH低四位
LCALLDIS;调用显示子程序
MOVR0,79H;步数由设定值降至0停止
CJNER0,#0,Z1
DEC79H
MOVR0,7AH
CJNER0,#0,Z2
DEC7AH
MOVR0,7BH
CJNER0,#0,Z3
DEC7BH
MOVR0,7CH
CJNER0,#0,Z4
LJMPMAIN
Z1:
DEC79H
LJMPZHENG
Z2:
DEC7AH
LJMPZHENG
Z3:
DEC7BH
LJMPZHENG
Z4:
DEC7CH
LJMPZHENG
FAN:
MOVP1,#09H;给AD相脉冲
ACALLDELAY;调用延时子程序
MOVP1,#0CH;给DC相脉冲
ACALLDELAY;调用延时子程序
MOVP1,#06H;给CB相脉冲
ACALLDELAY;调用延时子程序
MOVP1,#03H;给BA相脉冲
ACALLDELAY;调用延时子程序
ANL79H,#0FH;取7EH低四位
ANL7AH,#0FH;取7DH低四位
ANL7BH,#0FH;取7CH低四位
ANL7CH,#0FH;取7BH低四位
LCALLDIS
MOVR0,79H;步数自减部分
CJNER0,#0,F1
DEC79H
MOVR0,7AH
CJNER0,#0,F2
DEC7AH
MOVR0,7BH
CJNER0,#0,F3
DEC7BH
MOVR0,7CH
CJNER0,#0,F4
LJMPMAIN
F1:
DEC79H
LJMPFAN
F2:
DEC7AH
LJMPFAN
F3:
DEC7BH
LJMPFAN
F4:
DEC7CH
LJMPFAN
DELAY:
MOVR1,7DH;延时调速部分
DELAY1:
ACALLDIS
MOVR1,DELAY1
RET
HERE:
ACALLDIS
SJMPHERE
KEY1:
ACALLKS1;调用判断有无键按下子程序
JNZLK1;有键按下,转消颤延时
ACALLDIS;无键按下,调用显示子程序
AJMPKEY1;返回KEY1,继续等待
LK1:
ACALLDIS;调用显示子程序
ACALLT12;调用12ms延时子程序
ACALLKS1;调用判断有无键按下子程序,
确认按键真实性
JNZLK2;有键按下转逐列扫描子程序
AJMPKEY1;否则返回KEY1,继续等待
LK2:
MOVR2,#0FEH;首列扫描字入R2
MOVR4,#0H;首列号入R4
LK4:
MOVDPTR,#0FFDDH;列扫描字送至键扫口
MOVA,R2;第一次列扫描
MOVX@DPTR,A;使第0列线为0
MOVDPTR,#0FFDEH;指向键入口
MOVXA,@DPTR;键入口读入行状态
JBACC.0,LONE;第0行无键按下,转查第1行
MOVA,#00H;第0行有键按下,该行首键号#00HA
AJMPLKP;转求键号
LONE:
JBACC.1,LTWO;第1行无键按下,转查第2行
MOVA,#08H;第1行有键按下,该行首键号#08HA
AJMPLKP
LTWO:
JBACC.2,LTHR;第2行无键按下,转查第3行
MOVA,#10H;第2行有键按下,该行首键号#10HA
AJMPLKP
LTHR:
JBACC.3,NEXT;第3行无键按下,转查下一列
MOVA,#18H;第3行有键按下,该行首键号#18HA
LKP:
ADDA,R4;求原理图上的键号=行首键号+列号
MOVDPTR,#TAB1;查找TAB1,将实际键号赋给A
MOVCA,@A+DPTR
PUSHACC;将键号压入堆栈
LK3:
ACALLDIS;调用显示子程序
ACALLKS1;等待键释放
JNZLK3;未释放,等待
POPACC;键释放,键号A
RET;键扫描结束出口状态(A)=实际键号
NEXT:
INCR4;指向下一列,列号加1
MOVA,R2;判断8列是否扫描完
JNBACC.7,KND;8列扫描完,返回
RLA;扫描字左移一位,
转变为下一列扫描字
MOVR2,A;扫描字入R2
AJMPLK4;转下一列扫描
KND:
AJMPKEY1
KS1:
MOVDPTR,#0FFDDH;指向键扫口
MOVA,#00H;全扫描字#0H
MOVX@DPTR,A;全扫描字入键扫口
MOVDPTR,#0FFDEH;指向键入口
MOVXA,@DPTR;读键入口行状态
CPLA;变正逻辑,以高电平表示有键按下
ANLA,#0FH;屏蔽高4位
RET;出口状态,(A)=1时有键按下
T12:
MOVR7,#18H;延时12ms子程序
TM:
MOVR6,#0FFH
TM6:
DJNZR6,TM6
DJNZR7,TM
RET
DIS:
MOVR0,#079H;显示缓冲区首地址送R0
MOVR3,#01H;使显示器最右边位亮
MOVA,R3
LD0:
MOVDPTR,#0FFDDH;扫描值送给字位口
MOVX@DPTR,A
MOVA,@R0;取显示数据
MOVDPTR,#TAB;取首地址
MOVCA,@A+DPTR;取字形
MOVDPTR,#0FFDCH;指向字形口
MOVX@DPTR,A;送出显示
ACALLDL1;延时
INCR0;缓冲区地址加1
MOVA,R3
JBACC.5,LD1;判断是否扫描到第六个显示位
RLA;若没有,扫描下一位
MOVR3,A
AJMPLD0
LD1:
RET
DL1:
MOVR7,#02H;延时子程序
DL:
MOVR6,#0FH
DLA:
DJNZR6,DLA
DJNZR7,DL
RET
ORG700H
TAB:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH;显示字码段
DB6FH,77H,7CH,39H,5EH,79H,71H,00H,40H,0FFH
TAB1:
DB7H,4H,8H,5H,9H,6H,0AH,0BH,1H,0H,2H;键表
DB0FH,3H,0EH,0CH,0DH,00H,00H,00H,00H
DB00H,00H,16H
7、课程设计小结
在大三的下学期我们学习了单片机原理及其应用这门课程,作为一名电气工程及其自动化专业的大三学生,我觉得做单片机课程设计是十分有意义的,而且是十分必要的。
在已度过的大学时间里,我们大多数接触的是专业课。
我们在课堂上掌握的仅仅是专业课的理论知识,而期末的课程设计环节正是锻炼我们的实践能力,使我们将所学的专业基础课理论知识运用到实践中的一个很好的平台这次单片机课程设计我们历时一个星期,课题要求实现步进电机的控制。
任务涉及到从键盘上输入正、反转命令,转速参数(16级)和转动步数,显示在LED显示器上。
先后要设计显示子程序模块,键盘输入模块,步进电机控制模块,然后综合模块进行调试,用步进电机的实际转动效果来验证设计方案的正确性,最后进行总结和答辩。
在课程设计环节中,我觉得最困难的是程序设计,首先要理解原理,然后进行流程设计,转化为程序,进行调试,我们在调试的时候出现很多错误,改错的过程是非常痛苦的,好在我们耐心的一一克服了,最后敲定了合理的程序。
但问题并没有因此结束,当我们装上步进电机后,转速等级之间的转速差别,是否能够带动电机,显示闪烁快慢,转速变慢时出现转动打嗝和颤抖的情况,往往让我感到手足无措,但是在老师的指导和同学的帮助下我们小组都一一克服了,最后得到了较为满意的结果,在此感谢老师的悉心指导。
还有一点体会就是要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常德,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题的课程设计结束了,但是从中学到的知识会让我受益终身。
发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。
设计过程,好比是我们人类成长的历程,常有一些不如意,但毕竟这是第一次做,难免会遇到各种各样的问题。
在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
通过这次设计,我懂得了学习的重要性,了解到理论知识与实践相结合的重要意义,学会了坚持、耐心和努力,这将为自己今后的学习和工作做出了最好的榜样。
我觉得作为一名自动化专业的学生,单片机的课程设计是很有意义的。
更重要的是如何把自己平时所学的东西应用到实际中。
仅供个人用于学习、研究;不得用于商业用途。
Forpersonaluseonlyinstudyandresearch;notforcommercialuse.
NurfürdenpersönlichenfürStudien,Forschung,zukommerziellenZweckenverwendetwerden.
Pourl'étudeetlarechercheuniquementàdesfinspersonnelles;pasàdesfinscommerciales.
толькодлялюдей,которыеиспользуютсядляобучения,исследованийинедолжныиспользоватьсявкоммерческихцелях.
以下无正文