设计一种用双89C51作为核心部件进行远程控制的步进电机控制系统Word下载.docx
《设计一种用双89C51作为核心部件进行远程控制的步进电机控制系统Word下载.docx》由会员分享,可在线阅读,更多相关《设计一种用双89C51作为核心部件进行远程控制的步进电机控制系统Word下载.docx(39页珍藏版)》请在冰豆网上搜索。
电源、时钟及复位电路
从机
ULN2003A
数码管
显示电路
步进电机
独立按键
图2-189C51单片机总体设计结构框图
2.2设计思路与方案
对步进电动机的控制接口采用软件控制步进电动机的旋转。
步进电动机的驱动脉冲由89C51单片机的编程来实现,由从机89C51芯片的P3.4、P3.5、P3.6、P3.7发出,驱动步进电动机的A、B、C、D相。
由于步进电机的正常工作电压是12V,故需要用达林顿晶体管驱动芯片驱动。
通过主机89C51芯片的P3口来读取键盘输入的停止、正转、反转、单步正转、单步反转、回到机械零点控制信号,并通过89C51的串行口将控制状态发送至从机,从机接收信号后按照指令控制电动机工作,同时实时将当前位置状态送回主机,主机接收当前位置信号并显示。
2.2.1步进电机正反转的控制
步进电机有四相绕组A、B、C、D以及公共端,当其中某一相绕组通电时在电动机内部形成N-S极,产生磁场,当通电的相发生变化,磁场发生旋转,在磁场的作用下,转子将转动,若步进电机按单-双八拍的方式来工作,则在A、B、C、D相绕组上输入脉冲的顺序为A—AB—B—BC—C—CD—D—DA—A:
此时步进电机沿顺时针方向转动,即正转,若在A、B、C、D各相绕组上依次输入脉冲A—AD—D—DC—C—CB—B—BA—A:
此时步进电机将沿逆时针方向旋转,因此只要控制脉冲输出顺序,就可以控制电机的正、反转。
同时加入了限位值保护,当电机到达限位值时,自动停止运行,确保人身及机械设备的安全。
2.2.2键盘检测
P3口内部集成了上拉电阻,所以只需将每根接口线通过开关接地,检测P3口的电平数据,即可判断出是哪个键被按下,同时执行相对应的操作。
2.2.3串行口通信
单片机的串行口由两个数据缓冲寄存器SBUF和一个输入移位寄存器组成,内部还有一个串行控制寄存器SCON和一个波特率发生器。
接收与发送缓冲寄存器占用同一个地址99H,其名称同样为SBUF。
CPU写SBUF操作,一方面修改发送寄存器,同时启动串行数据发送;
读SBUF操作,就是读接收寄存器,完成数据的接收。
特殊功能寄存器SCON用以存放串行口的控制和状态信息。
根据对其写的控制字决定工作方式,从而决定波特率发生器的时钟源是来自系统时钟还是来自定时器T1。
特殊功能寄存器PCON的最高位SMOD为串行口波特率的倍增控制位。
表2-1串行口的控制寄存器SCON
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
方式选择
多机
控制
串行接收允许/禁止
欲发的第9位
收到的第9位
发送中断有/无
接收中断有/无
SM0,SM1:
为串行口工作方式控制位。
共对应四种工作方式,在本设计中选用方式2:
波特率固定11位异步通信方式,TXD为串行数据的发送端,RXD为串行数据的接收端。
每帧数据为11位:
1个起始位“0”,9个数据位和1个停止位“1”。
发送时,第9个数据位由SCON寄存器的TB8位提供,接收到的第9位数据存放在SCON寄存器的RB8位。
波特率固定为:
波特率=(2SMOD*fOSC)/64
2.2.4动态显示
步进电机当前位置通过串行口发送至主机后,主机处理当前位置信息,并通过四位八段共阳极数码管显示出来,为了节约系统输入输出口资源,输出使用动态显示过程,通过段选和位选达到一次仅使一位数码管亮起,但因为单片机速度极快以及人眼的视觉暂留原理,使人看上去像是四位数码管在同时亮起。
3.系统硬件设计
单片机最小系统或者成为最小应用系统,是指用最少的元件组成的单片机可以工作的系统,对51系列单片机来说,最小系统一般包括:
单片机、复位电路、晶振电路。
本控制系统中包含六个部分:
复位及时钟模块、主控模块、按键模块、通信模块、驱动模块、显示模块。
用按键模块来输入要执行的命令,即正反停,单步运行及复位;
通过主机主控模块及所对应的汇编程序,通过通信模块将命令传送给从机,从机通过驱动模块控制步进电机按照命令运转,并将当前位置通过通信模块传递至主机,主机通过显示模块显示当前位置。
3.1时钟及复位模块
引脚18和19接上一个12MHz的晶振及两个22pF的瓷介电容为单片机提供时钟信号。
单片机RST通过10uF电容接至VCC,实现上电自复位,同时通过按键开关接至VCC,实现运行中手动复位,增加系统可靠性。
图3-1时钟及复位模块电路图
3.2按键模块
按键模块有六个按钮:
停止按钮(STOP)、正转按钮(POS)、反转按钮(NEG)、单步正转(POS_ONE)、单步反转(NEG_ONE),复位(RESET)分别控制电机的停止、正转、反转、单步正转、单步反转、返回机械零点。
分别与AT89C51的P3.2(引脚12)、P3.3(引脚13)、P3.4(引脚14)、P3.5(引脚15)、P3.6(引脚16)、P3.7(引脚17)相连接,另一端都接地。
当按下一个键时,使对应的引脚处产生低电平。
图3-2按键模块电路图
按下不同的按键,从P3口可以得到不同的数值,不同的数值对应不同的键被按下,被按下的键对应位为“0”,未被按下的键对应位为“1”,通过比对数值,可以判断出输入了哪种指令,从而进行相应的处理。
不同按键对应数值如下表
表3-1按键对应数值
按键
STOP
POS
NEG
POS_ONE
NEG_ONE
RESET
P口数据
FB
F7
EF
DF
BF
7F
3.3驱动模块
单片机的驱动电路主要是用ULN2003A芯片来驱动。
ULN2003A芯片是一个7路反相器,即第1到7引脚输入端为低电平时,对应输出端第16到10引脚输出为高电平,反之亦然。
第9引脚COM提供工作电压,本设计中引脚1、2、3、4分别与AT89C51芯片的P3.7、P3.6、P3.5、P3.4口相连接,电动机中间引脚直接与12V电压相接,目的是驱动电动机,使其正常工作。
图3-3步进电机驱动模块电路图
四相八拍式励磁法可以使步进电机运行更加平稳,步进角进一步减小,提高精确度,本设计中使用单极四相电机,采用四相八拍工作方式,励磁表如下
表3-2四相八拍励磁表
励磁顺序:
A—AB—B—BC—C—CD—D—DA—A
顺序
1
2
3
4
5
6
7
8
A
B
C
D
3.4通信模块
串行通信是CPU与外界交换信息的一种基本方式。
单片机应用与工业控制时,往往作为前端机安装在工业现场,远离主机,现场数据采用串行通信方式发往主机进行处理,以降低通信成本,提高通信可靠性。
RS-232C采用的是EIA电平,在TXD和RXD数据线上,逻辑1(MARK)=-3~-15V;
逻辑0(SPACE)=+3~+15V。
很明显,RS-232C的EIA标准是以正负电压来表示逻辑状态的,与TTL以高低电平表示逻辑状态的规定不同,因此,为了能够使主从单片机通过RS-232C串行口通信,并延长通信距离,必须在EIA电平与TTL电平之间进行电平变换。
美国MAXIM公司的MAX232芯片可完成TTL和EIA之间的双向电平转换,MAX232内部有电压倍增电路和转换电路,并可同时进行两路双向转化,功能强大,且只需要单一+5V电源,因此获得广泛应用。
转换后的信号通过RS-232的D型9针连接口输出,最少仅需3根通信线即可进行串行通信,也可购买双绞通讯线进行两机直连,使连接更加方便,并增加通信可靠性。
图3-4MAX232通信模块电路图
3.5显示模块
每个八位数码管需占用8根数据线,为了节约系统资源,本设计选用段选+位选的方式控制一个四位八段共阳极数码管。
共阳极数码管的1、2、3、4位选信号由P1.0~P1.3信号经PNP三极管放大反相后送至位选输入口。
因单片机P0口内部无上拉电阻,故将P0口经过10K的排阻上拉至VCC,P0作为段选数据的输入,送至数码管的段选接口,通过位选选择显示位,通过段选选择显示的数据,可以完成步进电机当前位置的显示。
采用动态显示时需要注意以下3点:
◎由于每一位八段数码管的点亮时间很短,扫描过程中要确保每一位数码管得到足够的工作电流,从而确保亮度,故位选信号经三极管放大并反相后送入数码管。
◎在切换下一位的八段数码管时,应把上一位熄灭,再将下一位显示数据送出,防止显示数据出现残影。
◎点亮一遍所有数码管的时间应尽量小于0.1s,以保证足够短的时间,使眼睛产生各位数码管同时显示的错觉。
图3-5四位八段数码管显示模块电路图
4.系统软件设计
根据实际需要和设计要求,系统软件部分设计主要可分为:
主机:
键盘扫描程序,显示程序,发送程序,接收程序。
从机:
接收程序,步进电机控制程序,发送程序。
4.1主机程序设计
主机,作为人机交互的设备,承担着接收命令,将命令发送给从机,接收从机返回的数据,显示数据,任务繁重。
为了确保数码管显示的连续性,主机上电初始化后循环调用显示子程序和键盘扫描程序,一旦检测到有键被按下,即进行判断与存储键值,并将此值发送至从机,随后返回主程序,重复显示与检测键盘。
接收程序选择中断的形式进行,一旦有数据被接收,即触发串行通信中断,将从机发来的数据进行处理,将8位二进制数转化为有符号十进制数据,并刷新显示内存,在下一个显示周期中即被显示出来,此法仅需处理一次数据,不需要在每次显示时进行运算,加快了处理速度,节约了系统资源。
主机运行流程图如下所示:
Y
N
图4-1主机程序流程图
4.1.1显示子程序
因为采用扫描显示,主程序需要逐个将显示内存的数据输送至P0口,配合P1的位选,进行扫描显示
MOVDPTR,#TABLE;
将DPTR指向显示表首地址
DISPLAY:
;
显示子程序
JB0D5H,TWO;
如果0D5H为1,即正数,则直接显示第二
位,不显示符号
ONE:
第一位(符号位)
MOVA,#0AH;
将A赋值为0AF,即指向表中的负号位
MOVCA,@A+DPTR;
变址寻址,将显示数据存入A
MOVP0,A;
将显示数据送至P0口
CLR90H;
90H清零,即第一位送低电平,经PNP三
极管反相后,即选中第一位数码管
CALLDELAY;
调用延时,保留显示1ms
SETB90H;
90H置1,关闭显示
MOVP0,#0FFH;
P0口送0FFH,保证数码管全灭
TWO:
MOVA,21H;
将21H中的数据存入ACC,即百位
MOVP0,A;
CLR91H;
91H清零,即第二位送低电平,经PNP三
极管反相后,即选中第二位数码管
SETB91H;
91H置1,关闭显示
THREE:
MOVA,22H;
将22H中的数据存入ACC,即十位
CLR92H;
92H清零,即第三位送低电平,经PNP三
极管反相后,即选中第三位数码管
SETB92H;
92H置1,关闭显示
FOUR:
MOVA,23H;
将23H中的数据存入ACC,即个位
CLR93H;
93H清零,即第三位送低电平,经PNP三
SETB93H;
93H置1,关闭显示
RET
DELAY:
MOVR6,#2;
12M晶振延时1ms
D1:
MOVR7,#248
DJNZR7,$
DJNZR6,D1
TABLE:
;
数据表分别为共阳极数码管显示0~9和负
号的数据
DB0C0H,0F9H,0A4H,0B0H,099H
DB092H,082H,0F8H,080H,090H,0BFH
4.1.2按键扫描处理子程序
单片机读取按键并与上一个发送的键值比对,如果一致则不发送,保证了按一次键仅发送一次,避免了重复发送造成单片机进入死循环。
CAL:
转化并判断是否有键被按下,如果有,则
发送数据,如果没有继续初始化
MOVA,P3;
读取按键
ANLA,#0FCH;
保存高六位数据
COMPARE:
CJNEA,30H,SAVE;
与上一个按键比对,如果不一致,跳转至
SAVE子程序
SJMPSTART;
如果与上一个按键一致,返回START
SAVE:
MOV30H,A;
将A中的数据存入30H
CJNEA,#0FCH,SEND;
如果A中数据不为0FCH,即有键被按下,
跳转至发送子程序
如果A中数据为0FCH,即无键被按下,
返回主程序
SEND:
发送数据(没有通信协议)
CALLSEND_DELAY;
调用延时子程序
MOVA,30H;
将当前键值送入A
MOVSBUF,A;
将当前键值送入SBUF,单片机自动发送
JMPSTART;
返回至主程序
SEND_DELAY:
;
12M晶振时延时0.1ms
MOVR5,#19H
DL1:
NOP
DJNZR5,DL1
4.1.3中断与计算子程序
当单片机收到串行口中断时,自动寻找中断程序入口地址0023H,随后跳转至ANALY子程序,进行中断的判断,如果是发送中断,则清TI并返回到断点,如果是接收中断,则响应中断,清RI并将SBUF中的数据保存,同时将8位二进制数据转换为3位有符号十进制数据,刷新显示内存,刷新后的数据将在下一个显示周期被显示出来。
ORG0023H;
串行口中断程序入口跳转
JMPANALY
ANALY:
;
中断分析程序
JBTI,CLRTI;
如果是发送中断,跳转至CLRTI
JBRI,RECEIVE;
如果是接收中断,跳至RECEIVE
RETI;
中断返回
CLRTI:
CLRTI;
发送中断,清TI
JMPANALY;
返回中断分析程序
RECEIVE:
CLRRI;
接收中断,清RI,处理中断请求
MOVA,SBUF;
将SBUF中的数据读取至ACC
MOV20H,A;
将返回的当前位置存至20H
CPLA;
将A中的值取反,在八位LED上显示
MOVP2,A;
将取反后的当前位置值显示在八位LED上
JB07H,POS;
若当前位置首位为1,即正数,跳至POS
SJMPNEG;
否则当前位置首位为0,即负数,跳至NEG
POS:
SETB0D5H;
将标志位0D5H置1,表明数据为正数
CALLCALCULATION;
调用计算子程序
跳回中断分析程序
NEG:
CLR0D5H;
将标志位0D5H清0,表明数据为负数
MOVA,20H;
将当前位置值放入A
CLRCY;
清CY,为计算减法做准备
SUBBA,#1;
当前位置减1
JBCY,NEG_OVER;
判断是否溢出,如果溢出,说明当前位置
为下限,即-128
CPLA;
如果未溢出,说明数据正常,对A取反,
得到其绝对值
将当前位置的绝对值存入20H,符号位在
0D5H
调用计算子程序,将8位二进制数转化为3
位二进制数
NEG_OVER:
;
当前位置-1溢出,说明为00H,即-128,
将128分别放入对应的显示内存
MOV21H,#1
MOV22H,#2
MOV23H,#8
JMPANALY
CALCULATION:
;
计算子程序,将8位二进制转化为3位十
进制
将当前位置放入ACC
ANLA,#7FH;
去除符号位,准备进行运算
存回20H
MOVA,#100;
将#100放入B中,作为除数
MOVB,A
MOVA,20H;
将20H放入A中,作为被除数
DIVAB;
进行除法运算
MOV21H,A;
将商放入21H即百位
MOVA,B;
将余数放入22H暂时存储,准备下次运算
MOV22H,A
MOVA,#10;
将#10放入B中,作为除数
MOVB,A
MOVA,22H;
将上次运算的商放入ACC,作为被除数
DIVAB;
MOV22H,A;
将商放入22H即十位
MOVA,B
MOV23H,A;
将余数放入23H即个位
4.2从机程序设计
从机远离主机,双单片机通过串行通信方式进行通信,以提高通信可靠性,降低通信成本。
因此从机需要通过串行口获取指令,控制步进电机,并将当前位置实时传递至主机。
从机上电初始化后重复检测是否有指令被送入内存,如果有,则通过调用相关子程序控制步进电机运动,每运行一步都会将当前位置送回主机。
从机还