盐城工学院毕业设计
图2.2-4 光电编码器输出脉冲的鉴相及其计数
2.2.4用单片机内部计数器实现可逆计数
对以上两种计数方法进行分析可知,用纯软件计数虽然电路简单,但是计数速度慢,难以满足实时性要求,而且容易出错,用外接加减计数芯片的方法,虽然速度快,但硬件电路复杂,由图4 可以看出,要制作一个12 位计数器需要5 个外围芯片,成本较高。我们可以用单片机内部的计数器来实现加减计数。单片机8051 片内有2 个16 位定时器(定时器0 和定时器1) ,单片机8052 还有一个定时器(定时器2) ,这3 个定时器都可以作为计数器使用。但单片机8051 内部的计数器是加1 计数器,所以不能直接应用,必须经过适当的软件编程来实现其“减”计数功能。硬件电路如图5所示。
盐城工学院毕业设计
图2.2-5 单片机内部计数器加减计数的硬件结构
我们可以把经过D触发器之后的脉冲,即方向控制脉冲(DIR)接到单片机的外部中断INT0端,同时经过反向器后再接到另一个外部中断INT1,并且把计数脉冲A接到单片机的片内计数器T0端即可,相对外部计数芯片来说,使用这种方法电路相对要简单的多。系统工作时,先要把两个中断设置成下降沿触发,并打开相应的中断。当方向判别脉冲(DIR)由低—高跳变时,INT1中断,执行相应的中断程序,进行加计数;而当方向判别脉冲由高—低跳变时,INT0中断,执行相应的中断程序,进行“减”计数(实际是重新复值,进行加计数)。下面是软件编程思路(在C语言环境下来实现计数功能):
#include int data k=1;
void service_int0() interrupt 0 using 0 { k-- ;/*标志位减1*/ TR0=0 ;/*停止计数*/ TH0= -TH0 ;
TL0= -TL0 ;/*把计数器重新复值,此时相当于减计数*/ TR0=1 ;/*开始计数*/ }
void service_int1() interrupt 2 using 1 { k++ ;/*标志位加1*/ TR0=0 ;/*停止计数*/ TH0= -TH0 ;
TL0= -TL0 ;/*把计数器重新复值,此时相当于加计数*/
盐城工学院毕业设计
TR0=1 ;/*开始计数*/ }
void timer0(void) interrup 1 using2 { if(k=0) /*反向计数满*/ else if(k=1) /*计数为0*/ else
/*正向计数满*/ }
void main(void)
{TCON=0X05 ;/*设置下降沿中断*/ TMOD=0X05 ;/*T0为16位计数方式*/ IE=0X87 ;/*开中断*/ TH0=0 ;
TL0=0 ;/*预置初值*/ }
此方法采用中断的形式进行计数,硬件电路比较简单,程序也不复杂,执行速度较快。
以上分别介绍了利用软件、外接计数芯片及单片机内部计数器实现对编码器输出脉冲进行计数的方法。利用软件计数,硬件电路简单,但占用了较多的CPU 资源,执行速度较慢。利用外接计数芯片的方法计数,计数速度较快,但要用较多的外围芯片,硬件电路复杂。利用单片机内部计数器实现加减计数,在编码器旋转方向不频繁改变的情况下,计数速度很快,而且外围电路简单,编程也不复杂,只是占用了2 个外部中断和1 个内部计数器。
综上所述选用第三种计数方法,即利用单片机内部计数器实现可逆计数。
2.3 位移测量参数及电路参数分析
在本设计的仿真中,光电编码器产生的A,B相方波用PROTUES中的信号源加不同的起始时间来模拟。一个用原始的,还有一个用延时1/4周期。方向时将两个信号调换就行了。
2.3.1MCS-51的定时器/计数器简介
2个16位的定时/计数器,有多种工作方式。
定时/计数器工作在定时模式时,计数脉冲信号来自单片机的内部,计数速
盐城工学院毕业设计
率是晶振频率的1/12,当计数器启动后,每个机器周期计数器自动加1。 定时/计数器工作在计数模式时,计数器对外部脉冲进行计数,计数器计P3.4(T0脚)P3.5(T1脚)负跳变次数。每产生一次负跳变,计数器自动加1。 如图2.3-1及表2.3-1
图2.3-1 TMOD寄存器用于定时/计数的操作方式及工作模式指令格式
表2.3-1操作方式选择位
0 0 0 0 0 1 1 0 1 1
工作方式
0 1 2 3
说 明
13位定时器/计数器,由TL0低五位和TH0高八位组成 16位定时器/计数器,由TL0低八位和TH0高八位组成 8位定时器/计数器,由TL0低八位组成
TL0低八位和TH0高八位分别位8位定时器/计数器
2.3.2定时器模式选择位
C/T=0,定时器模式,每一个机器周期计数器自动加1。
C/T=1,计数器模式,在单片机T0引脚上每发生一次负跳变,计数器自动加1。 GATE=0,定时/计数器工作不受外部控制。
GATE=1,定时/计数器T0的起停受INT0引脚的控制。 1.计算计数初始值 设计数初始值为X:
X=216-td/Tm=216-13105/1=15535
因为系统的晶振频率为fosc=12MHz,则机器周期Tm=12/fosc=1μs。
盐城工学院毕业设计
则(TH0)=00111100B=3CH,(TL0)=10101111B=AFH 2.设置工作方式
方式0:M1M0=01; 定时器模式:C/T=1; 定时/计数器启动不受外部控制: GATE=0; 因此,(TMOD)=05H。
关于测速电路的参数,本次设计采用了如下方案:
AT89C51单片机属于CMOS型8位单片机,其在片内的振荡器电路由晶体控制的单极线性反相器组成,同HMOS型所用方法一样,要求用晶体控制的感性阻抗方波振荡器,但也存在一些差别,其一为89C51可在软件的控制下关闭振荡器,其二为89C51的内部时钟电路由XTAL2引脚上的信号来驱动。本次设计中的振荡器可用晶体作为感性电抗与外部电容组成并联共振槽路。晶体的特性与电容值的大小(C1、C2)并不严格,高质量的晶体对任何频率都可取用30pF的电容,对于廉价应用中,可采用陶瓷共振器,这时C1、C2一般取47pF;这里选取频率12MHZ晶振,电容C1、C2为30pF。看门狗电路电路参见图2.3-2
图2.3-2 MAX813L看门狗电路
图中,电阻R1和R2分压产生1.25V电源门限值。当此脚的电压低于1.25V时,即电源电压低于额定值时,PFO将产生一个脉冲信号,可以用于向CPU发出中断申请,使CPU完成应急处理。此功能可完成电源电压的监测。 P1.0喂狗信号,在软件的编制中通过对P1.0的位操作向MAX813L的看门狗输入端输入一个负脉冲。如果程序出现“跑飞”现象,程序将不能正常运行,这个定时发出的脉冲也得不到保障。当单片机超过1.6秒未向MAX813L的看门狗输入端发脉冲信号,MAX813L内部的定时器将会强制将WDO拉到低电平,这个低电平通过MR产生复位信号。单片机复位后从初始状态开始运行,从而保证系统的可靠性,起到了看门狗的作用。此电路同时兼有上电复位和按键复位功能。