步进电机自动控制系统.docx
《步进电机自动控制系统.docx》由会员分享,可在线阅读,更多相关《步进电机自动控制系统.docx(36页珍藏版)》请在冰豆网上搜索。
步进电机自动控制系统
步进电机自动控制系统
设计内容
设计用PC机对四相步进电机,方向,步数及自动化控制系统,并编写汇编程序实现相应轻能。
设计要求
(1)设计控制系统硬件电机。
(2)由8255键盘控制电机的方向,走的步数,并由数码管显示相应的参数。
(3)在命令执行结束后,由PC内部扬声器发出信号提示。
设备与器材
PC机一台,TPC-1实验台一个,并行接口8255一片,步进电机一个,LED数码管4个,74ls164按键11个,GAL芯片一个,74LS245一片。
硬件方案
硬件共分成5个模块:
①译码驱动电路,②8255控制键盘模块③8255LED显示模块,④步电机驱动模块,⑤步进电机模块
a)译码驱动电路
方案一 使用适当的门电路来实现不同地址的,用74LS245做数据驱动,缺点:
由于只使用门电路,电路连线非常复杂
方案二 使用76LS138和适当门电路实现译码,相对于方案一电路复杂度有一定的改观,在TPC实验箱上使用这种译码方案
方案三 使用可编程逻辑器件GAL16V8实现译码功能,用GAL优点:
成本低,电路连线少。
本设计选择这个方案来实现译码功能。
a)键盘模块
方案一 用8255 12个口直接接按键,此方法成本高,不使用行列法,浪费端口,如用行列法只用7个端口。
方案二 使用2个74LS273或74LS373控制键盘,其中一个控制行,273反向从键盘中读数据,另一个控制列选,273正向向键盘发数据。
方案三使用7281芯片同时控制键盘和数码,7281通过串行口和总线通信,端口使用少,且操作方便。
方案四PC0~4,PB0~4分别控制16个按键。
由于本模块技术已经成熟,在应用中广泛使用,所以本设计选择此方案来实现。
c)LED数码管显示模块
方案一 74LS138一片,ULN2803A一片和74HC573一片,来实现显示,74LS138译
码送UNL2083A通过UNL2083A控制位,通过74HC573控制数据,本方案,成本较高,要单片机中有使用比较多。
方案二 使用一片8255A控制两个74HC573和一个正相驱动器74LS07和一个反相驱
动器74LS06分别控制4个LED位选和编码数据传输。
此方案用到了8255A由于模块②中用到的8255A3个口都以使用,再用一个8255A成本比较高。
方案三 通过一个片信号,两个74HC373和一个正相驱动器74LS06和一个反相驱动
器74LS07分别控制3个LED位选和编码数据传输。
此方案成本低,但是软件实现的点复杂。
方案四 使用4个74HC373和控制4个LED编码数据,用8255A PC高位和总线片选信号控制数据输入位选,由于是静态显示,一般用于1个或2个数码管的显示。
方案五 使用4个74LS164,通过串行移位来实现LED显示。
成本不高,使用端口少,可以直接通过8255PC7和PB7口,一个做为移位控制,一个送数据。
本设计使用此方案
d)步进电机驱动模块
方案一 使用4N25光电耦合,隔离步进电机和控制电路的电源,保护电源。
使用达林顿管做为驱动。
方案二 使用TIP521光电耦合,隔离步进电机和控制电路的电源,并使用三极管9013进行驱动。
这里用此方案。
e)步进电机模块
方案一
方案二 实现判断键按下的先后。
本设计使用此方案
㈠硬件方案论证
1译码驱动电路
译码驱动电路如图001所示,有一片GAL16V8芯片和一片74F245芯片组成。
其中GAL16V8用于译码,在其内部烧入软件,如图把A2~A9接入并译码成/y0、,/y0做为片选信号地,细详地址编码如下表
二进制地址
十六进制地址
/y0(8255)
10 0000 00××
200~203
74F245芯片用于驱动,由于总线数据信号和各芯片数信号弱,驱动能力差,所以必须在8根总线数据线和各芯片数据线之间加一个双向驱动器74F245。
74F245芯片用于总线和外扩芯片间数据交换时74F245芯片有效,/G为低电平有效,/G连接GAL,/gg端口通过A5A6
A7A8A9,IOW,IOR,AEN来控制,当符合/GG=A9*/A8*/A7*/A6*/A5*/IOR*/AEN+A9*/A8*/
A7*/A6*/A5*/IOW*/AEN这一公式,那么19端口输出为低,74F245允许数据并加强信号。
IOR、IOW也通过GAL16V8进行信号驱动加强。
译码驱动电路如下:
2、8255控制键盘模块
8255控制键盘,在技术上的已经非常成熟,在这里设计为行列描法对键盘进行控制。
其
中PC0、PC1、PC2、PC3控制行选,PC4、PC5、PC6控制列选。
当列选中一列发出0信号时,三行读数据,如有键按下,相应行的电压为0V,即读数为“0”。
反之,无按下那么三位读都为“1”。
键盘编码从第一行到第三行为0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F
3、8255LED显示模块
如图所示,下图为发光二极管控制电路,用于标志,任务号
74LS164为移位寄存器,当CLK来一个正脉冲74LS164移位一次,即我们要给8*4个脉冲信号,并在一次脉冲前给在PC7给出相应的“0”或“1”,在164和数码管之间加一个500欧的限流电阻。
这里设计为阳极数据管。
PC7控制CLK,PC6控制移位补充位。
4、步电机驱动模块
8255PA控制四相电机的数据,并通过74LS373锁存,PB0控制74LS373数据是否可以通过。
当PB0为高电平时,74LS373数据可以通过,并送出相应的数据。
使用TIP521光电耦合,隔离步进电机和控制电路的电源,并使用三极管9013进行驱动,达到四相电机的驱动电流。
5、步进电机模块
步进电动机的工作原理及运用
步进电动机的励磁方式可分为全部励磁及半步励磁。
其中全部励磁又有1相励磁及2相励磁之分,而半步励磁又称为1-2相磁。
图为步进电动机的控制等效电路,适应控制A、B、/A、/B的励磁信号,即可控制步进电动机的转动。
每输出一个脉冲信号,步进电动机只走一步。
因此,依序不断送出脉冲信号,即可步进电动机连续转动。
分述如下:
(1)1相励磁法:
在每一瞬间只有一个线圈导通。
消耗电力小,精确度良好,但转矩小,振动较大,每送一励磁信号可走1.8度。
若以1相励磁法控制步进电动机正转,其励磁顺序如图所示。
若励磁信号反向传送,则步进电动机反转。
励磁顺序:
A->B->C->D->A
SETP
A
B
C
D
1
1
0
0
0
2
0
1
0
0
3
0
0
1
0
4
0
0
0
1
(2)2相励磁法:
在每一瞬间会有两个线圈同时导通。
因其转矩大,振动小,故目前使用最多的励磁方式,每送一励磁信号可走1.8度。
若以2相励磁法控制步进电动机正转,其励磁顺序如图所示。
若励磁信号反向传送,则步进电动机反转。
励磁顺序:
AB->BC->CD->DA->AB
SETP
A
B
C
D
1
1
1
0
0
2
0
1
1
0
3
0
0
1
1
4
1
0
0
1
(3)四相双八拍顺序:
AB->-ABC->BC->BCD->CD->CDA->DA->DAB
SETP
A
B
C
D
1
1
1
0
0
2
1
1
1
0
3
0
1
1
0
4
0
1
1
0
5
0
0
1
1
6
1
0
1
1
7
1
0
0
1
8
1
1
0
1
3、步进电动机的负载转矩与速度成反比,速度愈快负载转矩愈小,当速度快至其极限时,步进电动机不再运转。
所以在每走一步后,程序必须DELAY一段时间。
在这里使用四相八拍步进电机。
(2)、软件方案论证
根据硬件所选的方案,软件共分成6个模块:
①GAL16V8芯片译码电路的编程
②主程序模块,③、初始化模块,④、电机数据设置模块⑤、8255四相电机控制模块⑥
164和LED显示模块⑦ 键盘模块
GAL16V8芯片译码电路的编程源代码:
GAL16V8
ADDRESSDECODER
HZY2005-07-12
DECODER
NCA9A8A7A6A5A4A3A2GND
NCGGIOWoutIORoutY1Y0AENIOWIORVCC
/Y0=A9*/A8*/A7*/A6*/A5*/A4*/A3*/A2*/IOR*/AEN+A9*/A8*/A7*/A6*/A5*/A4*/A3*/A2*/IOW*/AEN
/Y1=A9*/A8*/A7*/A6*/A5*/A4*/A3*A2*/IOR*/AEN+A9*/A8*/A7*/A6*/A5*/A4*/A3*A2*/IOW*/AEN
/IOWout=/IOW
/IORout=/IOR
/GG=A9*/A8*/A7*/A6*/A5*/IOR*/AEN+A9*/A8*/A7*/A6*/A5*/IOW*/AEN
DESCRIPTION
地址编码表
二进制地址
十六进制地址
/y0(8255)
10 0000 00××
200~203
/y1(8259)
10000001××
204~207
主程序模块
主程序模块主要实现三大子功能:
⑴对各芯片进行初始化操作
⑵根据硬件的连接和抢答的流程把各个功能模块有序的组织起来
⑶读任务并根据任务向步进电机送电。
电机数据设置模块
以上为设置电机任务流程图,主要是设置转向,步数。
由于人输入的是十进制的,而机器使用16进制计数,所以我们要把十进制转化为十六进制。
在执行任务时,也一样,要把十六进制转化为十进制通过数码管显示。
四相电机八拍正反转动子模块
电机在本系统中,主要是控制方向和控制步数。
主要是通过两子程序来完成,正向八拍子程序和反向八拍子程序,两个子程序没在的区别,主要是送数过程相反,在这里主要以正向程序进行分析。
以下为正转八拍流程图:
LS164和LED显示模块
设计选用LS164做为数码管的控制源,74LS164做为移位锁存驱动芯片,是8位串行输入并行输出,并行口直接与数码管相连,这里有4个数码管,用4个164,所以显示需改变,要重新移位送数4*8个。
键盘模块
本方案使用4*4键盘,并过8255控制,其中PC0-4控制行,PB0-4控制列。
在需要按键时
不断的扫描行(该行送0),并读PB口,如有位为“0”那么可通过送0位和读0位判断是哪个键按下,并将键值送入键盘缓冲区。
调试分析:
在设计过程中,不管在硬件设计和软件设计过程中,需要一步一步,全面的设
计不能想到点做一点,要全面的考虑。
如在硬件布局中,不能拿到芯片就向往上焊,需要先设计整体布整图在焊接。
GAL调试
出现的问题:
在*.lst文件中的GAL管脚图中,发现10管脚不为GND,为A2
原因:
在写程序时,多写了一个A6,使GAL出错
经验总结:
以前地认为类似这种错误,在编译时会自动找到,会有出错提示,
有思维定式,所以以后写程序时,要注意尽量少出现类似的低级错误。
显示模块调试
出现的问题:
在上电调试时,发现显示出错,从0到F显示乱码,只控制全灭和全亮。
原因查找思路:
①可能是LEDTB出错,少写,移位或者把阳极编码写成阴极编码。
②硬件电路出错,移位输入口AB接错。
③显示子程序出错,在控制4*8次移位时出错多移或少移。
④8255控制出错
原因:
为①LED编码表出错,由于设计硬件使用右移方式,即从DP,G移到A,但是LEDTB中从高到低为G到A,右移时先移A,所以软硬件不统一,导致,显示出错。
经验总结:
设行时思路要清楚,软硬件要统一。
再仔细察一次。
出现问题:
光电耦合送1,送0,输出都为高。
原因查找思路:
①输入输出接地线出错
②输出上拉是阻过小
原因:
用万用表查得,TIP521已烧掉,此时发现输入输出的限流电阻太小只有200欧,电流太大。
解决方案:
限流电阻使用1K电阻
经验总结:
设行时,要全面的考虑,要很好考虑上拉限流,防止出错。
附页
作品实物图:
源代码:
;---步进电机自动控制系统-------------------------------------------
;----向端口送数宏---------------------------------------------------------
wpmacroport,dat
movdx,port
moval,dat
outdx,al
endm
;---读端口宏-------------------------------------------------------------
rpmacroport
movdx,port
inal,dx
endm
;---屏幕显示字符串宏-----------------------------------------------------
infomacroport
movah,09h
leadx,port
int21h
endm
;----延时宏---------------------------------------------------------------
delaymacroport,dat
pushcx
pushax
movdx,port
movcx,dat
movah,86h
int15h
popax
popcx
endm
;------------------------------------------------------------------------------datasegment
c8255_ctlequ203h;8255控制口
c8255_aequ200h;8255A口
c8255_bequ201h;8255B口
c8255_cequ202h;8255c口
pstb1db05h,15h,14h,54h,50h,51h,41h,45h;四相双八拍正向加电代码
pstb2db45h,41h,51h,50h,54h,14h,15h,05h;四相双八拍反向加电代码
pslongdb08h;表示加电方式八相
steplongdw0000h,0000h,0000h,0000h,0000h;走的步数
step1db00h;键盘输入时百位
step2db00h;键盘输入时十位
step3db00h;键盘输入时个位
stepdw0000h
directdb5dup(0ah);旋转方向,0a为正向,0b为反向
dirdb0ah;
findb00h;一次任务是否完成标志位,00是未完成,01为完成
keytbdb0ffh;键盘输入存储区
playtbdb4dup(00h);显示缓存存放0到11h,10为全灭,11为全亮,4个数码管
dptbdb4dup(00h);存放playtb转换过来的LED编码
Ctbdb0feh,00h,0fdh,00h,0fbh,00h,0f7h,00h,0efh
Ctb1db0feh,0fdh,0fbh,0f7h,0efh;LED发光二极373输出代码
LEDtbdb003h,09fh,025h,00dh,099h,049h,041h,01fh;
db001h,009h,011h,0c1h,063h,085h,061h,071h,0ffh,00h;---------0ff为全灭,11为全亮
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
callinit;初始化
main:
callsetdata;设置电机数据
movdi,00h
movsi,00h
runbegin:
wp204h,ctb1[si]
wpc8255_ctl,00001011b;PC5=0关373
movax,steplong[di];读第di个任务步数
;wp204h,ctb[di]
movstep,ax
cmpstep,0000h;如果步数为0,执行下一个任务
jerunnext
moval,direct[si];读第di个任务的转向,并存入显示区
movdir,al
movplaytb+3,al
cmpdir,0ah
jerun1;是否正转
cmpdir,0bh
jerun2;是否反转
run1:
callmove1;正转操作
cmpfin,00h
jerun1
jmprunnext
run2:
callmove2;反转操作
cmpfin,00h
jerun2
jmprunnext
runnext:
incdi
incdi
incsi
cmpdi,09h
jagoon
jmprunbegin
goon:
movplaytb+2,0eh;
movplaytb+1,0eh;
movplaytb,0eh;
movplaytb+3,0eh;显示E
calldisplay
delay0a000h,0h;延时0.005s
movplaytb+2,0fh;
movplaytb+1,0fh;
movplaytb,0fh;
movplaytb+3,0fh;显示F
calldisplay
delay0a000h,0h;延时0.005s
callsound
callkeyset
cmpkeytb,0eh
jneexit1
jmpmain;如果按下E继续
exit1:
cmpkeytb,0fh
jnegoon;如果按下F退出系统
exit:
movplaytb+3,10h
movplaytb,10h
movplaytb+2,10h
movplaytb+1,10h
calldisplay
movah,4ch;返回DOS
int21h;返DOS
;----初始化子程序---------------------------------------------
initproc
wpc8255_ctl,10000010b;8255PA,PC输出,PB输入
wpc8255_c,0ffh
wpc8255_ctl,00001010b;PC5=0关373
wpc8255_ctl,00001110b;pc7=0关ls164
ret
initendp
;--初始化子程序-------------------------------------------
;--电机数据设置子程序-------------------------------------
setdataproc
pushsi
pushax
pushdx
pushcx
movdirect,0ah
movdirect+1,0ah
movdirect+2,0ah
movdirect+3,0ah
movdirect+4,0ah
setst:
movsi,00h;第几个任务
movdi,00h
set:
wp204h,ctb[si]
movplaytb+2,00h;设置步数百位00
movplaytb+1,00h;设置步数十位0
movplaytb,00h;设置步数个位
set1:
moval,step1
movplaytb+2,al;设置步数百位
moval,step2
movplaytb+1,al;设置步数十位
moval,step3
movplaytb,al;设置步数个位0
moval,direct[di];设置正转反转
movplaytb+3,al;设置正转反转0a
calldisplay
delay0a000h,0h;延时0.005s
movplaytb+3,010h;设置正转反转全亮全灭
calldisplay
delay0a000h,0h;延时0.005s
callkeyset
cmpkeytb,0eh;是否确定
jneset10
jmpsetok
set10:
cmpkeytb,0ah;是否为正转
jeset2
cmpkeytb,0bh;是否为反转
jeset3;
cmpkeytb,0dh;是否设置下一个量
jesetstep1;跳往设置步数百位
jmpset1
set3:
movdirect[di],0bh;反转
movplaytb+3,0bh
jmpsetstep1
set2:
movdirect[di],0ah;正转
movplaytb+3,0ah
setstep1:
moval,step1
movplaytb+2,al;设置步数百位
moval,step2
movplaytb+1,al;设置步数十位
moval,step3
movplaytb,al;设置步数个位0
moval,direct[di];设置正转反转
movplaytb+3,al;设置正转反转0a
calldisplay
delay0a000h,0h;延时0.005s
movplaytb+2,010h;设置步数百位全灭
calldisplay
delay0a000h,0h;延时0.005s
callkeyset
cmpkeytb,0eh;是否确定
jnesetstep11
jmpsetok
setstep11:
cmpkeytb,0ch;设置上一个量
jnesetstep10
jmpset1
setstep10:
cmpkeytb,0dh;设置下一个量
jesetstep2
cmpkeytb,09h
jasetstep1
moval,keytb
movplaytb+2,al
movstep1,al;设置步数百位