基于单片机的步进电机控制系统

基于单片机的步进电机控制系统
基于单片机的步进电机控制系统

J I A N G S U U N I V E R S I T Y

单片机课程设计

-----步进电机控制

所属学院:电气信息工程学院

专业班级:电气卓越

姓名:

学号:

指导教师:孙

日期: 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插孔。

P1.0

P1.1P1.2

P1.3

8032

1234569

8

74LS04

75452

126735126735

VCC

A B

C D

J3

4.7kX4

BB BC BA BD

五.设计说明及流程图

1.数码管显示字形

LED显示器是由发光二极管构成的字段组成的显示器。

显示程序任务:

设置显示缓冲区(7EH-79 H),存放待显示数据和字符(位置码)。

显示译码:程序存储器中建立字形码常数表,查表得出对应数据和字符的字形码。

输出显示:输出字形码到显示端口。

2.字位口表(从高位起)

3.键盘显示原理图

(1)显示子程序模块

采用动态显示方式,即一位一位地轮流点亮(扫描)6位显示器。在8032RAM 存储器中设置六个显示缓冲区单元7EH-79H,分别存放6位显示器的显示数据(由高到低)。

(2)键盘输入模块

1.实验系统有4×8的键盘结构(见键扫显示原理图)。

2.键盘的行线通过电阻接+5V,当键盘上没有键闭合时所有的行线和列线都断开,行线都为高电平。当键盘上某一键闭合时,则该键所对应的行线和列线都短路。

3.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: DB 03H,06H,0CH,09H,00H ;正转控制字

LM: DB 03H,09H,0CH,06H,00H ;反转控制字

步进电机采用四相四拍运行方式,即AB-BC-CD-DA-AB或A-B-C-D-A;程序中,控制对应激励一相即对该相置“1”,即置相应P1口为1;通过控制每一拍的间隔时间用延时子程序实现步进电机转速的控制。

如果给步进电机发一个控制脉冲,它就转一步,再发一个脉冲,它会转出一步。两个脉冲的时间间隔越短,步进电机就转的越快。调整送给步进电机的脉冲频率,就可以对步进电机转速进行控制。

内存使用分配表

六.程序清单

ORG 0000H

AJMP MAIN

ORG 001BH

LJMP T1INT

ORG 0300H ;主程序入口

MAIN: ACALL SHURU ;调用输入子程序,等待确认后返回MOV R1,79H ;设置显示缓冲区

MOV R2,7AH

MOV R3,7BH

MOV R4,7CH

MOV R5,#00H

MOV A,7DH ;读取设定的速度等级

MOV R6,#4 ;循环左移四位

N1: RL A

DJNZ R6,N1

MOV TMOD,#10H ;T1模式1,16位计数

MOV TH1,A ;将左移后的速度等级存放到TH1

MOV TL1,#00H ;按此装载,则0等级的定时时间最长,转速

最慢,F转速最快

SETB EA ;开中断

SETB ET1

SETB TR1

WAIT: ACALL XS ;调用显示子程序,并等待T1中断JNB ET1,N5 ;若中断关闭则步数已减为零,重新执行主程

SJMP WAIT

N5 : AJMP MAIN

RM: DB 03H,06H,0CH,09H,00H ;正转控制字

LM: DB 03H,09H,0CH,06H,00H ;反转控制字

T1INT:PUSH ACC ;T1中断服务子程序,保护现场

PUSH PSW

PUSH DPH

PUSH DPL

MOV A,7EH ;读取转向

JNZ LEFT ;如果A中的内容不为0,则转向left,转反

MOV DPTR,#RM ;如果A中的内容为0,则转正转

AJMP N2

LEFT: MOV DPTR,#LM

N2: MOV A,R5 ;设置R5作为RM或LM的偏移量MOVC A,@A+DPTR

MOV P1,A

INC DPTR

MOV A,R5

MOVC A,@A+DPTR ;取下一步控制字

JNZ NEXT1 ;如果A不为0,则转NEXT1,R5自增一,否则清零

MOV R5,#00H

AJMP N3

NEXT1:INC R5

N3: CJNE R1,#00H,M1 ;执行步数减一,并判断是否为0 CJNE R2,#00H,M2

CJNE R3,#00H,M3

CJNE R4,#00H,M4

CLR ET1 ;步数减为0,关闭中断

CLR EA

M4: DEC R4

MOV R3,#09H

MOV 7CH,R4

AJMP M43

M3: DEC R3

M43: MOV R2,#09H

MOV 7BH,R3

AJMP M32

M2:DEC R2

M32: MOV R1,#09H

MOV 7AH,R2

AJMP M21

M1: DEC R1

M21: MOV 79H,R1

MOV A,7DH

MOV R6,#4

N4: RL A

DJNZ R6,N4

MOV TH1,A

MOV TL1,#00H

POP DPL ;恢复现场

POP DPH

POP PSW

POP ACC

RETI ;中断返回

SHURU:MOV R0,#7EH ;置显示缓冲器指针初值

MOV R1,#7EH ;置键入缓冲指针初值

MOV 79H,#00H ;初始化设定值,使数码管“灭”

MOV 7AH,#00H

MOV 7BH,#00H

MOV 7CH,#00H

MOV 7DH,#00H

MOV 7EH,#00H

MOV R3,#06H ;存放未设置数码管个数

SHURU1:ACALL KS1 ;判断是否有键闭合

JZ XY ;A=0,表明无键闭合,调显示延时

ACALL XD ;A不为0,表明有键闭合,进行消抖延时CJNE A,#16H,XY

RET

XY: ACALL XS

AJMP SHURU1

XD: ACALL T12ms

ACALL KS1

JNZ N0

RET

N0: ACALL SAOM1

RET

SAOM1: MOV R2,#0FEH ;R2记列的扫描字

MOV R4,#0H ;R4记列号

SAOM2: MOV DPTR,#0FFDDH ;将扫描字送列

MOV A,R2

MOVX @DPTR,A

INC DPTR ;指向行地址

MOVX A,@DPTR ;读取行值

JB ACC.0,LONE ;第0行无键按下,转查第二行

MOV A,#00H ;第0行有键按下,置0行首键号00h

AJMP QJH ;转向求键号程序

LONE:JB ACC.1,LTW0

MOV A,#08H

AJMP QJH

LTW0: JB ACC.2,LTHR

MOV A,#10H

AJMP QJH

LTHR: JB ACC.3,NEXT

MOV A,#18H

AJMP QJH

QJH: ADD A,R4 ;键号=行首键号+列号

PUSH ACC ;键号进栈保护

SAOM3: ACALL KS1 ;等待键释放

JNZ SAOM3

POP ACC ;释放后返回A中所存的键号

CJNE A,#16H,AAA ;根据键号判断是否确认键

AJMP CHS

AAA: ACALL QJZ ;根据键号求键值,返回A中为待显示值MOV @R1,A

DEC R1

DJNZ R3,CHS ;如果按键值超过6位,则重新设置设定值MOV R3,#06H

MOV R1,#7EH

CHS: RET

NEXT: INC R4 ;增加列号值

MOV A,R2

JNB ACC.7,CHS ;第8列是否已经扫描

RL A ;如果没扫描,就转下一列扫描

MOV R2,A

AJMP SAOM2

QJZ: MOV DPTR,#TAB1 ;求键值的子程序

MOVC A,@A+DPTR

RET

TAB1:DB 7,4,8,5,9,6,0AH,0BH ;按顺序为键号0-31,表中为对应键值

DB 1,0,2,0FH,3,0EH,0CH,0DH

DB 0,1,0,1,0,1,0,1

DB 2,3,2,3,2,3,2,3

XS: MOV 30H,#20H;30H单元存放字位码

XS1: MOV DPTR,#TAB

MOV A,@R0 ;R0指向7E-79H单元

MOVC A,@A+DPTR ;查表得R0所指单元值的字形码

MOV DPTR,#0FFDCH

MOVX @DPTR,A ;送字形口地址

MOV DPTR,#0FFDDH

MOV A,30H

MOVX @DPTR,A ;送子位码地址

ACALL T1ms ;延时1ms

DEC R0

JB ACC.0,XS2 ;判断是否已显示最右边的数码管,是则重置指针R0 RR A

MOV 30H,A

AJMP XS1

XS2: MOV R0,#7EH

RET

TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H

DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH

T1ms:MOV R7,#02H ;延时1ms

L4: MOV R6,#0F8H

L3: DJNZ R6,L3

DJNZ R7,L4

RET

T12ms:MOV R7,18H ;延时12ms

L6: MOV R6,#0F8H

L5: DJNZ R6,L5

DJNZ R7,L6

RET

KS1: MOV DPTR,#0FFDDH ;判断闭合子程序,有键闭合则A不为0

MOV A,#00H

MOVX @DPTR,A

INC DPTR

MOVX A,@DPTR

CPL A

ANL A,#0FH

RET

END

七.设计心得体会

为期一周的单片机课程设计到此结束,此次课设的任务安排如下:第一天、第二天做键盘和显示,第三天,驱动电机,第四天,总结,调试运行,第五天,准备答辩。这次课设给了我不一样的感受。对于单片机的学习,我一直不太有信心,所以借此机会好好巩固了课本的知识,锻炼了动手能力。第一天的键盘和显示开始有些摸不着头脑,后来参考了课本,并且和搭档讨论总结,弄懂了程序的基本运行过程并且正确调试了程序。后来的驱动电机模块就明显顺利了很多,但是编程调试的过程明显让我提高了自己的查错能力。总的说来,这次课设让我温习了课本已经淡忘的知识,使得一些概念更加清晰,另外,对于一些没有弄懂的知识,通过分析讨论也得到了解决,所以我们应该珍惜每一次课程设计的机会,努力学习知识,锻炼能力。

相关主题
相关文档
最新文档