基于单片机的步进电机控制系统.docx
《基于单片机的步进电机控制系统.docx》由会员分享,可在线阅读,更多相关《基于单片机的步进电机控制系统.docx(19页珍藏版)》请在冰点文库上搜索。
![基于单片机的步进电机控制系统.docx](https://file1.bingdoc.com/fileroot1/2023-5/3/37e2f3dc-21f3-4016-ba6e-56d684a03cca/37e2f3dc-21f3-4016-ba6e-56d684a03cca1.gif)
基于单片机的步进电机控制系统
JIANGSUUNIVERSITY
单片机课程设计
-----步进电机控制
所属学院:
电气信息工程学院
专业班级:
电气卓越1202
姓名:
学号:
指导教师:
孙运全
日期:
2015年6月26日
一.设计任务
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/(转子齿数*拍数)=18度
2.LED显示器原理
LED数码管实际上是由七个发光管组成8字形构成的,这些段分别由字母a,b,c,d,e,f,g,dp来表示。
LED显示器有共阳极和共阴极两种接法,共阴极显示器的发光二极管阴极LED连接在一起,通常此公共阴极接地,当某个发光二极管的阳极为高电平时,发光二极管点亮,相应的段被显示;同样,共阳极显示器的发光二极管LED阳极连接在一起,通常此公共阳极接正电压,当某个发光二极管的阴极为低电平时,发光二极管点亮,相应的字段被点亮。
3.键盘接口原理
键盘实际上是由排列成矩阵形式的一系列按键开关组成,用户通过键盘可以向CPU输入数据,地址和命令。
我们主要需要解决键的识别与键的抖动消除和键的保护等问题。
采用8255A接口芯片构成的4*8键盘的接口电路,其中A口为输入,作为列线;C口为输入作为行线。
当所有的键没有被按下时,C口输入均为高;若某列线为低时,恰好该列上有键被按下,则键所在的行线为低。
三.设计原理及步骤
系统中使用20BY-0型号步进电机,它使用+5V直流电源,步距角为18度,电机线圈由A、B、C、D四相组成。
步进电机控制原理是通过对它每相线圈中的电流的顺序切换来使电机作步进式旋转,驱动电路由脉冲信号来控制,所以调节脉冲信号的频率便可改变步进电机的转速。
BA、BB、BC、BD即为脉冲信号输入插孔,驱动器输出A、B、C、D接步进电机。
步骤:
先根据书本的键盘扫描程序与数码管显示程序,设计了键盘显示程序,然后是数码管显示程序,把二者整合到一起,调试成功后,再设计了驱动电机程序,实现电机的正反转与调速控制。
四.硬件原理接线图
⏹步进电机模块插头接实验系统J3插座,(顺接)
⏹把P1.0~P1.3分别接到BA~BD插孔。
五.设计说明及流程图
1.数码管显示字形
LED显示器是由发光二极管构成的字段组成的显示器。
显示程序任务:
设置显示缓冲区(7EH-79H),存放待显示数据和字符(位置码)。
显示译码:
程序存储器中建立字形码常数表,查表得出对应数据和字符的字形码。
输出显示:
输出字形码到显示端口。
2.字位口表(从高位起)
位置
G5
G4
G3
G2
G1
G0
数值
20H
10H
08H
04H
02H
01H
3.键盘显示原理图
显示子程序模块
采用动态显示方式,即一位一位地轮流点亮(扫描)6位显示器。
在8032RAM存储器中设置六个显示缓冲区单元7EH-79H,分别存放6位显示器的显示数据(由高到低)。
(2)键盘输入模块
实验系统有4×8的键盘结构(见键扫显示原理图)。
键盘的行线通过电阻接+5V,当键盘上没有键闭合时所有的行线和列线都断开,行线都为高电平。
当键盘上某一键闭合时,则该键所对应的行线和列线都短路。
CPU逐行逐列地检查键盘的状态,可判断键盘上有无键闭合。
CPU对键盘上闭合键的键号确定,可根据行线和列线的状态计算求得,也可以根据行线和列线的状态查表求得。
键号=行首键号+列号。
键输入流程图
下图是实际的4*8键盘的分布图,每个方框代表一个键,中间的数字代表键值,即键盘上印的数值,每个键上方的小数字代表键在扫描时的键号。
3.步进电机控制
步进电机工作时序波形图
单四拍双四拍八拍
四相双四拍脉冲分配表
A
B
C
D
N
1
1
0
0
N+1
0
1
1
0
N+2
0
0
1
1
N+3
1
0
0
1
根据表格得出控制步进电机正反转的控制字
RM:
DB03H,06H,0CH,09H,00H;正转控制字
LM:
DB03H,09H,0CH,06H,00H;反转控制字
步进电机采用四相四拍运行方式,即AB-BC-CD-DA-AB或A-B-C-D-A;程序中,控制对应激励一相即对该相置“1”,即置相应P1口为1;通过控制每一拍的间隔时间用延时子程序实现步进电机转速的控制。
如果给步进电机发一个控制脉冲,它就转一步,再发一个脉冲,它会转出一步。
两个脉冲的时间间隔越短,步进电机就转的越快。
调整送给步进电机的脉冲频率,就可以对步进电机转速进行控制。
内存使用分配表
六.程序清单
ORG0000H
AJMPMAIN
ORG001BH
LJMPT1INT
ORG0300H;主程序入口
MAIN:
ACALLSHURU;调用输入子程序,等待确认后返回
MOVR1,79H;设置显示缓冲区
MOVR2,7AH
MOVR3,7BH
MOVR4,7CH
MOVR5,#00H
MOVA,7DH;读取设定的速度等级
MOVR6,#4;循环左移四位
N1:
RLA
DJNZR6,N1
MOVTMOD,#10H;T1模式1,16位计数
MOVTH1,A;将左移后的速度等级存放到TH1
MOVTL1,#00H;按此装载,则0等级的定时时间最长,转速最慢,F定时时间最长,转速最快
SETBEA;开中断
SETBET1
SETBTR1
WAIT:
ACALLXS;调用显示子程序,并等待T1中断
JNBET1,N5;若中断关闭则步数已减为零,重新执行主程序
SJMPWAIT
N5:
AJMPMAIN
RM:
DB03H,06H,0CH,09H,00H;正转控制字
LM:
DB03H,09H,0CH,06H,00H;反转控制字
T1INT:
PUSHACC;T1中断服务子程序,保护现场
PUSHPSW
PUSHDPH
PUSHDPL
MOVA,7EH;读取转向
JNZLEFT;如果A中的内容不为0,则转向LEFT,反转
MOVDPTR,#RM;如果A中的内容为0,则正转
AJMPN2
LEFT:
MOVDPTR,#LM
N2:
MOVA,R5;设置R5作为RM或LM的偏移量
MOVCA,@A+DPTR
MOVP1,A
INCDPTR
MOVA,R5
MOVCA,@A+DPTR;取下一步控制字
JNZNEXT1;如果A不为0,则转NEXT1,R5自增一,否则清零
MOVR5,#00H
AJMPN3
NEXT1:
INCR5
N3:
CJNER1,#00H,M1;执行步数减一,并判断是否为0
CJNER2,#00H,M2
CJNER3,#00H,M3
CJNER4,#00H,M4
CLRET1;步数减为0,关闭中断
CLREA
M4:
DECR4
MOVR3,#09H
MOV7CH,R4
AJMPM43
M3:
DECR3
M43:
MOVR2,#09H
MOV7BH,R3
AJMPM32
M2:
DECR2
M32:
MOVR1,#09H
MOV7AH,R2
AJMPM21
M1:
DECR1
M21:
MOV79H,R1
MOVA,7DH
MOVR6,#4
N4:
RLA
DJNZR6,N4
MOVTH1,A
MOVTL1,#00H
POPDPL;恢复现场
POPDPH
POPPSW
POPACC
RETI;中断返回
SHURU:
MOVR0,#7EH;置显示缓冲器指针初值
MOVR1,#7EH;置键入缓冲指针初值
MOV79H,#00H;初始化设定值,使数码管“灭”
MOV7AH,#00H
MOV7BH,#00H
MOV7CH,#00H
MOV7DH,#00H
MOV7EH,#00H
MOVR3,#06H;存放未设置的数码管个数
SHURU1:
ACALLKS1;判断是否有键闭合
JZXY;A=0,表明无键闭合,调显示延时
ACALLXD;A不为0,表明有键闭合,进行消抖延时
CJNEA,#16H,XY
RET
XY:
ACALLXS
AJMPSHURU1
XD:
ACALLT12ms
ACALLKS1
JNZN0
RET
N0:
ACALLSAOM1
RET
SAOM1:
MOVR2,#0FEH;R2记列的扫描字
MOVR4,#0H;R4记列号
SAOM2:
MOVDPTR,#0FFDDH;将扫描字送列
MOVA,R2
MOVX@DPTR,A
INCDPTR;指向行地址
MOVXA,@DPTR;读取行值
JBACC.0,LONE;第0行无键按下,转查第一行
MOVA,#00H;第0行有键按下,置0行首键号#00H
AJMPQJH;转向求键号程序
LONE:
JBACC.1,LTW0
MOVA,#08H
AJMPQJH
LTW0:
JBACC.2,LTHR
MOVA,#10H
AJMPQJH
LTHR:
JBACC.3,NEXT
MOVA,#18H
AJMPQJH
QJH:
ADDA,R4;键号=行首键号+列号
PUSHACC;键号进栈保护
SAOM3:
ACALLKS1;等待键释放
JNZSAOM3
POPACC;释放后返回A中所存的键号
CJNEA,#16H,AAA;根据键号判断是否是确认键
AJMPCHS
AAA:
ACALLQJZ;根据键号求键值,返回A中为待显示值
MOV@R1,A
DECR1
DJNZR3,CHS;如果按键值超过6位,则重新设置设定值
MOVR3,#06H
MOVR1,#7EH
CHS:
RET
NEXT:
INCR4;增加列号值
MOVA,R2
JNBACC.7,CHS;第8列是否已经扫描
RLA;如果没扫描,就转下一列扫描
MOVR2,A
AJMPSAOM2
QJZ:
MOVDPTR,#TAB1;求键值的子程序
MOVCA,@A+DPTR
RET
TAB1:
DB7,4,8,5,9,6,0AH,0BH;按顺序为键号0-31,表中为对应键值
DB1,0,2,0FH,3,0EH,0CH,0DH
DB0,1,0,1,0,1,0,1
DB2,3,2,3,2,3,2,3
XS:
MOV30H,#20H;30H单元存放字位码
XS1:
MOVDPTR,#TAB
MOVA,@R0;R0指向7E-79H单元
MOVCA,@A+DPTR;查表得R0所指单元值的字形码
MOVDPTR,#0FFDCH
MOVX@DPTR,A;送字形口地址
MOVDPTR,#0FFDDH
MOVA,30H
MOVX@DPTR,A;送子位码地址
ACALLT1ms;延时1ms
DECR0
JBACC.0,XS2;判断是否已显示最右边的数码管,是则重置指针R0
RRA
MOV30H,A
AJMPXS1
XS2:
MOVR0,#7EH
RET
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
DB80H,90H,88H,83H,0C6H,0A1H,86H,8EH
T1ms:
MOVR7,#02H;延时1ms
L4:
MOVR6,#0F8H
L3:
DJNZR6,L3
DJNZR7,L4
RET
T12ms:
MOVR7,18H;延时12ms
L6:
MOVR6,#0F8H
L5:
DJNZR6,L5
DJNZR7,L6
RET
KS1:
MOVDPTR,#0FFDDH;判断闭合子程序,有键闭合则A不为0
MOVA,#00H
MOVX@DPTR,A
INCDPTR
MOVXA,@DPTR
CPLA
ANLA,#0FH
RET
END
七.设计心得体会
在大三学年即将进入尾声的时候,我们电气工程及其自动化专业的两个班级进行了为期五天的单片机课程设计。
这次课程设计我们的主要任务就是用单片机完成对步进电机的控制,从键盘上输入正、反转命令,转速参数(16级)和转动步数,并显示在LED显示器上。
第一位为0表示正转,为1表示反转;第二位0~F为转速等级,第三到第六位设定步数,转动步数减为零时停止转动。
在第一天和第二天我们设计了键盘扫描和数码管显示部分的程序。
第三天,设计了驱动电机程序,实现电机的正反转与调速控制。
然后对硬件部分进行连线,驱动电机,观察在正反转以及各级速度时步进电机能否被正确驱动,根据现象做了进一步调试。
第四天,我和我的组员对进行了总结,并准备答辩。
在这个过程中,我感觉到所学的单片机内容还不是很扎实,所以先把书本上有关键盘数码管的知识去弄懂,再开始编程,总是考虑不周全,无法合理安排程序的布置。
由于在编程时,我们直接参考了课本上的LED字形编码,后来在调试过程中发现了F并不能正常显示,经过核对,发现F的编码应该为8EH,不是84H。
在整个课程设计过程中,我觉得养成注释程序的好习惯是非常必要的,能让读程序的人很快明白你的思路,也能为修改和调试提供方便。
这次的课程设计让我受益匪浅,五天的单片机课程设计是一次宝贵的磨练自己的机会,能够理论联系实际,提高了单片机知识的理解和水平。
尽管我们在课堂学到的内容很有限,在以后的学习中还需要好好的深入研究和学习单片机,谢谢老师的指导。